系统环境:
- 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 日志信息,可以看到系统已经没有之前的错误日志信息了。