听说过 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。sudo snap install kata-containers
OS:Ubuntu 22.04
安装与配置
通过 snap 安装 kata-containers,目前【2022-08-25】snap 中最新版本是 2.4.2 2022-06-08,但是官网的 release 已经发布到了 2.5.0。
sudo snap install kata-containers --stable --classic
设置默认的配置文件 /etc/kata-containers/configuration.toml
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 能直接访问该二进制
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
[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 输出的结果应该会一样
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 集群中,如下:
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 作为运行时。
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
成功运行后,结果如下:
$ uname -r
5.15.0-46-generic
$ kubectl exec nginx-dep-f6bbd75cf-7c9sq -- uname -r
5.15.26.container
遇到的问题
在配置完 containerd 和 kata 后,检测是否能正常运行时,遇到了如下报错
$ 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 相关的链接后
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 月。其间只是隔了一两个版本。