如何强制替换EKS托管节点组中的旧版本节点?
解决EKS托管节点组残留旧版本节点的问题
问题背景
升级EKS集群到1.22版本(先控制平面,再节点)后,托管节点组显示版本为1.22,但集群中出现一个运行1.21版本的节点。执行kubectl get nodes可见:
NAME STATUS ROLES AGE VERSION ip-10-13-10-186.ap-northeast-1.compute.internal Ready <none> 4h39m v1.22.12-eks-ba74326 ip-10-13-26-91.ap-northeast-1.compute.internal Ready <none> 3h3m v1.21.14-eks-ba74326 ip-10-13-40-42.ap-northeast-1.compute.internal Ready <none> 4h33m v1.22.12-eks-ba74326
通过eksctl get nodegroup default-20220901053307980400000010 --cluster mycluster-dev -o yaml查看节点组,确认版本为1.22:
- AutoScalingGroupName: eks-default-20220901053307980400000010-f8c17xc4-f750-d608-d166-113925c1g9c5 Cluster: mycluster-dev CreationTime: "2022-09-01T05:33:11.484Z" DesiredCapacity: 3 ImageID: AL2_x86_64 InstanceType: t3.large MaxSize: 3 MinSize: 3 Name: default-20220901053307980400000010 NodeInstanceRoleARN: arn:aws:iam::XXXXXXXXXXX:role/eks_node_group_dev_role-20220901052135822100000004 StackName: "" Status: ACTIVE Type: managed Version: "1.22"
手动删除旧节点后,集群未自动重建节点,当前仅剩余2个节点,需要强制替换旧版本节点以使用正确的kubelet版本。
解决方案
方法1:通过eksctl强制刷新节点组实例
执行以下命令触发节点组滚动更新,强制替换所有不符合版本的实例:
eksctl upgrade nodegroup --cluster mycluster-dev --name default-20220901053307980400000010 --kubernetes-version 1.22 --force
该命令会分批替换节点,保证集群可用性,最终所有节点都会更新到1.22版本。
方法2:手动触发Auto Scaling Group(ASG)实例刷新
- 登录AWS控制台,找到对应节点组的ASG(即
eks-default-20220901053307980400000010-f8c17xc4-f750-d608-d166-113925c1g9c5)。 - 进入实例刷新标签页,点击开始实例刷新。
- 设置参数:
- 最小健康百分比:建议设为67%(3节点集群保留2个健康节点)
- 实例终止策略:选择OldestInstance,优先替换旧版本节点
- 启动刷新后,ASG会逐步替换旧实例为符合节点组配置的1.22版本实例。
方法3:调整ASG容量触发重建
如果手动删除节点后ASG未自动补全,可通过临时调整容量触发新节点创建:
- 临时将ASG期望容量调至4:
aws autoscaling update-auto-scaling-group --auto-scaling-group-name eks-default-20220901053307980400000010-f8c17xc4-f750-d608-d166-113925c1g9c5 --desired-capacity 4
- 待新的1.22版本节点加入集群后,删除旧的1.21版本节点:
kubectl delete node ip-10-13-26-91.ap-northeast-1.compute.internal
- 再将ASG期望容量调回3:
aws autoscaling update-auto-scaling-group --auto-scaling-group-name eks-default-20220901053307980400000010-f8c17xc4-f750-d608-d166-113925c1g9c5 --desired-capacity 3
方法4:检查并更新启动模板
如果节点组关联的启动模板仍指向旧版本镜像,需更新模板后触发更新:
- 查看节点组关联的启动模板:
eksctl get nodegroup default-20220901053307980400000010 --cluster mycluster-dev -o json | jq '.[].LaunchTemplate'
- 查询EKS 1.22对应的AL2镜像ID:
aws ssm get-parameter --name /aws/service/eks/optimized-ami/1.22/amazon-linux-2/recommended/image_id --region ap-northeast-1 --query Parameter.Value --output text
- 更新启动模板至最新版本,然后触发节点组更新:
eksctl update nodegroup --cluster mycluster-dev --name default-20220901053307980400000010 --launch-template-version '$Latest'
内容的提问来源于stack exchange,提问作者AlexW
相关产品推荐
相关产品推荐

