K8s中大量Pod是Evicted状态,这是咋回事? | 您所在的位置:网站首页 › gta被驱逐了 › K8s中大量Pod是Evicted状态,这是咋回事? |
线上被驱逐实例数据 最近在线上发现很多实例处于 Evicted 状态,通过 pod yaml 可以看到实例是因为节点资源不足被驱逐,但是这些实例并没有被自动清理,平台的大部分用户在操作时看到服务下面出现 Evicted 实例时会以为服务有问题或者平台有问题的错觉,影响了用户的体验。而这部分 Evicted 状态的 Pod 在底层关联的容器其实已经被销毁了,对用户的服务也不会产生什么影响,也就是说只有一个 Pod 空壳在 k8s 中保存着,但需要人为手动清理。本文会分析为什么为产生 Evicted 实例、为什么 Evicted 实例没有被自动清理以及如何进行自动清理。 kubernetes 版本:v1.17 $ kubectl get pod | grep -i Evicted cloud-1023955-84421-49604-5-deploy-c-7748f8fd8-hjqsh 0/1 Evicted 0 73d cloud-1023955-84421-49604-5-deploy-c-7748f8fd8-mzd8x 0/1 Evicted 0 81d cloud-1237162-276467-199844-2-deploy-7bdc7c98b6-26r2r 0/1 Evicted 0 18dEvicted 实例状态: status: message: 'Pod The node had condition: [DiskPressure]. ' phase: Failed reason: Evicted startTime: "2021-09-14T10:42:32Z" 实例被驱逐的原因kubelet 默认会配置节点资源不足时驱逐实例的策略,当节点资源不足时 k8s 会停止该节点上实例并在其他节点启动新实例,在某些情况下也可通过配置 --eviction-hard= 参数为空来禁用驱逐策略,在之前的生产环境中我们也确实这么做了。 节点资源不足导致实例被驱逐k8s 中产生 Evicted 状态实例主要是因为节点资源不足实例主动被驱逐导致的,kubelet eviction_manager 模块会定期检查节点内存使用率、inode 使用率、磁盘使用率、pid 等资源,根据 kubelet 的配置当使用率达到一定阈值后会先回收可以回收的资源,若回收后资源使用率依然超过阈值则进行驱逐实例操作。 Eviction Signal Description memory.available memory.available := node.status.capacity[memory] - node.stats.memory.workingSet nodefs.available nodefs.available := node.stats.fs.available nodefs.inodesFree nodefs.inodesFree := node.stats.fs.inodesFree imagefs.available imagefs.available := node.stats.runtime.imagefs.available imagefs.inodesFree imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree pid.available pid.available := node.stats.rlimit.maxpid - node.stats.rlimit.curproc kubelet 中 pod 的 stats 数据一部分是通过 cAdvisor 接口获取到的,一部分是通过 CRI runtimes 的接口获取到的。 memory.available:当前节点可用内存,计算方式为 cgroup memory 子系统中 memory.usage_in_bytes 中的值减去 memory.stat 中 total_inactive_file 的值;nodefs.available:nodefs 包含 kubelet 配置中 --root-dir 指定的文件分区和 /var/lib/kubelet/ 所在的分区磁盘使用率;nodefs.inodesFree:nodefs.available 分区的 inode 使用率;imagefs.available:镜像所在分区磁盘使用率;imagefs.inodesFree:镜像所在分区磁盘 inode 使用率;pid.available:/proc/sys/kernel/pid_max 中的值为系统最大可用 pid 数;kubelet 可以通过参数 --eviction-hard 来配置以上几个参数的阈值,该参数默认值为 imagefs.available |
CopyRight 2018-2019 实验室设备网 版权所有 |