当前位置: 首页 > 工具软件 > Firecracker > 使用案例 >

kata-containers对接firecracker

张坚白
2023-12-01

在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

编译二进制

# make runtime

会在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国内镜像源

# cat /etc/docker/daemon.json

{

    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]

}

安装依赖

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

 类似资料: