k8s pod内存驱逐问题解决

发布于:2024-07-01 ⋅ 阅读:(22) ⋅ 点赞:(0)

背景:突然收到 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则触发告警