如何对 Amazon EKS 节点组更新失败的常见问题进行故障排除?

如何对 Amazon EKS 节点组更新失败的常见问题进行故障排除?

我想使用最新的亚马逊云机器镜像(AMI)版本更新我的 Amazon Elastic Kubernetes Service(Amazon EKS)节点组。
如何对 Amazon EKS 节点组更新失败的常见问题进行故障排除? 2023-08-22 17:55:48
如何对 Amazon EKS 节点组更新失败的常见问题进行故障排除? 0
如何对 Amazon EKS 节点组更新失败的常见问题进行故障排除?
## 简短描述 Amazon EKS 的较新版本还包括用于节点组更新的新版本 Amazon AMI。如果客户将其工作负载部署在多个节点组上,则他们将面临更新节点以紧跟发布周期的挑战。 在您启动托管节点组更新时,Amazon EKS 会自动为您更新节点。如果您正在使用 Amazon EKS 优化型 AMI,则 Amazon EKS 会自动将最新的安全补丁和操作系统更新作为最新 AMI 发行版本的一部分应用到您的节点。为了实施更新,Amazob Auto Scaling 会在节点组中存在节点的每个可用区启动节点。该服务还会重新平衡可用区。由于现有节点仅耗尽一次,因此启动步骤会成功。缩减阶段将自动扩缩组的最大大小和所需大小递减一个单位以返回到更新前的值。有关更多信息,请参阅[托管节点更新行为](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-update-behavior.html?trk=cndc-detail)中的“缩减阶段”。 ## 解决方法 在此更新过程中,您可能看到以下一些错误,且需要针对这些错误采取缓解措施。提前注意这些问题可以最大限度地减少停机时间。有关更新错误的更多信息,请参阅[托管节点更新行为](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-update-behavior.html?trk=cndc-detail)。 ### 由于 PodEvictionFailure,更新失败 ``` Error message : Reached max retries while trying to evict pods from nodes in node group. ``` 此错误表明 **PodEvictionFailure** 阻止了升级。如果容器组(pod)在 15 分钟内没有离开节点且没有强制标志,则升级阶段会失败,并显示 **PodEvictionFailure** 错误。 升级阶段出现 **PodEvictionFailure** 错误包括以下原因: **主动 PDB(容器组(pod)中断预算)** 在多个 PDB 指向同一个容器组(pod)时,将在容器组(pod)上定义主动 PDB。 PDB 表示一类容器组(pod)在给定时间可以容忍的中断次数(故障预算)。每当自愿中断导致服务的容器组(pod)降至预算以下时,操作即会暂停,直到能够维持预算。节点耗尽事件会暂时停止,直到更多容器组(pod)可用,以便通过驱逐容器组(pod)实现不超出预算。有关更多信息,请参阅 Kubernetes 网站上的[中断](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/?trk=cndc-detail)。 要确认顺利更新托管节点组,您必须暂时移除容器组(pod)中断预算,或者使用强制选项进行更新。此选项不会考虑容器组(pod)中断预算。相反,此选项通过强制节点重新启动来实施更新。 **注意**:如果应用程序基于 Quorum,则强制选项可能会导致该应用程序暂时不可用。 运行以下命令以确认您在集群中配置了 PDB: ``` $ kubectl get pdb --all-namespaces ``` 或者,如果您在 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/?trk=cndc-detail)中启用了审计日志记录,请按照以下步骤操作: 1.    在**集群**选项卡下,从列表中选择所需的集群(例如,rpam-eks-qa2-control-plane)。 2.    在**日志记录**选项卡下,选择**审计**。这会将您重定向到 Amazon CloudWatch 控制台。 3.    在 CloudWatch 控制台中,选择**日志**。然后,选择 **Log Insights** 并运行以下查询: ``` fields @timestamp, @message | filter @logStream like "kube-apiserver-audit" | filter ispresent(requestURI) | filter objectRef.subresource = "eviction" | display @logStream, requestURI, responseObject.message | stats count(*) as retry by requestURI, responseObject.message ``` 4.    从右上角选择**自定义**以确定更新日期。如果由于主动 PDB 而导致节点组更新失败,则 **resposeObject.message** 会描述容器组(pod)驱逐失败的原因。 5.    如果 PDB 导致失败,请使用以下命令修改 PDB。然后,再次升级节点组: ``` $ kubectl edit pdb pdb_name; ``` **容忍所有污点的部署** 每个容器组(pod)被驱逐后,该节点变为空,因为该节点在之前的步骤中受到了污染。但是,如果部署可以容忍所有污点,则该节点更可能为非空,从而导致容器组(pod)驱逐失败。有关更多信息,请参阅 Kubernetes 网站上的[污点和容忍](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration?trk=cndc-detail)。 ### 由于发行版本无效,更新失败 ``` Error Message: Requested release version 1.xx is not valid for kubernetes version 1.xx. ``` 要解决此问题,请再次运行升级命令。此命令将节点组升级到与控制面板的 Kubernetes 版本相同的版本: ``` eksctl upgrade nodegroup --name=test --cluster=test --kubernetes-version=1.xx ``` **注意**:将 1.xx 版本替换为 Amazon EKS 控制面板支持的版本。 ### 由于节点组存在运行状况问题,更新失败 ``` Error message: Nodegroup has health issue other than [ AsgInstanceLaunchFailures, InstanceLimitExceeded, InsufficientFreeAddresses, ClusterUnreachable] ``` 如果您手动修改了节点组的自动扩缩组以使用其 Amazon Elastic Compute Cloud(Amazon EC2)启动模板的不同版本,则会导致此失败。或者,您可能已经删除了与节点组关联的模板版本。EKS 节点组使用的默认启动模板与自动扩缩组的启动模板发生冲突。此启动模板导致 EKS 将节点组显示为已降级。 如果您尚未删除启动模板,请手动将自动扩缩组的启动模板版本更改回相应的版本。此操作将节点组恢复到正常运行的活动状态。现在,您可以重新启动更新过程。