Kata Containers Runtime-rs 安装教程

Table of Contents

这篇文章源自于斌哥的 「使用 VirtualBox 安装虚拟机开发环境」,以下是这篇文章的初衷。

在平时闲聊或者吃饭的时候,隔壁同学谈到对 Kata Containers 也很感兴趣,问如何才能参与下或者学习下呢?确实现在 Kata Containers 社区版基本都是英文资料,而且也缺乏比较基础的入门资料,这也成为了这一系列文章的契机。

这一系列文章主要是介绍如何开始参与到 Kata Containers 的开发,这是其中第一部分,主要是看如何来安装开发环境。在这系列教程中,主要是以在 macOS 为宿主机,使用 VirtualBox + Vagrant + Ubuntu 为例来进行说明。

斌哥的这篇文章的版本是 2.0.1,时过境迁,Kata Containers 已经升级到了 3.5.0,而且大部分开发的工作已经迁移到 Runtime-rs,因此就有了这篇文章。

安装 Vagrant

请参考 「本地运行 Kata Containers CI#Vagrant 安装」。

安装开发环境

请参考 「使用 VirtualBox 安装虚拟机开发环境#安装开发环境」。

如果你想使用最新版本,Golang 版本和 Rust 版本推荐参考 versions.yaml,分别搜索 "golang:" 和 "rust:"。

golang:
description: "Google's 'go' language"
notes: "'version' is the default minimum version used by this project."
version: "1.22.2"
meta:
description: |
'newest-version' is the latest version known to work when
building Kata
newest-version: "1.22.2"
rust:
description: "Rust language"
notes: "'version' is the default minimum version used by this project."
version: "1.72.0"
meta:
description: |
'newest-version' is the latest version known to work when
building Kata
newest-version: "1.72.0"

安装 Golang,可用版本列表参见 All Releases

$ GOLANG_VERSION="1.22.2" \
&& ARCH="amd64" \
&& SYSTEM="linux"
$ wget https://go.dev/dl/go$GOLANG_VERSION.$SYSTEM-$ARCH.tar.gz
$ sudo rm -rf /usr/local/go \
&& sudo tar -C /usr/local -xzf go$GOLANG_VERSION.$SYSTEM-$ARCH.tar.gz
$ echo "PATH=$PATH:/usr/local/go/bin" >> ~/.bashrc && source ~/.bashrc
$ go version
go version go1.22.2 linux/amd64

安装 Rust,国内环境推荐使用 rsproxy

$ RUST_VERSION="1.72.0"
$ export RUSTUP_DIST_SERVER="https://rsproxy.cn" \
&& export RUSTUP_UPDATE_ROOT="https://rsproxy.cn/rustup"
$ curl --proto '=https' --tlsv1.2 -sSf https://rsproxy.cn/rustup-init.sh | sh
$ . "$HOME/.cargo/env"
$ cat > ~/.cargo/config <<EOF
[source.crates-io]
replace-with = 'rsproxy-sparse'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[net]
git-fetch-with-cli = true
EOF
$ rustup default $RUST_VERSION
$ rustup target add x86_64-unknown-linux-musl
$ rustc --version
rustc 1.72.0 (5680fa18f 2023-08-23)

安装 Kata Containers 以及它的伙伴们

第一步下载并安装 Containerd 二进制文件,请参考 「Getting started with containerd#installing-containerd」。下载 1.x 的版本(2.x 目前还在 beta 阶段,可能存在兼容性问题)。Containerd 的版本列表参见 containerd/containerd/releases

# Ubuntu's system service directory
$ SYSTEMD_SRV_DIR="/etc/systemd/system"
$ CONTAINERD_VERSION="1.7.17" \
&& ARCH="amd64" \
&& SYSTEM="linux"
$ wget https://github.com/containerd/containerd/releases/download/v$CONTAINERD_VERSION/containerd-$CONTAINERD_VERSION-$SYSTEM-$ARCH.tar.gz
$ sudo tar Cxzvf /usr/local containerd-$CONTAINERD_VERSION-$SYSTEM-$ARCH.tar.gz
$ sudo wget -O $SYSTEMD_SRV_DIR/containerd.service https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
$ sudo mkdir -p /etc/containerd
$ sudo sh -c "containerd config default > /etc/containerd/config.toml"
$ sudo systemctl daemon-reload \
&& sudo systemctl restart containerd
$ sudo systemctl status containerd
● containerd.service - containerd container runtime
Loaded: loaded (/etc/systemd/system/containerd.service; disabled; preset: enabled)
Active: active (running) since Wed 2024-05-22 06:15:03 UTC; 21s ago
Docs: https://containerd.io
Process: 2725 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 2728 (containerd)
Tasks: 7
Memory: 13.5M
CPU: 148ms
CGroup: /system.slice/containerd.service
└─2728 /usr/local/bin/containerd

