k8s eviction机制

本文深入探讨了Kubernetes中EvictionManager的工作原理,详细解释了如何通过soft和hard阈值判断节点资源是否处于饥饿状态,以及如何根据GracePeriod成员的设置决定Pod的驱逐策略。

kubelete端:

创建eviction manager然后一直的去执行synchronize,synchronize函数会去计算node的是否超过阈值,没有则返回,过一段时间在计算,有超过则killpod.hardEvicthon则过一段时间再去

计算节点阈值情况:
// determine the set of resources under starvation
starvedResources := reclaimResources(thresholds)
if len(starvedResources) == 0 {
   glog.V(3).Infof("eviction manager: no resources are starved")
   return
}

soft的eviction是通过过滤graceperiod时间还是满足threshold,则进行evict

hard的监控到超过threshold则直接进行evict

综上:soft和hard的处理是通过threshold的GracePeriod成员,并设置其值,0表示hard,其他表示soft,并根据这个threshold来排序activepod,每次执行synchronize只删除一个pod.

 

<think>嗯,用户想了解Kubernetes的驱逐机制及其最佳实践。这是个比较专业的容器编排管理问题,需要从系统设计和运维角度来解析。 用户可能是DevOps工程师或云原生开发者,正在处理集群资源管理问题。从ta直接要"解释和最佳实践"来看,可能已经遇到实际驱逐事件,需要理论结合实践的指导。深层需求应该是想避免生产环境因资源不足导致Pod被意外终止。 Kubernetes驱逐机制涉及多个层次:首先是资源监控体系,kubelet持续追踪节点内存、磁盘等指标;其次是软硬驱逐阈值设定,这里要区分可配置的驱逐信号类型;最后是实际驱逐策略执行时的优先级排序逻辑。用户可能特别关心如何平衡资源利用率和应用稳定性。 关于最佳实践,需要强调三点核心:资源请求/限制的合理设置(避免内存黑洞应用)、监控体系的完善(Prometheus+Alertmanager组合)、以及优雅终止的配置(preStop钩子的正确使用)。用户如果使用有状态服务,还需要额外关注local storage的清理问题。 考虑到用户后续可能深入排查,补充了PodDisruptionBudget和kubelet日志的实用技巧。这些在真实故障排查时都是关键突破口。最后生成的问题链覆盖了从理论(QoS分类)到实践(API调优),再到具体场景(批处理系统),应该能覆盖用户可能的延伸需求。 特别要注意的是,在解释memory.available这类指标时需要用行内公式明确其计算逻辑$memory.available = node_capacity - working_set$,但用户文档往往不强调这个细节,容易导致阈值配置失误。</think>以下是关于 Kubernetes 驱逐机制的解释与最佳实践: --- ### **Kubernetes 驱逐机制详解** #### 1. **驱逐触发条件** 当节点资源(如内存、磁盘)不足时,kubelet 会触发驱逐以保护节点稳定性: - **内存压力**:当 `memory.available` 低于阈值时(默认值:`100MiB`) - **磁盘压力**: - `nodefs`(根分区)可用空间不足(默认:`10%`) - `imagefs`(容器运行时存储)可用空间不足(默认:`15%`) - **PID 不足**(可选配置) 驱逐阈值可通过 kubelet 参数调整,例如: ```bash --eviction-hard=memory.available<500Mi,nodefs.available<5% ``` #### 2. **驱逐优先级** kubelet 按以下顺序驱逐 Pod[^1]: 1. **BestEffort** → **Burstable** → **Guaranteed**(QoS 等级) 2. 资源使用量超过请求量(`requests`)的 Pod 优先 3. 按优先级(PriorityClass)排序,低优先级 Pod 先被驱逐 #### 3. **驱逐类型** | **类型** | **行为** | |----------------|--------------------------------------------------------------------------| | **软驱逐** | 在阈值触发后等待宽限期(如 `memory.available<1Gi` 持续 2 分钟) | | **硬驱逐** | 立即终止 Pod(无宽限期) | | **主动驱逐** | kubelet 主动监控资源并触发 | | **API 驱逐** | 用户通过 `kubectl drain` 或 Eviction API 手动触发 | --- ### **最佳实践** #### 1. **资源请求与限制** ```yaml resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" # 避免过高,防止被 OOMKill ``` - **关键点**:所有 Pod 必须设置 `requests`,否则会被视为最高资源消耗者优先驱逐。 #### 2. **优雅终止处理** ```yaml lifecycle: preStop: exec: command: ["sh", "-c", "sleep 30; nginx -s quit"] # 留出清理时间 terminationGracePeriodSeconds: 60 ``` #### 3. **监控与告警** - 监控指标: - `kube_node_status_condition{condition="DiskPressure"}` - `kube_pod_status_reason{reason="Evicted"}` - 推荐工具:Prometheus + Grafana + kube-state-metrics #### 4. **配置优化** - **调整阈值**(在 `/var/lib/kubelet/config.yaml`): ```yaml evictionHard: memory.available: "500Mi" nodefs.available: "10%" evictionSoftGracePeriod: memory.available: 1m30s ``` - **启用本地存储清理**: ```bash --feature-gates=LocalStorageCapacityIsolation=true ``` #### 5. **特殊场景处理** - **有状态应用**:使用 `PodDisruptionBudget` 保障最小可用实例数 ```yaml apiVersion: policy/v1 kind: PodDisruptionBudget spec: minAvailable: 2 # 保证至少 2 个 Pod 运行 selector: matchLabels: app: mysql ``` - **关键系统组件**:通过 `priorityClassName: system-cluster-critical` 避免驱逐 --- ### **故障排查命令** ```bash # 查看被驱逐的 Pod kubectl get pods -A | grep Evicted # 检查节点资源压力 kubectl describe node <node-name> | grep -i pressure # 查看 kubelet 日志(Linux 系统) journalctl -u kubelet | grep -i eviction ``` > ⚠️ **经验总结**: > 生产集群中,**80% 的驱逐事件源于未设置 `requests`** 或 `limits` 配置不合理。定期通过 `kubectl top pods` 监控实际资源使用,结合 HPA 实现动态扩缩容,可显著减少驱逐发生[^2]。 --- ### 相关问题 1. **如何为 Kubernetes 集群设置合理的资源请求(requests)和限制(limits)?** 2. **PodDisruptionBudget 在集群升级时如何保障应用可用性?** 3. **Kubernetes 中 OOMKill 与驱逐机制的关联与区别是什么?** 4. **如何通过 Prometheus 实现驱逐事件的自动化告警?** 5. **在混合部署场景(在线+离线业务)下,如何优化驱逐策略?** [^1]: Kubernetes 官方文档 - [驱逐策略](https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/) [^2]: 《Kubernetes in Action》第 14 章 - 资源管理与调度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值