概览
kata containers是由OpenStack基金会管理,但独立于OpenStack项目之外的容器项目。kata containers整合了Intel的 Clear Containers 和 Hyper.sh 的 runV,能够支持不同平台的硬件 (x86-64,arm等),并符合OCI(Open Container Initiative)规范,同时还可以兼容k8s的 CRI(Container Runtime Interface)接口规范。项目包含几个配套组件,即Runtime,Agent, Proxy,Shim等。项目已于6月份release了1.0版本。
    从docker架构上看,kata-container和原来的runc是平级的。大家知道docker只是管理容器生命周期的框架,真正启动容器最早用的是LXC,然后是runc,现在也可以换成kata了。所以说kata-container可以当做docker的一个插件,启动kata-container可以通过docker命令。Kata最大的亮点是解决了传统容器共享内核的安全和隔离问题,办法是让每个容器运行在一个轻量级的虚拟机中,使用单独的内核。

hypervisor
首先,Hypervisor启动用于容器运行的虚拟机,虚拟机包含一个极简的guest kernel和guest image。
目前1.0只支持QEMU/KVM创建虚拟机。然后在虚拟机内部真正起我们想要的容器。如果你熟悉KVM的原理,很快就能理解下面这张图。

1、Guest kernel
用于启动VM。Kata-container高度优化了内核启动时间和极小的内存占用,只用于一个容器的运行。
2、Guest image
包含了initrd和rootfs
3、Root filesystem image
Mini-OS,基于Clear Linux的高度优化的容器启动微系统,只运行了init进程(systemd)和agent,真正的工作负载跟runc一样,由libcontainer创建。

比如说,执行Docker run –ti Ubuntu date命令时
1、Hypervisor使用guest kernel启动一个mini-OS镜像
2、运行在Mini-OS上下文的systemd会启动kata-agent
3、Agent会创建一个用于运行指定的命令(date)的新上下文
4、agent先设置ubuntu的根文件系统,然后在新的上下文里执行date

社区提供了osBuilder组件专门用于镜像的制作。跟openstack的ironic有点像。

内部组件
接下来介绍下kata-container的四个组件,正式介绍之前,先建立一个认知,只有agent是运行在上文提到的mini-OS里的。Runtime、proxy和shim是运行在宿主机上的。每创建一个容器就会创建一个proxy、agent和shim,而runtime只有一个。
Agent
Kata-agent是运行在guest中,管理容器和处理容器的运行。Kata-agent的执行单元是定义了一系列命名空间的沙盒。每个VM可以运行多个容器,支持k8s一个pod运行多个容器的需求。不过目前docker中,kata-runtime只能一个pod一个容器。Kata-agent通过gRPC和其他kata组件通信。Kata-agent使用libcontainer管理容器的生命周期,也就复用了runc的大部分代码。
Runtime
kata-runtime是一个OCI兼容的容器运行时,负责处理OCI运行时规范指定的所有命令并启动kata-shim实例。

Kata-runtime的配置文件是/usr/share/defaults/kata-containers/configuration.toml,可以根据实际需求修改,以下摘取了一部分参数:
[hypervisor.qemu]
path = "/usr/bin/qemu-lite-system-x86_64"
kernel = "/usr/share/kata-containers/vmlinuz.container"
initrd = "/usr/share/kata-containers/kata-containers-initrd.img"
machine_type = "pc"
kernel_params = ""
firmware = ""
machine_accelerators=""
default_vcpus = 1
default_maxvcpus = 0
default_bridges = 1
block_device_driver = "virtio-scsi"
[proxy.kata]
path = "/usr/libexec/kata-containers/kata-proxy"
[shim.kata]
path = "/usr/libexec/kata-containers/kata-shim"
[runtime]
internetworking_model="macvtap"

比较重要的参数有:
machine_type,机器类型,kata-container支持多种机器类型,x86上的pc、q35,ARM的virt,IBM Power的pseries。默认是pc。
internetworking_model,VM和container之间的连接方式,除了macvtap,也可以配置从bridge。但bridge不能工作在macvlan和ipvlan的场景下。
Proxy
默认使用virtio-serial和VM通信,内核版本高于4.8可以使用vsock,一种虚拟的套接字。VM可以运行多个容器进程。在使用virtio-serial的情况下,与每个进程相关联的I/O流需要在主机上多路复用和解复用。
Kata-proxy给多个kata-shim和kata-runtime客户端提供对kata-agent提供访问,它的主要作用是在每个kata-shim和kata-agent之间路由I/O流和信号。Kata-proxy连接到kata-agent的unix域套接字上,这个套接字是kata-proxy启动时kata-runtime提供的。
Shim
一个容器处理能够像docker的containerd-shim一样处理响应,前提是可以监控容器进程。runtime运行在宿主机上,不能直接监控运行在虚拟机里的进程,最多只能看到QEMU进程。所以对kata-container来说,kata-shim扮演了监控容器进程的角色。Kata-shim需要处理容器的所有I/O流,包括stdout、stdin和stderr,以及转发所有的要发送出去的信号。
Kata-shim还有其他功能:
通过一个UNIX域套接字连接到kata-proxy。这个套接字在kata-runtime启动kata-shim的时候,由kata-runtime传给kata-shim,同时带上了containerID和execID,两个ID用来识别shim管理的是哪个容器。
读取来自VM内部容器进程的输出流和错误流
使用SignalProcessRequest API转发从reaper到kata-proxy的信号
监控终端修改,并使用grpc TtyWinResize API转发到kata-proxy

