kata-runtime run mycontainer

# 准备一个busybox镜像
# 构造rootfs
mkdir rootfs
docker export $(docker create busybox) | tar -xf - -C rootfs
# 构造config.json
runc spec
# 使用kata-runtime来运行荣齐全
kata-runtime run mycontainer

root@ubuntu:/home/ubuntu# ps -elf | grep kata
4 S root      4717  1212  0  80   0 - 513121 wait  11:12 pts/0    00:00:00 kata-runtime run mycontainer
7 S root      4741     1  0  80   0 - 763408 sys_po 11:12 ?       00:00:01 /usr/share/kata-containers/binary/qemu-system-aarch64 -name sandbox-mycontainer -uuid 5e486212-9bf8-499b-bd49-9965ca6b3108 -machine virt,usb=off,accel=kvm,gic-version=host,nvdimm -cpu host,pmu=off -qmp unix:/run/vc/vm/mycontainer/qmp.sock,server,nowait -m 2048M,slots=10,maxmem=257176M -device pcie-pci-bridge,bus=pcie.0,id=pcie-bridge-0,addr=2,romfile= -device virtio-serial-pci,disable-modern=false,id=serial0,romfile= -device virtconsole,chardev=charconsole0,id=console0 -chardev socket,id=charconsole0,path=/run/vc/vm/mycontainer/console.sock,server,nowait -device nvdimm,id=nv0,memdev=mem0 -object memory-backend-file,id=mem0,mem-path=/usr/share/kata-containers/binary/kata-containers.img,size=184549376 -device virtio-scsi-pci,id=scsi0,disable-modern=false,romfile= -object rng-random,id=rng0,filename=/dev/urandom -device virtio-rng-pci,rng=rng0,romfile= -device virtserialport,chardev=charch0,id=channel0,name=agent.channel.0 -chardev socket,id=charch0,path=/run/vc/vm/mycontainer/kata.sock,server,nowait -device virtio-9p-pci,disable-modern=false,fsdev=extra-9p-kataShared,mount_tag=kataShared,romfile= -fsdev local,id=extra-9p-kataShared,path=/run/kata-containers/shared/sandboxes/mycontainer/shared,security_model=none -rtc base=utc,driftfix=slew,clock=host -global kvm-pit.lost_tick_policy=discard -vga none -no-user-config -nodefaults -nographic --no-reboot -daemonize -kernel /usr/share/kata-containers/binary/vmlinuz-5.4.34-88 -append console=hvc0 console=hvc1 iommu.passthrough=0 root=/dev/pmem0p1 rootflags=dax,data=ordered,errors=remount-ro ro rootfstype=ext4 debug systemd.show_status=true systemd.log_level=debug panic=1 nr_cpus=64 agent.use_vsock=false systemd.unit=kata-containers.target systemd.mask=systemd-networkd.service systemd.mask=systemd-networkd.socket scsi_mod.scan=none agent.log=debug agent.log=debug -pidfile /run/vc/vm/mycontainer/pid -D /run/vc/vm/mycontainer/qemu.log -smp 1,cores=1,threads=1,sockets=64,maxcpus=64
0 S root      4748  4717  0  80   0 - 324652 futex_ 11:12 ?       00:00:00 /usr/libexec/kata-containers/kata-proxy -listen-socket unix:///run/vc/sbs/mycontainer/proxy.sock -mux-socket /run/vc/vm/mycontainer/kata.sock -sandbox mycontainer -log debug -agent-logs-socket /run/vc/vm/mycontainer/console.sock
0 S root      4763  4717  0  80   0 - 345796 futex_ 11:13 pts/0   00:00:00 /usr/libexec/kata-containers/kata-shim -agent unix:///run/vc/sbs/mycontainer/proxy.sock -container mycontainer -exec-id mycontainer -terminal -log debug
0 S root      4822  1876  0  80   0 -  1097 pipe_w 11:28 pts/2    00:00:00 grep --color=auto kata
root@ubuntu:/home/ubuntu# 

 

