K8s节点宕机自愈全流程

K8s节点宕机自愈全流程解析(含避坑指南)

作为管理过5000+节点集群的运维老兵,今天分享当Worker节点突然宕机时,Kubernetes内部如何实现秒级自愈。本文包含7大核心机制、3个真实故障案例,以及你必须要调的救命参数!


一、宕机事件时间轴(生死攸关的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驱逐顺序
  1. 无控制器管理的Pod(如裸Pod)
  2. ReplicaSet/DaemonSet管理的Pod
  3. StatefulSet管理的Pod(需特殊处理)
4. 优雅终止(Graceful Termination)
# Pod配置示例(务必设置!)
spec:
  terminationGracePeriodSeconds: 30   # 默认30秒
  containers:
  - name: app
    lifecycle:
      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: app
            operator: In
            values: [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: unhealthy
    weight: 100
  - name: healthy
    weight: 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小时。如果遇到具体问题,欢迎在评论区交流实战案例!

posted on 2025-03-16 15:11  Leo-Yide  阅读(294)  评论(0)    收藏  举报