系统环境:


  • Kubernetes 版本:1.18.20
  • 操作系统版本:CentOS 7.9

一、问题描述

此问题存在很久了

查看 Kubelet 日志,发现日志中一堆错误信息,内容如下:

  • -n:指定获取最后指定行数的日志信息。
$ journalctl -u kubelet -n 10

Feb 10 14:33:20 kvm-ht242035 kubelet[1016]: E0210 14:33:20.373897 1016 summary_sys_containers.go:47] Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"
Feb 10 14:33:30 kvm-ht242035 kubelet[1016]: E0210 14:33:30.387753 1016 summary_sys_containers.go:47] Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"
Feb 10 14:33:40 kvm-ht242035 kubelet[1016]: E0210 14:33:40.404373 1016 summary_sys_containers.go:47] Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"
Feb 10 14:33:50 kvm-ht242035 kubelet[1016]: E0210 14:33:50.422424 1016 summary_sys_containers.go:47] Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"
Feb 10 14:34:00 kvm-ht242035 kubelet[1016]: E0210 14:34:00.435255 1016 summary_sys_containers.go:47] Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"
Feb 10 14:34:10 kvm-ht242035 kubelet[1016]: E0210 14:34:10.465198 1016 summary_sys_containers.go:47] Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"

可以观察到提示 failed to get cgroup stats for "/system.slice/docker.service" 错误

二、问题分析

首先呢,参考几个 Kubernetes Github 上的 issue:

  • https://github.com/kubernetes/kubernetes/issues/56850
  • https://github.com/kubermatic/machine-controller/pull/476
  • https://github.com/kubernetes/kubernetes/issues/56850#issuecomment-406241077

从上面各个 issue 中,猜测引起上面的问题的原因是 kubelet 启动时,会执行节点资源统计,需要 systemd 中开启对应的选项,如下:

  • CPUAccounting:是否开启该 unit 的 CPU 使用统计,bool 类型,可配置 true 或者 false。
  • MemoryAccounting:是否开启该 unit 的 Memory 使用统计,bool 类型,可配置 true 或者 false。

如果不设置这两项,kubelet 是无法执行该统计命令,导致 kubelet 一直报上面的错误信息。

三、解决问题

网上查的大多是更改kubelet启动参数,后面发现更新docker和k8s 之后又失效了

--kubelet-cgroups=/system.slice/kubelet.service
--runtime-cgroups=/system.slice/docker.service

决定换一种方式解决,直接编辑 systemd 中的 kubelet 服务配置文件中,添加 CPU 和 Memory 配置,可以按下面操作进行更改

1、编辑配置文件并添加对应配置项

编辑 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 文件,并添加下面配置:

CPUAccounting=true
MemoryAccounting=true

具体操作如下:

$ vi /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

[Service]
CPUAccounting=true ## 添加 CPUAccounting=true 选项,开启 systemd CPU 统计功能
MemoryAccounting=true ## 添加 MemoryAccounting=true 选项,开启 systemd Memory 统计功能
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
EnvironmentFile=-/etc/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

或者新写个配置文件

$ vi /usr/lib/systemd/system/kubelet.service.d/11-cgroups.conf

[Service]
CPUAccounting=true
MemoryAccounting=true

2、重启 Kubelet 服务

重启 kubelet 服务,让 kubelet 重新加载配置。

$ systemctl daemon-reload
$ systemctl restart kubelet

3、观察 kubelet 日志

重启完 kubelet 后等一段时间,再次观察 kubelet 日志信息,可以看到系统已经没有之前的错误日志信息了。