K8s节点宕机自愈全流程解析
一、宕机事件时间轴(生死攸关的5分钟)
# 查看节点状态变化时间线
kubectl describe node <node-name> | grep -i 'condition'# 典型事件序列
0s : Node失去响应(硬件故障/内核崩溃)
40s : 节点状态变为NotReady(node-monitor-grace-period默认值)
5m0s : 节点状态变为Unreachable(默认pod-eviction-timeout)
5m+ : 触发Pod驱逐流程
二、核心驱逐流程七步拆解
1. 心跳检测机制
关键组件:
- kubelet(每10秒上报心跳)
- kube-controller-manager(每5秒检查)
救命参数:
# 调整控制器容忍时间(必须大于网络抖动时间)
--node-monitor-grace-period=60s # 默认40s
--pod-eviction-timeout=3m # 默认5m
2. 污点标记(Taint)
# 节点被标记不可调度
kubectl taint nodes <node-name> node.kubernetes.io/unreachable:NoExecute
3. Pod驱逐顺序
- 无控制器管理的Pod(如裸Pod)
- ReplicaSet/DaemonSet管理的Pod
- StatefulSet管理的Pod(需特殊处理)
4. 优雅终止(Graceful Termination)
# Pod配置示例(务必设置!)
spec:terminationGracePeriodSeconds: 30 # 默认30秒containers:- name: applifecycle:preStop:exec:command: ["/bin/sh", "-c", "sleep 10; nginx -s quit"]
5. 存储卷处理
有状态服务必须配置:
persistentVolumeReclaimPolicy: Retain # 防止数据误删
volumeBindingMode: WaitForFirstConsumer # 避免跨节点挂载
6. 新Pod调度
调度策略优化:
apiVersion: v1
kind: Pod
spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues: [web]topologyKey: kubernetes.io/hostname
7. 最终一致性达成
# 检查副本状态
watch kubectl get pods -l app=web -o wide
三、生产环境必调参数
参数名 | 默认值 | 生产推荐值 | 作用 |
---|---|---|---|
node-monitor-grace-period | 40s | 60s | 节点失联容忍时间 |
pod-eviction-timeout | 5m | 3m | 驱逐触发延迟 |
terminationGracePeriodSeconds | 30s | 按业务调整 | 优雅终止等待时间 |
maxUnavailable (PDB) | 1 | 20% | 最大不可用副本数 |
四、三大真实故障案例
案例1:雪崩驱逐
现象:节点失联导致所有Pod同时被驱逐,触发DB连接池爆满
解决方案:
# 配置PodDisruptionBudget
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:name: db-pdb
spec:minAvailable: 50% # 至少保留一半实例selector:matchLabels:app: database
案例2:僵尸Pod
现象:节点恢复后残留Pod无法自动清理
根因:--pod-eviction-timeout设置过短
修复:
kubectl delete node <node-name> --force --grace-period=0
案例3:存储卷死锁
现象:Pod无法在其他节点启动,提示Volume已挂载
解决方案:
# 强制解绑云盘(以AWS为例)
aws ec2 detach-volume --volume-id vol-xxx --force
五、自愈能力增强方案
1. 节点自动修复
# 使用Cluster Autoscaler自动替换节点
expander: priority
priorities:- name: unhealthyweight: 100- name: healthyweight: 1
2. 宕机预检脚本
#!/bin/bash
# 检测硬件故障迹象
smartctl -H /dev/sda | grep FAILED
ipmitool sel list | grep -i critical
3. 宕机演练工具
# 使用Chaos Mesh模拟节点故障
kubectl apply -f https://raw.githubusercontent.com/chaos-mesh/chaos-mesh/master/examples/node-failure.yaml
六、监控指标体系
监控指标 | 告警阈值 | 检测工具 |
---|---|---|
Node NotReady持续时间 | >2分钟 | kube-state-metrics |
Pod驱逐频率 | >10次/小时 | Prometheus |
存储卷挂载失败率 | >5% | 云厂商API |
API Server延迟 | >500ms | Blackbox Exporter |
血泪经验:
- 生产环境务必配置PodDisruptionBudget
- StatefulSet必须搭配持久化存储
- 定期演练节点宕机场景
节点宕机不是会不会发生,而是何时发生的问题。掌握这套自愈机制,能让你在深夜告警响起时多睡2小时。如果遇到具体问题,欢迎在评论区交流实战案例!