听说过 OCI Runtime 不止 runc 还有 kata

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]
#default_runtime_name = "kata"
[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 字段为:名称是 kataRuntimeClass 对象,然后 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

听说过 OCI Runtime 不止 runc 还有 kata

https://eucham.me/2022/08/29/abbcdaf10c8c.html

作者

遇寻

发布于

2022-08-29

更新于

2022-08-29

许可协议

评论