OCI runtime create failed: expected cgroupsPath
本文是针对作者遇到的
OCI runtime create failed: expected cgroupsPath to be of format \"slice:prefix:name\" for systemd cgroups, got \"/kubepods/burstable/..."的问题总结
问题总结
问题描述
在特定的k8s node上不能通过containerd启动pod,pod的状态一直是ContainerCreating,通过kubectl describe pod查看pod的状态,发现如下错误:
OCI runtime create failed: runc create failed: expected cgroupsPath to be of format "slice:prefix:name" for systemd cgroups
k8s集群信息
- k8s版本: v1.26.13
- containerd版本: 1.6.24
- Linnux kernel版本: 6.6.20-amd64
- Linux发行版: Garden Linux 1443.0
- kubeProxyVersion: v1.26.13
- kubeletVersion: v1.26.13
问题分析
此问题是因为kubelet配置为使用cgroupfs cgroup驱动程序,而containerd配置为使用sytemd cgroup驱动程序。
解决方法
为了解决上面的问题,可以从以下两种方式中选择一种:
- 让containerd使用cgroupfs驱动程序,需要从/etc/containerd/config.toml中删除SystemdCgroup = true行。
- 让kubelet使用systemd驱动程序,需要将KubeletConfiguration中的cgroupDriver设置为"systemd"。
扩展阅读
查看Kubelet配置
Kubelet的配置文件通常位于/var/lib/kubelet/位置,可以通过查看该文件来确认Kubelet的cgroup驱动程序配置。关于其他CRIs的配置文件位置可以参考Container Runtimes。
~ ls -lh /var/lib/kubelet/
total 48K
-rw-r--r--  1 root root 1.5K Mar 27 01:35 ca.crt
d---------  2 root root 4.0K Mar 27 01:35 config
-rw-------  1 root root   62 Mar 27 01:35 cpu_manager_state
drwxr-xr-x  2 root root 4.0K Mar 27 03:06 device-plugins
-rw-------  1 root root 2.4K Mar 27 01:35 kubeconfig-real
-rw-------  1 root root   61 Mar 27 01:35 memory_manager_state
drwxr-xr-x  2 root root 4.0K Mar 27 01:35 pki
drwxr-x---  6 root root 4.0K Mar 27 03:06 plugins
drwxr-x---  2 root root 4.0K Mar 27 01:36 plugins_registry
drwxr-x---  2 root root 4.0K Mar 27 01:35 pod-resources
drwxr-x--- 27 root root 4.0K Mar 27 06:23 pods
drwxr-xr-x  2 root root 4.0K Mar 27 01:35 volumeplugins
查看containerd配置
containerd的配置文件通常位于/etc/containerd/config.toml位置,可以通过查看该文件来确认containerd的cgroup驱动程序配置。关于其他CRIs的配置文件位置可以参考Container Runtimes。
        [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
          base_runtime_spec = ""
          cni_conf_dir = ""
          cni_max_conf_num = 0
          container_annotations = []
          pod_annotations = []
          privileged_without_host_devices = false
          runtime_engine = ""
          runtime_path = ""
          runtime_root = ""
          runtime_type = "io.containerd.runc.v2"
          [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            BinaryName = ""
            CriuImagePath = ""
            CriuPath = ""
            CriuWorkPath = ""
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = ""
            ShimCgroup = ""
            SystemdCgroup = true
查看Linux node上的Cgroup版本
cgroup 版本取决于正在使用的 Linux 发行版和操作系统上配置的默认 cgroup 版本。 要检查你的发行版使用的是哪个 cgroup 版本,请在该节点上运行 stat -fc %T /sys/fs/cgroup/ 命令:
   $ stat -fc %T /sys/fs/cgroup/
如果输出为 cgroup2fs,则表示你用的是cgroup v2。 如果输出为 tmpfs,则表示你用的是cgroup v1。
关于cgroup v1和cgroup v2的更多信息,请参考Control Groups (Cgroups)。