更新 AWS CloudFormation 节点堆栈
本主题介绍如何使用新 AMI 更新现有 AWS CloudFormation 自行管理的节点堆栈。在集群更新后,可以使用此过程将节点更新为新版本的 Kubernetes。或者,您可以更新到针对现有 Kubernetes 版本的最新 Amazon EKS 优化 AMI。
重要
本主题介绍适用于自行管理的节点的节点更新。有关使用托管式节点组简化节点生命周期的信息,请参阅更新集群的托管式节点组。
最新的默认 Amazon EKS 节点 AWS CloudFormation 模板将配置为使用新 AMI 在集群中启动实例,然后再删除旧 AMI,一次删除一个。此配置可确保您在滚动更新期间始终具有集群中自动扩缩组所需的活动实例计数。
注意
使用 eksctl
创建的节点组不支持此方法。如果您使用 eksctl
创建了集群或节点组,请参阅 将应用程序迁移到新的节点组。
-
确定集群的 DNS 提供商。
kubectl get deployments -l k8s-app=kube-dns -n kube-system
示例输出如下。此集群使用 CoreDNS 解析 DNS,但您的集群可能会返回
kube-dns
。您的输出可能看起来有所不同,具体取决于您使用的kubectl
版本。NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE coredns 1 1 1 1 31m
-
如果您的当前部署所运行的副本少于 2 个,请将部署扩展到 2 个副本。如果您的上一个命令输出返回了该项,请将
coredns
替换为kube-dns
。kubectl scale deployments/coredns --replicas=2 -n kube-system
-
(可选)如果使用 Kubernetes Cluster Autoscaler
,请将部署缩减到 0 个副本以避免相互冲突的扩缩操作。 kubectl scale deployments/cluster-autoscaler --replicas=0 -n kube-system
-
确定当前节点组的实例类型和所需的实例计数。以后更新该组的 AWS CloudFormation 模板时将输入这些值。
-
通过以下网址打开 Amazon EC2 控制台:https://console.aws.amazon.com/ec2/
。 -
请在左侧导航窗格中,选择 Launch Configurations(启动配置),然后记下现有节点启动配置的实例类型。
-
请在左侧导航窗格中,选择 Auto Scaling Groups(Auto Scaling 组),并记下现有节点 Auto Scaling 组的 Desired(所需)实例计数。
-
-
选择您的节点组堆栈,然后选择 Update(更新)。
-
选择替换当前模板,然后选择 Amazon S3 URL。
-
对于 Amazon S3 URL,请将以下 URL 粘贴到文本区域中以确保您使用的是最新版本的节点 AWS CloudFormation 模板。接下来,选择 Next(下一步):
https://s3.us-west-2.amazonaws.com/amazon-eks/cloudformation/2022-12-23/amazon-eks-nodegroup.yaml
-
在 Specify stack details (指定堆栈详细信息) 页面上,填写以下参数,然后选择 Next (下一步):
-
NodeAutoScalingGroupDesiredCapacity - 输入在上一步记录的所需实例计数。或者输入更新堆栈时要扩展到的所需节点数目。
-
NodeAutoScalingGroupMaxSize:输入您的节点 Auto Scaling 组可横向扩展到的最大节点数。此值必须比所需容量多至少一个节点。这样更新期间可以对节点进行滚动更新而不会减少节点数。
-
NodeInstanceType - 选择在上一步记录的实例类型。也可以为节点选择不同的实例类型。在选择其它实例类型之前,请查看选择最优的 Amazon EC2 节点实例类型。每种 Amazon EC2 实例类型支持最大数量的弹性网络接口(网络接口),每个网络接口都支持最大数量的 IP 地址。由于为每个 Worker 节点和 Pod 分配了自己的 IP 地址,因此请务必选择一个实例类型,该实例类型可以支持您希望在每个 Amazon EC2 节点上运行的最大数量的 Pods。有关实例类型支持的网络接口和 IP 地址数量的列表,请参阅每种实例类型的每个网络接口的 IP 地址数。例如,
m5.large
实例类型最多支持 Worker 节点和 Pods 的 30 个 IP 地址。注意
对于适用于 Kubernetes 的 Amazon VPC CNI 插件
的最新版本,所支持的实例类型在 GitHub 上的 vpc_ip_resource_limit.go 中显示。您可能需要更新 Amazon VPC CNI plugin for Kubernetes 版本以使用最新的受支持实例类型。有关更多信息,请参阅 Amazon VPC CNI。 重要
一些实例类型并非在所有 AWS 区域中都可用。
-
NodeImageIdSSMParam – 要更新到的 AMI ID 的 Amazon EC2 Systems Manager 参数。以下值为 Kubernetes 版本
1.30
使用最新 Amazon EKS 优化版 AMI。/aws/service/eks/optimized-ami/1.30/amazon-linux-2/recommended/image_id
可以将
1.30
替换为支持的 Kubernetes 版本。或者,它应该比控制面板上运行的 Kubernetes 版本高最多一个版本。我们建议您将节点保持在与控制层面相同的版本。您也可以将amazon-linux-2
替换为其它 AMI 类型。有关更多信息,请参阅 检索建议的 Amazon Linux AMI ID。注意
使用 Amazon EC2 Systems Manager 参数让您可以在以后更新节点而无需查找和指定 AMI ID。如果您的 AWS CloudFormation 堆栈使用此值,则任何堆栈更新将为您指定的 Kubernetes 版本始终启动最新建议的 Amazon EKS 优化版 AMI。即使不更改模板中的任何值,情况也是如此。
-
NodeImageId – 要使用您的自定义 AMI,请输入要使用的 AMI 的 ID。
重要
此值覆盖为 NodeImageIdSSMParam 指定的任意值。如果您要使用 NodeImageIdSSMParam 值,请确保 NodeImageId 的值为空白。
-
DisableIMDSv1 - 每个节点默认支持实例元数据服务版本 1 (IMDSv1) 和 IMDSv2。但可以禁用 IMDSv1。如果不希望节点组中计划的任何节点或任何 Pods 使用 IMDSv1,请选择 true(真)。有关 IMDS 的更多信息,请参阅配置实例元数据服务。如果已为服务账户实施 IAM 角色,请将所需权限直接分配给需要访问 AWS 服务的所有 Pods。这样,集群中就没有任何 Pods 需要出于其它原因(例如检索当前 AWS 区域)访问 IMDS。然后,对于不使用主机网络的 Pods,您还可以禁用 IMDSv2 的访问权限。有关更多信息,请参阅限制对分配给工作节点的实例配置文件的访问
。
-
-
(可选)在 Options (选项) 页面上,为您的堆栈资源添加标签。选择下一步。
-
在 Review(审核)页面上审核您的信息,确认堆栈可创建 IAM 资源,然后选择 Update stack(更新堆栈)。
注意
集群中每个节点的更新需要几分钟时间。等待所有节点更新完成,然后再执行后续步骤。
-
如果您的集群的 DNS 提供商是
kube-dns
,请将kube-dns
部署横向缩减为 1 个副本。kubectl scale deployments/kube-dns --replicas=1 -n kube-system
-
(可选)如果您使用的是 Kubernetes Cluster Autoscaler
,请将部署缩减为所需数量的副本。 kubectl scale deployments/cluster-autoscaler --replicas=1 -n kube-system
-
(可选)确认您使用的是最新版本的 Kubernetes 的 Amazon VPC CNI 插件
。您可能需要更新 Amazon VPC CNI plugin for Kubernetes 版本以使用最新的受支持实例类型。有关更多信息,请参阅 Amazon VPC CNI。