OS:Ubuntu 22.04
安装与配置
通过 snap 安装 kata-containers,目前【2022-08-25】snap 中最新版本是 2.4.2 2022-06-08
,但是官网的 release 已经发布到了 2.5.0
。
1
| sudo snap install kata-containers --stable --classic
|
设置默认的配置文件 /etc/kata-containers/configuration.toml
1 2 3 4 5
| sudo mkdir -p /etc/kata-containers sudo cp /snap/kata-containers/current/usr/share/defaults/kata-containers/configuration.toml /etc/kata-containers/
# 将 sandbox_cgroup_only 设置为 true sudo sed -i 's/sandbox_cgroup_only=.*$/sandbox_cgroup_only=true/' /etc/kata-containers/configuration.toml
|
将 kata 的二进制链接到 PATH
涵盖的目录中,以便 containerd
能直接访问该二进制
1 2 3 4
| sudo ln -sf /snap/kata-containers/current/usr/bin/containerd-shim-kata-v2 \ /usr/local/bin/containerd-shim-kata-v2 sudo ln -sf /snap/kata-containers/current/usr/bin/kata-runtime \ /usr/local/bin/kata-runtime
|
修改 containerd 的配置文件 /etc/containerd/config.toml
1 2 3 4 5 6 7 8 9 10
| [plugins] [plugins."io.containerd.grpc.v1.cri"] [plugins."io.containerd.grpc.v1.cri".containerd] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata] runtime_type = "io.containerd.kata.v2" privileged_without_host_devices = true pod_annotations = ["io.katacontainers.*"] container_annotations = ["io.katacontainers.*"]
|
检验安装是否正确
测试 kata-containers 配置是否正常,两次 ctr run
输出的结果应该会一样
1 2 3 4 5 6
| sudo ctr image pull docker.io/library/busybox:latest # 将使用 kata runtime sudo ctr run --rm -t --runtime "io.containerd.kata.v2" \ docker.io/library/busybox:latest test-kata-containers uname -r # 将使用 runc runtime sudo ctr run --rm -t docker.io/library/busybox:latest test-kata-containers uname -r
|
在 K8s 中使用 Kata 运行时,需要先创建 RuntimeClass
对象到 K8s 集群中,如下:
1 2 3 4 5 6 7
| cat <<EOF | kubectl apply -f - apiVersion: node.k8s.io/v1 kind: RuntimeClass metadata: name: kata handler: kata EOF
|
然后在 yaml 中手动指定 pod.spec.runtimeClass
字段为:名称是 kata
的 RuntimeClass
对象,然后 containerd 才会使用 kata 作为运行时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: nginx-dep labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: runtimeClassName: kata containers: - name: nginx image: ghcr.io/joengjyu/nginx:latest ports: - containerPort: 80 imagePullPolicy: IfNotPresent resources: requests: cpu: 500m memory: 512Mi limits: cpu: 500m memory: 512Mi EOF
|
成功运行后,结果如下:
1 2 3 4 5
| $ uname -r 5.15.0-46-generic
$ kubectl exec nginx-dep-f6bbd75cf-7c9sq -- uname -r 5.15.26.container
|
遇到的问题
在配置完 containerd 和 kata 后,检测是否能正常运行时,遇到了如下报错
1 2 3
| $ sudo ctr run --cni --runtime io.containerd.run.kata.v2 -t --rm docker.io/library/busybox:latest hello sh
ctr: failed to create shim task: Could not create the sandbox resource controller cgroups: cgroup mountpoint does not exist: not found
|
在 kata-container 的 ISSUE #1927 中,找到一个与此问题类似的讨论,主要是将 kata 配置文件中的 sandbox_cgroup_only
字段设置成 true
。
但是修改后,错误依然存在。
索性找到了此报错信息在 kata-containers 中源码的位置,打了相关日志,重新创建 kata 相关的链接后
1 2 3
| sudo ln -sf ~/kata-containers/src/runtime/kata-runtime /usr/local/bin/kata-runtime sudo ln -sf ~/kata-containers/src/runtime/containerd-shim-kata-v2 /usr/local/bin/containerd-shim-kata-v2 sudo ln -sf ~/kata-containers/src/runtime/kata-monitor /usr/local/bin/kata-monitor
|
再次运行后,发现问题消失了。可能是 kata 版本的问题,通过 snap 安装的 kata 版本是 2.4.2
,发布于 2022 年 6 月,最新稳定版本是 2.5.0
,发布于 2022 年 8 月。其间只是隔了一两个版本。
Reference