如何解决 Amazon EKS 的托管节点组更新问题?

2 分钟阅读
0

我正在尝试更新我的 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,请执行以下操作之一:

强制更新选项无法识别 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 堆栈

有关详细信息,请参阅托管节点更新行为


相关信息

如何解决 Amazon EKS 托管节点组创建失败的问题?

如何解决 Amazon EKS 集群中的托管节点组错误?

Amazon EKS 故障排除

AWS 官方
AWS 官方已更新 1 年前
没有评论