前言
某天上午看到告警发现测试环境有个节点NotReady
首先排查服务器状态,cpu 内存 磁盘 网络一切正常.那就把目光放到kubelet
和docker
上面
查看kubelet日志
先查看kubelet状态,发现服务已经挂了,那主要目标就是他了
systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
Drop-In: /usr/lib/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since 五 2023-01-06 10:32:34 CST; 956ms ago
Docs: https://kubernetes.io/docs/
Process: 18204 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS (code=exited, status=255)
Main PID: 18204 (code=exited, status=255)
可以通过命令查看日志确认启动失败的原因
journalctl -u kubelet -f | grep E0106
#其中看到一条这样的日志
failed to run Kubelet: misconfiguration: kubelet cgroup driver: "systemd" is different from docker cgroup driver: "cgroupfs"
分析后发现,是因为kebernetes
默认设置cgroup
驱动为systemd
,而docker
服务的cgroup
驱动为cgroupfs
,有两种决解决方式,方式一,将docker
的服务配置文件修改为何kubernetes
的相同,方式二是修改kebernetes
的配置文件为cgroupfs
这次采用第一种,修改docker
的cgroup
cat /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
#重启服务
systemctl restart docker
再次查看日志,发现没有上面的报错了 但是有新的报错 😭
E0106 11:14:25.601363 21120 watcher.go:146] Failed to watch directory "/sys/fs/cgroup/pids/system.slice/containerd.service/kubepods-burstable-pod452d78e1_b236_4c8e_8874_a465705a42c3.slice": inotify_add_watch /sys/fs/cgroup/pids/system.slice/containerd.service/kubepods-burstable-pod452d78e1_b236_4c8e_8874_a465705a42c3.slice: no space left on device
上网查询发现,应该是cgroup占满了 可以通过修改内核参数生效
#查看目前配置
cat /proc/sys/fs/inotify/max_user_watches
8192
#将最大限制调整为1048576
sudo sysctl fs.inotify.max_user_watches=1048576
再次重启kubelet
发现终于变成好了😊