命令实现
分别讲解下docker常用的create、start、exec、kill、delete命令在kata-contailer的实现。Docker的这些操作最终也是转化成kata-container相应的操作。
creat
执行docker create时,kata-runtime做了些什么?
1、创建一个沙盒,沙盒的作用是创建网络命名空间,启动虚拟机和shim进程
2、调用pre-start钩子,负责在主机网络命名空间和刚才创建的网络命名空间之间,创建veth pair
3、扫描网络空间的网络,在veth和vm的tap设备之间创建MACVTAP连接
4、通过创建好的tap设备,在网络命名空间启动vm
5、等待vm运行
6、启动kata-proxy,连接到VM。Kata-proxy进程代理所有和VM的通信。每个VM一个代理
7、通过Kata-proxy和kata-agent通信,配置VM内部的沙盒
8、依赖于OCI配置文件config.json,和kata-agent通信创建容器
9、启动kata-shim,会连接到kata-proxy提供的gRPC服务。Kata-shim会启动一些go协程并行地以阻塞方式调用ReadStdout()、ReadStderr()、WaitProcess()方法。ReadStdout()、ReadStderr()死循环运行直至容器退出。WaitProcess只在容器退出时调用,并返回退出原因。
 
Start
使用runc时,docker start就是在自己的命名空间里运行一个容器进程。Kata-container来说,kata-runtime主要的任务是让VM里的kata-agent启动容器。
1、通过kata-proxy和kata-agent通信,在VM里启动容器负载,比如启动的命令是Docker run –ti Ubuntu top,kata-shim的ReadStdOut会返回top的输出,WatiProcess()会继续阻塞直到top进程退出。
2、调用post-start钩子,1.0版本是个空函数
 
Exec
请求通过kata-proxy发送到kata-agent,在虚拟机的容器里,启动一个新的kata-shim进程。当你执行docker exec命令时通过ps就能发现多了一个shim进程。
2、这个新的kata-shim在原来的kata-shim的网络命名空间和PID命名空间里被创建,用于exec。
 
Kill
发送kill命令,kata-runtime发送一个UNIX信号给容器进程,kill发送终止信号,比如SIGKILL或者SIGTERM来终止容器进程。以前只是停止容器,对kata-runtime来说需要容器和虚拟机一块停止。
1、通过proxy,向kata-agent发送kill请求
2、等待kata-shim退出
3、如果kata-shim超时没有返回,则强制杀死容器进程,也就是向kata-agent发送SIGKILL信号。
4、等待kata-shim退出,还是超时就报错
5、和kata-agent通信,从VM中删除容器配置
6、和kata-agent通信,从VM中删除沙盒的配置
7、停止VM
8、删除网络命名空间里的所有网络配置,删除命名空间
9、执行post-stop钩子

Delete
删除所有容器相关的资源,运行的容器不能被删除,强制删除需要带上—force。
如果沙箱没有停止,但是特定的容器进程已经自己返回,那么kata-runtime将首先执行终止信号所需的大部分步骤。在此过程之后,或者如果沙箱已经停止,则KATA运行时将:
1、移除容器资源。每个文件保存在/var/{lib,run}/virtcontainers/sandboxes/<sandboxID>/<containerID>。
2、删除沙盒资源。每个文件保存在/var/{lib,run}/virtcontainers/sandboxes/<sandboxID>。
此时,与容器相关的所有内容都应该从主机系统中移除。

本文主要讲述kata-container的基本原理,后面再介绍kata-container的网络和存储相关知识以及在k8s里的应用。