第二步安装并配置 CNI 插件。

$ git clone --branch v1.3.0 https://github.com/containernetworking/plugins.git cni-plugins
$ pushd cni-plugins \
&& ./build_linux.sh \
&& sudo mkdir -p /opt/cni/bin \
&& sudo cp bin/* /opt/cni/bin/ \
&& mkdir -p /etc/cni/net.d \
; popd
$ sudo sh -c 'cat > /etc/cni/net.d/10-mynet.conf <<EOF
{
"cniVersion": "0.2.0",
"name": "mynet",
"type": "bridge",
"bridge": "cni0",
"isGateway": true,
"ipMasq": true,
"ipam": {
"type": "host-local",
"subnet": "172.19.0.0/24",
"routes": [
{ "dst": "0.0.0.0/0" }
]
}
}
EOF'

第三步配置 Containerd 添加 Kata Containers 运行时并调整日志等级至 debug 模式。

$ sudo vim /etc/containerd/config.toml
# 1. 搜索 "debug"
# [debug]
# address = ""
# format = ""
# gid = 0
# level = "" # 修改为 level = "debug"
# uid = 0
# 2. 搜索 "plugins."io.containerd.grpc.v1.cri".containerd.runtimes"
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
#
#+ [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
#+ runtime_type = "io.containerd.kata.v2"
#+ pod_annotations = ["io.katacontainers.*"]
#+ privileged_without_host_devices = true
# [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
$ sudo systemctl restart containerd
$ sudo systemctl status containerd
● containerd.service - containerd container runtime
Loaded: loaded (/etc/systemd/system/containerd.service; disabled; preset: enabled)
Active: active (running) since Wed 2024-05-22 06:30:05 UTC; 13s ago
Docs: https://containerd.io
Process: 4862 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
Main PID: 4864 (containerd)
Tasks: 7
Memory: 13.6M
CPU: 169ms
CGroup: /system.slice/containerd.service
└─4864 /usr/local/bin/containerd

第四步安装 Kata Containers 本体,版本列表在 kata-containers/kata-containers/releases。目前最新版本是 3.5.0。

$ KATA_VERSION="3.5.0" \
&& ARCH="amd64"
$ wget https://github.com/kata-containers/kata-containers/releases/download/$KATA_VERSION/kata-static-$KATA_VERSION-$ARCH.tar.xz
$ sudo tar -C / -Jxvf kata-static-$KATA_VERSION-$ARCH.tar.xz

Kata Containers 3.x 默认使用 Runtime-go(请参考 「验证 Kata Containers + containerd 是否正常工作」),如果你期望使用 Runtime-rs,请继续按照本教程操作。

$ sudo ln -s /opt/kata/runtime-rs/bin/containerd-shim-kata-v2 /usr/local/bin
# 开启 Kata Containers debug 模式
$ sudo vim /opt/kata/share/defaults/kata-containers/runtime-rs/configuration.toml
# 将三处 "enable_debug" 设置为 "true"(取消注释)

验证 Kata Containers 是否可以工作。

$ sudo ctr image pull docker.io/library/busybox:latest
$ sudo ctr run --runtime io.containerd.run.kata.v2 -t --rm docker.io/library/busybox:latest hello sh
/ #

如果无法正常启动容器,那么请检查 containerd 日志。

$ sudo journalctl -t containerd > /tmp/containerd.txt
$ less /tmp/containerd.txt

如果你发现没有 "connect success on X current client fd"(其中 "X" 表示一个数字)这个日志,则说明可能在 pod 启动过程中还没有连接到 agent 就超时了,此时你需要修改 Kata Containers 的超时配置。如果你采用的是 runtime-rs,那么你需要在配置文件中新增一个配置。

$ vim /opt/kata/share/defaults/kata-containers/runtime-rs/configuration.toml
# 在 "[agent.kata]" 下面新增一条配置 "reconnect_timeout_ms = 1000000"

通过 CRI 创建 Pod

安装过程参考 「安装-crictl-工具」,流程是

  • 安装 crictl;
  • 配置 crictl;
  • 下载 pause 镜像和 busybox 镜像;
  • 启动一个 sandbox 验证 Kata Containers 是否可以工作。
$ sudo crictl pods
POD ID CREATED STATE NAME NAMESPACE ATTEMPT RUNTIME
7d4c6e439a6d1 About a minute ago Ready test-pod default 1 kata
All rights reserved
Except where otherwise noted, content on this page is copyrighted.