Kata Containers Runtime-rs 安装教程

Kata Containers Runtime-rs 安装教程

.. toc::

这篇文章源自于斌哥的 「使用 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。最好下载最新的版本,否则可能会遇到 agent 拉不起来的问题,截止到 2025 年 08 月 15 号,最新的版本是 3.19.1

$ KATA_VERSION="3.19.1" \
    && 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