kata-container初探相关推荐

  1. Kata Container — Overview

    目录 文章目录 目录 传统容器的安全问题 Kata Container 软件架构 轻量化虚拟机 QEMU Guest Kernel Guest image (rootfs)Root filesyste ...

  2. 容器安全拾遗 - Rootless Container初探

    近期Docker 19.03中发布了一个重要的特性 "Rootless Container支持".趁着五一假期,快速验证一下.本文参考了Experimenting with Roo ...

  3. Kubernetes + CRI + Kata + Firecracker

    Kata Kata源自希腊文Καταπίστευμα(ka-ta-PI-stev-ma),原意是值得信任的人,kata container正是解容器安全的问题而诞生的.传统的容器是基于namespac ...

  4. 基于 Kata Containers 与 iSulad 的云容器实践解析

    在 4 月 9 号结束的 OpenStack 基金会董事会议上,董事们投票批准了 Kata Containers 成为基金会旗下第一个新的顶级开放基础设施(Open Infrastructure)项目 ...

  5. 最新容器项目 Kata 曝光

    2019独角兽企业重金招聘Python工程师标准>>> Kata Containers设计为硬件无关,与Open Container Initiative(OCI)标准.Kubern ...

  6. Kata Containers及相关vmm介绍

    Kata Containers介绍 Kata Containers 是轻量级虚拟机的一种新颖实现,可无缝集成到容器生态系统中. Kata Containers 与容器一样轻巧快速,并与容器管理层集成, ...

  7. 多年锤炼,迈向Kata 3.0 !走进开箱即用的安全容器体验之旅

    一.Kata 的过去 让我们将时钟拨回 2015 年 5 月,Hyper.sh 和 Intel 开源技术中心的工程师们分别独立发布了runV 和 Clear Containers 的虚拟化容器项目,而 ...

  8. 多年锤炼,迈向Kata 3.0 !走进开箱即用的安全容器体验之旅| 龙蜥技术

    文/云原生 SIG(Special Interest Group) 一.Kata 的过去 让我们将时钟拨回 2015 年 5 月,Hyper.sh 和 Intel 开源技术中心的工程师们分别独立发布了 ...

  9. 实用指南:如何在Anolis OS上轻松使用 Kata 安全容器?

    文/云原生SIG 本篇文章我们将详细介绍怎么轻松在 Anolis OS 上使用 Kata Containers 安全容器,我们将介绍 Kata Container 社区于 2022 年 10 月 10 ...

  10. kata cantainer介绍及Ubuntu安装kata cantainer

    kata cantainer介绍 kata cantainer是什么?与docker相比有什么优势? Kata Containers是一种轻量级容器技术,旨在提供与传统虚拟化相当的隔离性和安全性,同时 ...

最新文章

  1. 关于SQL命令中不等号(!=,)
  2. 腾讯林衍凯:图神经网络,考虑「拓扑信息」会怎样?
  3. chapter_2 索引优先队列
  4. 一次Binder通信最大可以传输多大的数据?
  5. [译]BEAST还是一个威胁吗?
  6. 通过poi的XSSF实现生成excel文件
  7. 16.实现多个具有相同方法的接口和父类与实现接口有相同方法
  8. linux bind mysql_linux下安装mysql
  9. 使用 ‘In Place’ 直接从MySQL 5.0升级至5.7
  10. php基础之字符串和数组的相互转换及其常用属性(与js相对应的属性 比较)
  11. 不想买Xbox?没关系,微软正打算让你在电视上也能玩游戏
  12. 新东方的全套英语资料,相当权威版!!!
  13. 【Java】Leetcode LCP03 机器人大冒险
  14. 通过NTP协议进行时间同步
  15. CSS3知识点笔记————基础(五星)
  16. CI/CD——构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台
  17. DBA之路:小小DBA一年工作总结
  18. 第四次作业——个人作业——必应词典软件案例分析
  19. windows上datax的使用记录
  20. 鸿蒙(harmonyOS)应用开发-真机设备API版本查看

热门文章

  1. mysql mybatis批量删除,Mybatis批量删除多表
  2. 电脑DNS被劫持怎么办
  3. LeetCode第82场双周赛
  4. freeradius在AP控制器设备中test-aaa 显示timeout的解决方案
  5. 3.5 计算机网络之介质访问控制(静态划分信道、FDM、TDM、STDM、WDM、CDM)、(动态划分信道、ALOHA、CSMA、CSMA/CD、CSMA/CA)、令牌传递协议
  6. 创业公司中运营人员的典型一天是怎么度过的?
  7. 播布客学习视频_C学习笔记_simple
  8. 【Junit Experiment】Junit 软件质量测试实验--日期格式规范性+字符串格式规范性
  9. 权力来自于他人的服从
  10. KITTI自动驾驶数据集的训练和检测过程(人、车检测案例)、KITTI数据集的TFRecord格式存储、YOLO V3/Yolo V3 Tiny 迁移学习