K8s 线上采坑 07 Node 节点 NotReady 问题排查

今天发现已经正常运行了几个月的一个 Node 节点处于 NotReady 状态. 登陆机器发现 Docker 进程已经退出.

排查 docker 退出原因

怀疑 2 种情况: 其一是系统重启, 没做 docker 随系统启动; 另一种是 docker 自己挂掉了.

排查第一种情况:

查看系统重启日志 sudo tail -n 20 /var/log/boot.log* 发现最后日志距离 docker 退出时间相差 2 个月左右, 明显不是系统重启引起的 docker 问题.

排查第二种情况:

使用 journalctl -u docker.service 查看 Docker 日志出现报错如下, 只有一句弱弱的

1
systemd: Stopped Docker Application Container Engine.

只能知道确实是自己退出了.

继续追查退出的原因

进入目录 /var/log/ 查看 messages* 文件, 查找在 docker 挂掉前半小时左右的日志内容.

1
2
3
4
5
kernel: Out of memory: Kill process 23607 (containerd) score 10 or sacrifice
kernel: Killed process 3203 (containerd-shim) total-vm:109096kB, anon-rss:3256kB, file-rss:0kB, shmem-rss:0kB
kernel: kubelet invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=-999
kernel: kubelet cpuset=/ mems_allowed=0
kernel: CPU: 0 PID: 27210 Comm: kubelet Tainted: G W ------------ T 3.10.0-693.2.2.el7.x86_64 #1

说明是因为内存不足, 造成系统 OOM 投票将 docker 相关进程杀掉.

查看 Node 当前使用资源

kubectl describe node <NODENAME>

可以看到资源使用情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Non-terminated Pods: (12 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE
--------- ---- ------------ ---------- --------------- ------------- ---
default loki-promtail-xgsnr 0 (0%) 0 (0%) 0 (0%) 0 (0%) 25d
kube-system coredns-66bff467f8-55s2m 100m (5%) 0 (0%) 70Mi (1%) 170Mi (4%) 56d
kube-system coredns-66bff467f8-jnkp7 100m (5%) 0 (0%) 70Mi (1%) 170Mi (4%) 56d
kube-system etcd-hostname 0 (0%) 0 (0%) 0 (0%) 0 (0%) 56d
kube-system flexvolume-gtgn8 0 (0%) 0 (0%) 0 (0%) 0 (0%) 19d
kube-system kube-apiserver-hostname 250m (12%) 0 (0%) 0 (0%) 0 (0%) 56d
kube-system kube-controller-manager-hostname 200m (10%) 0 (0%) 0 (0%) 0 (0%) 56d
kube-system kube-flannel-ds-amd64-vc95z 100m (5%) 100m (5%) 50Mi (1%) 50Mi (1%) 56d
kube-system kube-proxy-xhqhp 0 (0%) 0 (0%) 0 (0%) 0 (0%) 56d
kube-system kube-scheduler-hostname 100m (5%) 0 (0%) 0 (0%) 0 (0%) 56d
Allocated resources:
(Total limits may be over 100 percent, i.e., overcommitted.)
Resource Requests Limits
-------- -------- ------
cpu 850m (42%) 100m (5%)
memory 190Mi (5%) 390Mi (10%)
ephemeral-storage 0 (0%) 0 (0%)
hugepages-1Gi 0 (0%) 0 (0%)
hugepages-2Mi 0 (0%) 0 (0%)

解决办法

给 Pod 限制资源(CPU, RAM)的使用

管理资源分为 Requests 和 Limits, 其中 Request 在创建 pod 时决定在哪个 Node 上运行, Limit 则在运行时确保不超出这个限制. 这意味着 Node 上资源充足, 使用的资源会超出 Requests, 但是绝对不会超出 Limits.

1
2
3
4
5
6
7
resources:
requests:
memory: '64Mi'
cpu: '250m'
limits:
memory: '128Mi'
cpu: '500m'

参考 Managing Resources for Containers

修改应用尽量减少内存占用

参考 Docker 容器日志管理最佳实践

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.