参考资料
- 更新现有自行管理的节点组
使用eks自管节点组能够最大程度控制节点的各项配置和参数,包括并不限于ami,节点类型等
但是使用自管节点也给用户带来了较大的维护和更新成本。对于节点组的更新操作,我们可以使用cloudformation的方式进行。
官方的cloudformation模板创建的自管节点组,在更新过程中通过autoscaling group的更新策略控制节点组的具体更新行为。
最新的默认 Amazon EKS 节点 Amazon CloudFormation 模板将配置为使用新 AMI 在集群中启动实例,然后再删除旧 AMI,一次删除一个。此配置可确保您在滚动更新期间始终具有集群中 Auto Scaling 组所需的活动实例计数
eksctl创建的自管节点组不支持此方法
官方的cfn模板:https://s3.cn-north-1.amazonaws.com.cn/amazon-eks/cloudformation/2020-10-29/amazon-eks-nodegroup.yaml
和节点组更新相关的资源主要有以下
NodeGroup:
Type: "AWS::AutoScaling::AutoScalingGroup"
Properties:
DesiredCapacity: !Ref NodeAutoScalingGroupDesiredCapacity
LaunchTemplate:
LaunchTemplateId: !Ref NodeLaunchTemplate
Version: !GetAtt NodeLaunchTemplate.LatestVersionNumber
MaxSize: !Ref NodeAutoScalingGroupMaxSize
MinSize: !Ref NodeAutoScalingGroupMinSize
Tags:
- Key: Name
PropagateAtLaunch: true
Value: !Sub ${ClusterName}-${NodeGroupName}-Node
- Key: !Sub kubernetes.io/cluster/${ClusterName}
PropagateAtLaunch: true
Value: owned
VPCZoneIdentifier: !Ref Subnets
UpdatePolicy:
AutoScalingRollingUpdate:
MaxBatchSize: 1
MinInstancesInService: !Ref NodeAutoScalingGroupDesiredCapacity
PauseTime: PT5M
以上NodeGroup资源的创建过程中,通过UpdatePolicy策略的方式指定了asg的更新规则
指定 CloudFormation 处理 Auto Scaling 组的滚动更新方式,请使用
AutoScalingRollingUpdate
策略。对于滚动更新,您可以指定 AWS CloudFormation 是批量更新 Auto Scaling 组中的实例,还是一次性更新所有实例
cfn更新失败回滚之后会使用之前模板中的更新策略,因此务必将资源和更新策略分开更新
在堆栈更新中对
UpdatePolicy
配置进行更改时,我们建议您将该更新与可能启动滚动更新的任何AWS::AutoScaling::AutoScalingGroup
资源更新分开,并在这些资源更新之前进行
模板中更新策略涉及到的三个参数如下,还可以按需设置其他策略
AutoScalingReplacingUpdate 策略
(1)MaxBatchSize
- cfn每次更新实例的最大数量
(2)MinInstancesInService
- cfn更新实例过程中处于inservice状态的最少实力数量,必须少于asg的maxsize
(3)PauseTime
- cfn等待实例启动应用程序的时间,如果配置了
WaitOnResourceSignals
,则表示在接受到所需数量信号(cfn-signal)之前的总的等待时间。使用 ISO8601 持续时间格式指定PauseTime
。最大PauseTime
为 1 小时 (PT1H
)
通过以上策略,cfn能够保证每次更新一个实例,同时最少有3个节点处于服务状态,避免由于节点更新带来的业务中断
Rolling update initiated. Terminating 3 obsolete instance(s) in batches of 1, while keeping at least 3 instance(s) in service. Pausing for PT5M when new instances are added to the autoscaling group.
比较难以理解的是,在创建asg的过程中并没有找到以上参数的配置,所以节点的更新行为是由cloudformation来配置的,但是查看cloudtrail记录,具体的实例启动和停止又是又asg的服务角色来执行的,所以目测这个更新策略是独属于cfn的配置。