k8s pod内存驱逐问题解决
pod内存驱逐问题排查
·
背景:突然收到 web 无法访问告警,然后发现前段应用pod状态为Evicted,证明pod是被驱逐了
排查过程:
1、查看pod状态:
kubectl get pods
kubectl get pods -A | grep 0/1
web-nginx-865674789f-c7bv4 0/1 Evicted 0 25h <none> 192.168.3.10 <none>
web-nginx-865674789f-ggb27 0/1 Evicted 0 25h <none> 192.168.3.10 <none>
web-nginx-865674789f-fwp94 0/1 Evicted 0 25h <none> 192.168.3.10 <none>
web-nginx-865674789f-djj46 0/1 Evicted 0 25m <none> 192.168.3.10 <none>
2、查看pod事件日志:
kubectl describe pods web-nginx-xxx
从日志上可以看出来是内存不足导致了驱逐
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning Evicted 2m (x1 over 2m) kubelet The node was low on resource: [MemoryPressure].
3、排查节点内存监控,发现利用率在50%,没理由会导致内存不足
4、思考内存驱逐的原理
4.1 K8S通过kubelet来配置pod的驱逐参数,我们检查下驱逐阈值
如果没有配置,则使用默认值
# 硬性驱逐条件
evictionHard:
memory.available: "200Mi"
nodefs.available: "10%"
nodefs.inodesFree: "5%"
imagefs.available: "15%"
# 软性驱逐条件
evictionSoft:
memory.available: "300Mi"
nodefs.available: "15%"
imagefs.available: "20%"
# 软性驱逐条件的宽限期
evictionSoftGracePeriod:
memory.available: "1m"
nodefs.available: "1m"
imagefs.available: "1m"
# 驱逐Pod前的最大宽限期
evictionMaxPodGracePeriod: 60
#驱逐开始前等待资源压力状态稳定的时间
evictionPressureTransitionPeriod: "5m"
硬性驱逐和软性驱逐的区别:
- 硬性驱逐是当资源达到或超过设定的硬性驱逐阈值时,Kubelet立即执行驱逐操作。硬性驱逐的特点是直接且无延迟。
- 软性驱逐是在资源使用达到设定的软性驱逐阈值后,给Pod一个宽限期(Grace Period)。如果在宽限期结束后资源使用仍然没有降低,Kubelet才会驱逐Pod。
4.2 查看node可用内存
kubectl describe node
Allocatable:
cpu: 15400m
ephemeral-storage: 1043358208Ki
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 63242364Ki #可分配60G内存
pods: 253
可分配内存为60G,而服务器内存为100G,
和现场同学确认,问题出现前由于内存占用很高,做过一次在线扩容。
故障复盘:故障原因为前期内存资源不足后,虚拟机采用在线扩容内存的方式,服务器没有重启,并且K8S的kubelet服务也没有重启,获取到的内存配置仍然是60G,所以当主机内存达到60G的时候出现pod由于内存不足产生驱逐。
至于监控,node-exporter可以动态获取主机物理资源,所以过于依赖监控却忽略了检查kubelet。
优化方案:对node内存和kubelet可分配内存做对比,如果相差大于1G则触发告警
更多推荐
已为社区贡献4条内容
所有评论(0)