Tim Wang Tech Blog

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)

参考链接