记录一次 k8s 节点内存不足的排查过程
背景:前端服务一直报404,查看k8s日志,没发现报错,但是发现pods多次重启。
排查过程:
- 查看pods日志,发现日志进不去。
kubectrl logs -f -n weave pod-name --tail 100
- 查看pod describe
kubectl describe po -n weave senseweave-capability-gateway-6c5485f7bf-xxxx
- Exit Code 为 137:通常表示该容器被 Linux OOM(Out-of-Memory)杀手终止。这通常发生在 Pod 超过了内存限制,或者运行该 Pod 的节点内存不足时。
- Restart Count 为2,表示最近pod重启了2次
- 当前pods没有指定 limit 资源
原因分析:如果pod不指定 limit, 多个pod间会存在资源争抢,并且不指定资源的pod,在oom的时候,会优先被 Terminal 掉。
- 查看当前节点的内存使用情况
kubectl top nodes --no-headers | sort -k4 -nr
# 解释:
# --no-headers 不显示表头,
# sort -k4 -nr 按照第四列降序排序
# -n 按照数值排序
# -r 反向排序
23-8 节点的内存已经快满了。
pods 是通过 deployment 部署的,多个节点都有亲和性标签,但是 pod 还是部署到了 23-8 节点上。
分析原因可能是,不指定 limit 导致的
解决办法:
deployment 指定 limit 资源大小,重启 pods 。