root@ubuntu:/home/ubuntu# kata-runtime list
ID            PID         STATUS      BUNDLE                   CREATED                          OWNER
mycontainer   4763        running     /root/docker/container   2020-10-10T03:13:00.964737382Z   #0
root@ubuntu:/home/ubuntu#

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

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

root@ubuntu:/home/ubuntu# ps auxf | grep docker
root      7869  1.0  0.0 1638148 56328 pts/0   Sl+  14:21   0:00          |               \_ docker run --rm -it --runtime kata-runtime busybox
root      8029  0.0  0.0   4388   620 pts/2    S+   14:21   0:00                          \_ grep --color=auto docker
root      7926  0.1  0.0 108220  5992 ?        Sl   14:21   0:00  \_ containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/4e9f5072122614c41960d734e1b977fa882a641a84e8b263ddba1664effe0e6f -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-kata-runtime
root      5084  0.1  0.0 5418376 84464 ?       Ssl  11:51   0:11 /usr/bin/dockerd -D --add-runtime kata-runtime=/usr/local/bin/kata-runtime --default-runtime=runc --storage-driver=overlay2
root@ubuntu:/home/ubuntu# lsof | grep kvm
qemu-syst  7984                   root  mem       REG               0,13                 9285 anon_inode:kvm-vcpu:0 (stat: No such file or directory)
qemu-syst  7984                   root   18u      CHR             10,232       0t0         85 /dev/kvm
qemu-syst  7984                   root   19u  a_inode               0,13         0       9285 kvm-vm
qemu-syst  7984                   root   26u  a_inode               0,13         0       9285 kvm-vcpu:0
qemu-syst  7984                   root   27u  a_inode               0,13         0       9285 kvm-arm-vgic-v3
qemu-syst  7984                   root   28u  a_inode               0,13         0       9285 kvm-arm-vgic-its
qemu-syst  7984  7985             root  mem       REG               0,13                 9285 anon_inode:kvm-vcpu:0 (stat: No such file or directory)
qemu-syst  7984  7985             root   18u      CHR             10,232       0t0         85 /dev/kvm
qemu-syst  7984  7985             root   19u  a_inode               0,13         0       9285 kvm-vm
qemu-syst  7984  7985             root   26u  a_inode               0,13         0       9285 kvm-vcpu:0
qemu-syst  7984  7985             root   27u  a_inode               0,13         0       9285 kvm-arm-vgic-v3
qemu-syst  7984  7985             root   28u  a_inode               0,13         0       9285 kvm-arm-vgic-its
qemu-syst  7984  7986             root  mem       REG               0,13                 9285 anon_inode:kvm-vcpu:0 (stat: No such file or directory)
qemu-syst  7984  7986             root   18u      CHR             10,232       0t0         85 /dev/kvm
qemu-syst  7984  7986             root   19u  a_inode               0,13         0       9285 kvm-vm
qemu-syst  7984  7986             root   26u  a_inode               0,13         0       9285 kvm-vcpu:0
qemu-syst  7984  7986             root   27u  a_inode               0,13         0       9285 kvm-arm-vgic-v3
qemu-syst  7984  7986             root   28u  a_inode               0,13         0       9285 kvm-arm-vgic-its
qemu-syst  7984  7989             root  mem       REG               0,13                 9285 anon_inode:kvm-vcpu:0 (stat: No such file or directory)
qemu-syst  7984  7989             root   18u      CHR             10,232       0t0         85 /dev/kvm
qemu-syst  7984  7989             root   19u  a_inode               0,13         0       9285 kvm-vm
qemu-syst  7984  7989             root   26u  a_inode               0,13         0       9285 kvm-vcpu:0
qemu-syst  7984  7989             root   27u  a_inode               0,13         0       9285 kvm-arm-vgic-v3
qemu-syst  7984  7989             root   28u  a_inode               0,13         0       9285 kvm-arm-vgic-its
qemu-syst  7984  7991             root  mem       REG               0,13                 9285 anon_inode:kvm-vcpu:0 (stat: No such file or directory)
qemu-syst  7984  7991             root   18u      CHR             10,232       0t0         85 /dev/kvm
qemu-syst  7984  7991             root   19u  a_inode               0,13         0       9285 kvm-vm
qemu-syst  7984  7991             root   26u  a_inode               0,13         0       9285 kvm-vcpu:0
qemu-syst  7984  7991             root   27u  a_inode               0,13         0       9285 kvm-arm-vgic-v3
qemu-syst  7984  7991             root   28u  a_inode               0,13         0       9285 kvm-arm-vgic-its
root@ubuntu:/home/ubuntu# 
Run the following command to install KVM and additional virtualization management packages:

