AWS EKS 节点组管理:基于 Auto Scaling Node Group 实现节点故障自动替换

1. 核心概念
  • Auto Scaling Node Group:EKS 的托管式节点组,通过集成 AWS Auto Scaling 实现:
    • 自动检测节点健康状态(如 kubelet 故障)
    • 按策略自动替换异常节点
    • 动态调整节点数量(基于 CPU/内存负载)
  • 故障自愈流程
    graph LR
      A[节点故障] --> B(CloudWatch 检测指标异常)
      B --> C(Auto Scaling 终止异常实例)
      C --> D(启动新节点加入集群)
      D --> E[节点组恢复目标容量]
    

2. 配置步骤
2.1 创建托管节点组(AWS 控制台/CLI)
eksctl create nodegroup \
  --cluster my-cluster \
  --name fault-tolerant-ng \
  --region us-west-2 \
  --nodes-min 3 \
  --nodes-max 10 \
  --node-type t3.medium \
  --managed

2.2 关键 Auto Scaling 策略
  • 健康检查配置
    "HealthCheckType": "EC2",  // 检测实例级故障
    "HealthCheckGracePeriod": 300  // 5分钟宽限期
    

  • 替换策略(CloudFormation 片段):
    NodeGroup:
      Type: AWS::EKS::Nodegroup
      Properties:
        ScalingConfig:
          MinSize: 3
          MaxSize: 10
          DesiredSize: 3
        UpdateConfig:
          MaxUnavailable: 1  // 滚动更新时最大不可用节点数
    

2.3 故障模拟测试
  1. 手动终止节点:
    kubectl drain <故障节点> --ignore-daemonsets --delete-emptydir-data
    

  2. 观察事件流:
    kubectl get events -w
    

  3. 验证新节点自动加入:
    kubectl get nodes -o wide
    

3. 最佳实践
  • 多可用区部署:在 eksctl 配置中添加 --zones=us-west-2a,us-west-2b
  • Pod 中断预算(PDB):
    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      name: zk-pdb
    spec:
      minAvailable: 2  // 保证至少2个Pod可用
      selector:
        matchLabels:
          app: zookeeper
    

  • 监控指标
    • CloudWatch 告警:ClusterManagerNodeUnhealthy
    • Prometheus 指标:kube_node_status_condition{condition="Ready"}
4. 故障排查
  • 常见问题
    • 节点卡在 NotReady 状态 → 检查 kubelet 日志
    • 新节点无法加入 → 验证 IAM 角色权限
  • 诊断命令
    # 检查 Auto Scaling 活动
    aws autoscaling describe-scaling-activities --auto-scaling-group-name <ASG_NAME>
    
    # 查看节点初始化日志
    kubectl logs -n kube-system <节点上的aws-node-pod>
    

注意:启用 --managed 节点组时,AWS 会自动处理节点更新、安全补丁和故障替换,但需确保 VPC 子网有足够 IP 容量(建议预留 20% 缓冲)。

更多推荐