当Kubernetes节点面临资源压力时,系统会触发Eviction(驱逐)机制来释放资源。但驱逐并非随机发生,而是遵循一套明确的优先级规则。理解这些规则,对于保障关键服务的稳定性至关重要。
为什么会发生Pod驱逐?
节点资源不足是Pod驱逐的根本原因,常见场景包括:
- 内存不足(MemoryPressure):最为常见。
- 磁盘空间不足(DiskPressure)。
- inode耗尽。
- 节点整体压力过高。
由于内存资源无法像CPU那样被抢占回收,因此当节点资源紧张时,驱逐(Eviction)和OOM(内存溢出)杀死便成为Kubernetes维持系统稳定的主要手段。
驱逐优先级核心:QoS类别
Kubernetes根据Pod设置的资源请求(requests)和限制(limits),定义了三种服务质量(QoS)类别,这直接决定了Pod在资源危机下的“生存权”。
1. BestEffort(优先级最低,最易被驱逐)
- 特征:未设置任何
requests或limits。
- 驱逐顺序:系统会优先驱逐此类Pod,因为它们没有声明所需的资源保障。
2. Burstable(中等优先级)
- 特征:设置了部分
request或limit,但CPU和内存的request与limit值不完全相等。
- 驱逐顺序:资源不足时可能被驱逐,优先级高于BestEffort,但低于Guaranteed。
3. Guaranteed(优先级最高,最不易被驱逐)
- 特征:CPU和内存均设置了等值的
request与limit。
- 驱逐顺序:受到最高级别的保护,只有在系统资源极度紧张时才会被考虑驱逐。
简单排序:BestEffort → Burstable → Guaranteed(越向右越安全)。这是作为云原生编排核心的Kubernetes确保关键业务不受影响的基础机制。
节点压力驱逐策略
kubelet会持续监控节点状态,当检测到特定资源压力时,会触发相应的驱逐策略:
- 内存压力(MemoryPressure):最常见。kubelet会依据QoS优先级开始驱逐Pod。
- 磁盘压力(DiskPressure):系统会先尝试清理未使用的容器镜像、日志文件等,若清理后仍不足,才会驱逐Pod。
- PID压力(PIDPressure):Pod内进程数过多也可能触发驱逐。
- 节点不可用:当节点失联或NotReady时,会触发软驱逐(soft eviction),并可能最终删除Pod。
区分Pod内存不足:OOMKilled vs. Evicted
OOMKilled(内存溢出杀死)与Evicted(驱逐)是两种不同的故障状态,不可混淆。
| 特征 |
OOMKilled |
Evicted |
| 触发原因 |
Pod自身内存使用量超过设定的limit。 |
节点整体资源不足,kubelet主动做出的淘汰决策。 |
| 决策者 |
Linux内核cgroup的OOM Killer。 |
kubelet。 |
| Pod状态 |
容器被杀死,但Pod可能被控制器重建。 |
Pod状态变为Evicted(已驱逐),此状态不可恢复,需等待控制器重建新Pod。 |
| 根本区别 |
Pod“吃得太多”,超出了自己的配额。 |
节点“养不起”所有Pod,需要牺牲部分Pod以保全整体。 |
如何降低Pod被驱逐的风险?
遵循以下运维最佳实践,可以有效保护你的应用:
-
为关键业务配置Guaranteed QoS
确保CPU和内存的requests与limits值相等。
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "500m"
-
避免使用BestEffort类别
未声明资源的Pod在集群中如同“透明人”,是资源紧张时首要的清理对象。
-
合理设置Resource Requests
请求(request)值设置得过低,会导致Pod在调度后因资源竞争激烈而更容易被驱逐。应根据应用实际负载进行合理评估。
-
管理节点磁盘空间
定期清理节点上的旧日志(如/var/log)、未使用的容器镜像和临时文件,预防DiskPressure。
-
利用Pod优先级(PriorityClass)
为关键服务定义更高的PriorityClass,这不仅能影响调度顺序,也会在驱逐决策中赋予其更高的权重。
驱逐顺序终极总结
综合Pod优先级(PriorityClass)和QoS类别,Kubernetes的驱逐顺序从高到低(从最易被杀到最难被杀)如下:
- 低优先级 + BestEffort Pod
- 低优先级 + Burstable Pod
- 高优先级 + Burstable Pod
- 高优先级 + Guaranteed Pod(最后考虑)
核心逻辑是:Kubernetes会竭力保护那些既重要(高优先级)又有明确资源规划(Guaranteed)的Pod。
总结
Pod驱逐是Kubernetes在资源压力下保障集群整体健康的生存法则,而非随机事件。通过理解QoS机制、区分OOM与Eviction、并合理配置资源请求与限制,开发者可以确保核心应用在动荡的资源环境中保持稳定运行。
|