如何解决 Amazon EKS 的托管节点组更新问题?
我正在尝试更新我的 Amazon Elastic Kubernetes Service(Amazon EKS)托管节点组,但遇到了问题。
简短描述
更新 Amazon EKS 托管节点组时,可能会收到以下错误之一:
- “在尝试从节点组 nodegroup-1234 中的节点驱逐容器组时,PodEvictionFailure 已达到最大重试次数”
- “错误: 除 AsgInstanceLaunchFailures、InstanceLimitExceeded、InsufficientFreeAddresses、ClusterUnreachable 外,节点组运行状况还有其他问题”
- “错误: InvalidParameterException: 自定义 ami 类型节点组的启动模板详细信息不能为空”
-或者-
“调用 UpdateNodegroupVersion 操作时出现错误(InvalidParameterException): 使用自定义 AMI 时无法指定 kubernetesVersion 字段”
- “UPDATE_FAILED 资源处理器返回消息: 所请求的发布版本 1.xx 对 kubernetes 版本 1.yy 无效”
解决方法
要解决 Amazon EKS 托管节点组更新错误,请执行以下故障排除步骤。
**注意:**如果在运行 AWS 命令行界面(AWS CLI)命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
在尝试从节点组 nodegroup-1234 中的节点驱逐容器组时,PodEvictionFailure 已达到最大重试次数
当升级无法耗尽节点上的所有容器组时,就会出现 PodEvictionFailure 错误。如果容器组中断预算(PDB)阻止容器组从节点中耗尽,则这可能会导致问题。例如,如果应用程序的 PDB 为 2,则该应用程序的至少两个容器组必须正在运行。
要检查您的应用程序是否正在使用 PDB,请运行以下 kubectl 命令:
$ kubectl get pdb —all-namespaces
如果使用的是 PDB,请执行以下操作之一:
- 增加您的 Amazon Elastic Compute Cloud(Amazon EC2)节点的可用 IP 地址数量,以增加容器组的数量。
- 暂时移除 PDB。
- 使用强制更新选项。
强制更新选项无法识别 PDB。无论 PDB 出现何种问题,都会通过强制节点重新启动来进行更新。
**注意:**如果来自 Kubernetes 控制器的容器组未分布在节点上,则此选项可能会导致应用程序停机。
要使用强制选项,请运行类似于以下命令的 AWS CLI 命令:
$ aws eks update-nodegroup-version --cluster-name cluster-123 --nodegroup-name nodegroup-1234 --force
-或-
运行以下 eksctl 命令:
$ eksctl upgrade nodegroup --cluster OneCluster --name managed-ng --force-upgrade
使用 CloudWatch Logs Insights 对 PodDisruptionBudget 驱逐故障进行排除
您可以使用 Amazon CloudWatch Logs Insights 来搜索 Amazon EKS 控制面板日志数据。有关详细信息,请参阅使用 CloudWatch Logs Insights 分析日志数据。
**重要事项:**只有在集群中启用控制面板登录后,才能在 CloudWatch Logs 中查看日志事件。在 CloudWatch Logs Insights 中选择运行查询的时间范围之前,请验证是否启用了控制面板日志记录。有关详细信息,请参阅如何从 CloudWatch Logs 检索 Amazon EKS 控制面板日志?
要确定驱逐失败的容器组和失败次数,请运行与以下内容类似的查询:
fields @timestamp, @message | stats count(*) as count by objectRef.name | filter @logStream like /audit/ | filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod" and responseStatus.code > 400 | sort count desc
驱逐容器组的最大重试次数为 20。如果显示的容器组的次数大于或等于 20 次故障,则这是驱逐失败的容器组。
要确定阻止前一容器组被驱逐的容器组中断预算名称,请运行以下查询。
filter @logStream like /^kube-apiserver-audit/ | fields @logStream, @timestamp, @message | sort @timestamp desc | filter user.username == "eks:node-manager" and requestURI like "eviction" and requestURI like "pod_name" and responseStatus.code > 400 | limit 999 | display responseObject.details.causes.0.message,objectRef.name,objectRef.namespace,objectRef.resource
**注意:**请将 pod_name 替换为您的容器组名称。
输出中的消息与以下内容类似,其中 pod_distruption_budget 是导致驱逐失败的对象:
The disruption budget pod_distruption_budget needs 1 healthy pods and has 1 currently
错误: 除 AsgInstanceLaunchFailures、InstanceLimitExceeded、InsufficientFreeAddresses、ClusterUnreachable 外,节点组运行状况还有其他问题
如果您收到此错误消息,请检查托管节点组的详细信息并查找运行状况问题。有关详细信息和故障排除,请查看托管节点组错误和 Amazon EKS 问题 API 参考。
错误: InvalidParameterException: 自定义 ami 类型节点组的启动模板详细信息不能为空
-或-
调用 UpdateNodegroupVersion 操作时出现错误(InvalidParameterException): 使用自定义 AMI 时无法指定 kubernetesVersion 字段。
对于具有自定义 AMI 的托管节点组,您必须使用要升级到的 Kubernetes 版本创建新的 AMI 版本。在升级期间,指定启动模板和版本。
如果您使用的是 AWS CLI,则使用标志 --launch-template。对于 eksctl,使用标志 --launch-template-version。
**注意:**避免在这些命令中使用 --kubernetes-version 标志。
UPDATE_FAILED 资源处理器返回消息: “所请求的发布版本 1.xx 对 kubernetes 版本 1.yy 无效”
在使用来自与 UpdateStack API 调用相同的 AWS CloudFormation 堆栈中的 Amazon EKS 集群升级托管节点组时,会发生此错误。
CloudFormation 尝试回滚堆栈但失败,因为 Amazon EKS 集群已成功升级且无法恢复。Amazon EKS 集群无法将 1.xx 与 1.yy 相匹配(例如:1.21 和 1.22)。
查看 CloudFormation 堆栈中节点组出现的第一个错误,了解有关如何修复问题的更多详细信息。然后,再次更新您的 CloudFormation 堆栈。
有关详细信息,请参阅托管节点更新行为。
相关信息
相关内容
- 已提问 2 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 10 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 8 个月前