sudo apt install qemu-kvm libvirt-bin bridge-utils virtinst virt-manager
qemu-kvm - software that provides hardware emulation for the KVM hypervisor.
libvirt-bin - software for managing virtualization platforms.
bridge-utils - a set of command-line tools for configuring ethernet bridges.
virtinst - a set of command-line tools for creating virtual machines.
virt-manager provides an easy-to-use GUI interface and supporting command-line utilities for managing virtual machines through libvirt.
Once the packages are installed, the libvirt daemon will start automatically. You can verify it by running:

sudo systemctl is-active libvirtd
active
To be able to create and manage virtual machines, you’ll need to add your user to the “libvirt” and “kvm” groups. To do that, type in:

sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
$USER is an environment variable that holds the name of the currently logged-in user.
root@ubuntu:/etc/docker# systemctl is-active libvirtd
active
root@ubuntu:/etc/docker# virsh list
 Id    Name                           State
----------------------------------------------------

root@ubuntu:/etc/docker# 

:

Kata-agent运行在kata创建的VM内部,它负责在VM内以runc的方式去创建容器,也就是说,Kata方案下还是包含了传统容器的,host上(即运行kata-runtime的OS环境)原本的传统容器会以VM per Pod或VM per Container的形式被替代,但它们还是会运行在Kata的创建的VM内部。

Kata-agent会在VM内运行一个gRPC server,然后借助QEMU、以VIRTIO serial或VSOCK interface的形式在host上暴露一个socket file。Kata-runtime会通过gRPC来与kata-agent通信(不过一般二者之间还有kata-proxy作为中介),以管理VM内的容器。
同时,gRPC server也携带了容器和container engine之间的I/O streams,比如stdin、stdout、stderr。处理这类资源就是kata-proxy和kata-shim的事情了。

Kernel 与 Image

虚拟机内核

虚拟机内核在虚拟机启动时候被加载,Kata容器提供的虚拟机内核针对启动时间与内存占用做了优化。

虚拟机镜像

Kata 容器支持 initrd 与 root filesystem 两种虚拟机镜像。

root filesystem

Kata 容器提供的默认打包好的 root filesystem 镜像,这种镜像也被称为 "mini O/S",是基于 Clear Linux 优化的,提供最小的运行环境与高度优化的启动路径。

镜像中只有Kata Agent与systemd两个进程,用户的工作负载被打包到docker镜像,在虚拟机内通过libcontainer库,以runc方式运行起来。

举例,当用户执行 docker run -it ubuntu date 命令时,流程如下:

  • 虚拟化层加载虚拟机内核,虚拟机内核加载虚拟机镜像。

  • systemd 启动虚拟机运行环境(mini-OS Context),并启动 kata-agent 进程(在同一个Context)

  • kata-agent 创建一个独立的context,运行用户指定的命令(例子中是 date )

  • kata-agent 准备 ubuntu 的运行环境并运行 date 命

Agent

kata-agent 是一个运行在虚拟机中的进程管理虚拟机中的容器进程。

kata-agent 的最小运行单元是沙箱,一个 kata-agent 沙箱是一个由一些列namespace(NS, UTS, IPC, PID)隔离出来的。 kata-runtime 能够在一个虚拟机内运行多个容器进程以支持POD内多个container模式。

kata-agent 使用gRPC协议与Kata其他组件通信,在gRPC同一个URL上还运行了一个 yamux 服务。

kata-agent 使用 libcontainer 管理容器生命周期,复用了 runc 的大部分代码。

原文地址:https://www.cnblogs.com/dream397/p/13791650.html