Kubernetes集群在高负载场景下,节点资源耗尽会导致Pod被驱逐(Evicted)。理解驱逐机制的触发条件和优先级逻辑,是构建稳定DevOps实践和监控告警体系的关键环节。本文从kubelet驱逐控制器的工作原理出发,给出资源压力诊断与节点稳定性保障的完整方案。
kubelet驱逐控制器工作原理:软驱逐与硬驱逐的触发阈值
kubelet持续监控节点的内存、磁盘、PID等资源。软驱逐在资源达到软阈值后启动优雅驱逐流程,等待evictionSoftGracePeriod时间后再开始驱逐,Pod有terminationGracePeriodSeconds(默认30秒)完成清理。硬驱逐在资源达到硬阈值后立即驱逐,直接发送SIGKILL。
evictionHard:
memory.available: 100Mi
nodefs.available: 10%
nodefs.inodesFree: 5%
imagefs.available: 15%
evictionSoft:
memory.available: 500Mi
nodefs.available: 15%
evictionSoftGracePeriod:
memory.available: 1m30s
nodefs.available: 2m
Pod驱逐优先级:QoS等级与优先级类的交互逻辑
驱逐时kubelet按以下顺序选择目标Pod:资源使用量超过request的Pod优先被驱逐;同等条件下BestEffort先于Burstable被驱逐,Burstable先于Guaranteed;同QoS等级下优先级类值低的Pod先被驱逐。
# Guaranteed QoS(CPU和Memory的request=limit)
apiVersion: v1
kind: Pod
metadata:
name: critical-api
spec:
priorityClassName: high-priority
containers:
- name: api
image: api-server:v2.4
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "2"
memory: "4Gi"
核心业务Pod应配置为Guaranteed QoS配合高优先级类,确保最后被驱逐。批处理任务配置为BestEffort QoS配合低优先级类,充当资源缓冲。
资源压力诊断:从kubectl到Prometheus的监控链路
# 查看节点资源使用率和压力状态
kubectl describe node worker-03 | grep -A 5 "Conditions:"
# 查看被驱逐的Pod及其原因
kubectl get pods -A --field-selector=status.phase=Failed | grep Evicted
kubectl get pod <pod-name> -o jsonpath='{.status.message}'
# 检查Pod资源使用排名
kubectl top pods --sort-by=memory -n production | head -20
node Conditions中MemoryPressure、DiskPressure、PIDPressure三个状态反映节点压力。Prometheus告警规则:
- alert: NodeMemoryPressure
expr: kube_node_status_condition{condition="MemoryPressure", status="true"} == 1
for: 5m
labels:
severity: warning
- alert: PodEvicted
expr: increase(kube_pod_container_status_terminated_reason{reason="Evicted"}[5m]) > 0
labels:
severity: critical
避免误驱逐:资源超卖控制与system-reserved配置
PodDisruptionBudget只对自愿中断(如kubectl drain)生效,不能阻止kubelet的资源驱逐。需要从资源规划层面解决:
# /var/lib/kubelet/config.yaml
systemReserved:
cpu: "1"
memory: "2Gi"
kubeReserved:
cpu: "500m"
memory: "1Gi"
enforceNodeAllocatable:
- pods
- system-reserved
- kube-reserved
enforceNodeAllocatable中包含system-reserved和kube-reserved时,kubelet通过cgroup硬限制系统组件资源使用,防止它们侵占Pod可用资源配额。
故障应急响应:节点驱逐后的自动恢复与扩容
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-server
minReplicas: 3
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
常见根因包括:Pod内存泄漏(request设置合理但实际使用持续增长)、日志文件撑满磁盘、僵尸进程积累导致PID耗尽。长期优化方面,调整resource request以匹配真实使用量(建议按P95使用量的1.2倍设置request),启用emptyDir.sizeLimit限制临时文件大小,配置日志轮转策略避免磁盘写满。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetespod-qu-zhu-ji-zhi-jie-xi-zi-yuan-ya-li-zhen-duan/