在arm64环境下测试kata-containers对接firecracker,kata2.0需要使用containerd,不能使用docker,docker将kata版本硬编码成了v1
下载kata-containers
x86可直接下载官方打包好的压缩包,arm64需要自己编译
curl -OL https: //github.com/kata-containers/kata-containers/releases/download/2.1.1/kata-static-2.1.1-x86_64.tar.xz |
下载源码文件
github慢可以使用github.com.cnpmjs.org,与官方会有一天延迟,也可clone源码,然后git checkout 2.1.1
curl -OL https: //github.com/kata-containers/kata-containers/archive/refs/tags/2.1.1.tar.gz |
解压并进入代码目录
tar -xf 2.11 .tar.gz cd kata-containers- 2.1 . 1 / |
拷贝配置文件
kata默认使用的配置文件为/usr/share/defaults/kata-containers/目录下的configuration.toml
将src/runtime/cli/config/configuration-*.toml的所有文件拷贝到ls /usr/share/defaults/kata-containers/目录下,便于之后使用
编译容器运行时
注:需要go环境,可17.4
编译二进制
会在src/runtime/目录下生成如下文件
# ls kata-* kata-monitor kata-netmon kata-runtime # ls containerd-shim-kata-v2 containerd-shim-kata-v2 |
将二进制文件拷贝到/usr/bin/下
编译虚拟机系统镜像
创建rootfs镜像
注意:需要docker环境,并且运行时为runc,需要rust环境,脚本会自动安装rust,但容易超时失败,并且不能加速下载依赖包,不使用docker还会出现类似以下错误
losetup: /tmp/tmp.8guQYiN2HY:警告,文件小于 512 个字节,回环设备可能无用或在系统工具中看不到 |
rust环境安装见rust环境搭建_weixin_42758299的博客-CSDN博客
需要添加aarch64-unknown-linux-musl
rustup target add aarch64-unknown-linux-musl |
修改docker国内镜像源
安装依赖
yum install parted git -y |
创建本地rootfs
cd tools/osbuilder/rootfs-builder/ GOPATH=$GOPATH USE_DOCKER= true ./rootfs.sh ${distro} |
注:distro可用./rootfs.sh -l查看,表示可创建的虚拟机系统,本次使用的是ubuntu
# ./rootfs.sh -l alpine centos clearlinux debian fedora gentoo suse ubuntu |
会生成一个rootfs在当前目录下,使用ubuntu生成的是目录名为rootfs-bionic
# ls rootfs-bionic bin boot dev etc home lib media mnt opt proc root run sbin srv sys tmp usr var |
编译rootfs镜像
使用上面创建的本地rootfs
cd tools/osbuilder/image-builder/ USE_DOCKER=true ./image_builder.sh ../rootfs-builder/rootfs-bionic |
生成的文件在当前目录,为:
kata-containers.img
将文件拷贝到/usr/share/kata-containers/目录下
编译内核
cd tools/packaging/kernel |
安装依赖
yum install -y flex bison bc diffutils |
修改build-kernel.sh
将cdn.kernel.org改为www.kernel.org
执行如下命令
./build-kernel.sh setup ./build-kernel.sh build ./build-kernel.sh install |
生成的文件在/usr/share/kata-containers/
# ls /usr/share/kata-containers/ config- 5.10 . 25 vmlinux- 5.10 . 25 - 85 vmlinux.container vmlinuz- 5.10 . 25 - 85 vmlinuz.container |
安装firecracker
下载
curl -OL https: //github.com.cnpmjs.org/firecracker-microvm/firecracker/releases/download/v0.23.4/firecracker-v0.23.4-aarch64.tgz |
解压
tar -xf firecracker-v0. 23.4 -aarch64.tgz |
有如下文件
# ls release-v0. 23.4 / firecracker_spec-v0. 23.4 .yaml firecracker-v0. 23.4 -aarch64 jailer-v0. 23.4 -aarch64 LICENSE NOTICE THIRD-PARTY |
将firecracker-v0.23.4-aarch64和jailer-v0.23.4-aarch64拷贝到/usr/bin/,并改名为firecracker和jailer即可
安装containerd
arm64环境下如果containerd没有命令行工具,可以使用如下工具,containerd官方推出的nerdctl,下载full压缩包,里面包含nerdctl和containerd
curl https: //github.com/containerd/nerdctl/releases/download/v0.8.3/nerdctl-full-0.8.3-linux-arm64.tar.gz |
可以把nerdctl和containerd拷贝到/usr/bin,直接使用containerd启动服务
配置devmapper
AWS Firecracker不支持 virtiofs,只能使用 virtio 块设备
可以使用如下脚本进行配置:
#!/bin/bash set -ex DATA_DIR=/var/lib/containerd/io.containerd.snapshotter.v1.devmapper POOL_NAME=containerd-pool mkdir -p ${DATA_DIR} # Create data file sudo touch "${DATA_DIR}/data" sudo truncate -s 100G "${DATA_DIR}/data" # Create metadata file sudo touch "${DATA_DIR}/meta" sudo truncate -s 40G "${DATA_DIR}/meta" # Allocate loop devices DATA_DEV=$(sudo losetup --find --show "${DATA_DIR}/data" ) META_DEV=$(sudo losetup --find --show "${DATA_DIR}/meta" ) # Define thin-pool parameters. # See https: //www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt for details. SECTOR_SIZE= 512 DATA_SIZE= "$(sudo blockdev --getsize64 -q ${DATA_DEV})" LENGTH_IN_SECTORS=$(bc <<< "${DATA_SIZE}/${SECTOR_SIZE}" ) DATA_BLOCK_SIZE= 128 LOW_WATER_MARK= 32768 # Create a thin-pool device sudo dmsetup create "${POOL_NAME}" \ --table "0 ${LENGTH_IN_SECTORS} thin-pool ${META_DEV} ${DATA_DEV} ${DATA_BLOCK_SIZE} ${LOW_WATER_MARK}" cat << EOF # # Add this to your config.toml configuration file and restart containerd daemon # [plugins] [plugins.devmapper] pool_name = "${POOL_NAME}" root_path = "${DATA_DIR}" base_image_size = "40GB" EOF |
注意需要将最后的输出的plugins这一段添加到/etc/containerd/config.toml,没有文件则手动创建
为了使devmapper在机器重启之后继续生效,可使用以下脚本
#!/bin/bash set -ex DATA_DIR=/var/lib/containerd/io.containerd.snapshotter.v1.devmapper POOL_NAME=containerd-pool # Allocate loop devices DATA_DEV=$(sudo losetup --find --show "${DATA_DIR}/data" ) META_DEV=$(sudo losetup --find --show "${DATA_DIR}/meta" ) # Define thin-pool parameters. # See https: //www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt for details. SECTOR_SIZE= 512 DATA_SIZE= "$(sudo blockdev --getsize64 -q ${DATA_DEV})" LENGTH_IN_SECTORS=$(bc <<< "${DATA_SIZE}/${SECTOR_SIZE}" ) DATA_BLOCK_SIZE= 128 LOW_WATER_MARK= 32768 # Create a thin-pool device sudo dmsetup create "${POOL_NAME}" \ --table "0 ${LENGTH_IN_SECTORS} thin-pool ${META_DEV} ${DATA_DEV} ${DATA_BLOCK_SIZE} ${LOW_WATER_MARK}" |
重启containerd服务
kata配置
为了区分对接的不同vmm,可以进行如下操作
创建文件/usr/bin/containerd-shim-kata-fc-v2,并赋予可执行权限,否则将/usr/share/defaults/kata-containers/configuration-fc.toml文件改为configure.toml即可
文件内容为:
#!/bin/bash KATA_CONF_FILE=/usr/share/defaults/kata-containers/configuration-fc.toml /usr/bin/containerd-shim-kata-v2 $@ |
修改/etc/containerd/config.toml,把以下内容加到[plugins]下
[plugins. "io.containerd.grpc.v1.cri" .containerd.runtimes] [plugins. "io.containerd.grpc.v1.cri" .containerd.runtimes.kata-fc] runtime_type = "io.containerd.kata-fc.v2" |
重启containerd
测试
拉取镜像并使用kata容器运行时启动容器
# nerdctl pull --snapshotter devmapper docker.io/library/ubuntu:latest # nerdctl run --snapshotter devmapper --runtime io.containerd.run.kata-fc.v2 -ti --rm docker.io/library/ubuntu:latest bash root @1b4ebd9fbd52 :/# root @1b4ebd9fbd52 :/# uname -a Linux 1b4ebd9fbd52 5.10 . 25 # 1 SMP Wed Dec 15 13 : 39 : 55 CST 2021 aarch64 aarch64 aarch64 GNU/Linux |
其他vmm
如果要使用其他vmm的话,只需要下载对应vmm的二进制文件,与configuration.toml匹配即可,另外需要看用的vmm是否支持virtiofs,否则需要devmapper
如果需要使用virtiofs,比如使用qemu或者cloud-hypervisor时,需要编译virtiofsd
编译virtiofsd
如果github访问慢,可以将build-base-qemu.sh里qemu_repo="https://github.com.cnpmjs.org/qemu/qemu.git",然后将Dockerfile里的github.com都改为github.com.cnpmjs.org
# cd tools/packaging/ static -build/qemu # make |
会生成一个压缩包kata-static-qemu.tar.gz
解压之后是一个opt目录,virtiofsd文件在opt/kata/libexec/kata-qemu/virtiofsd
同理,也可以直接通过该目录下的firecracker和cloud-hypervisor获取firecracker和cloud-hypervisor的二进制,不用去单独下载firecracker和cloud-hypervisor了,其实这两个脚本内容也是去github下载编译好的二进制
如下为使用cloud-hypervisor,不用使用devmapper
# nerdctl run --runtime io.containerd.run.kata-clh.v2 -ti --rm busybox:latest sh / # / # uname -a Linux f52317cfb826 5.10 . 25 # 1 SMP Thu Dec 16 10 : 07 : 47 CST 2021 aarch64 GNU/Linux |
参考
Running containers on Firecracker microVMs using kata on kubernetes | CloudKernels
https://github.com/kata-containers/kata-containers/blob/main/docs/Developer-Guide.md
https://github.com.cnpmjs.org/kata-containers/kata-containers/blob/main/tools/packaging/kernel/README.md#build-kata-containers-kernel
Kata Containers - ArchWiki