跳至内容

如何对 Amazon EKS 托管式节点组 AMI 更新失败进行故障排除?

3 分钟阅读
0

我的 Amazon Elastic Kubernetes Service (Amazon EKS) 托管式节点组无法更新到最新的亚马逊机器映像 (AMI) 版本。

解决方法

当您启动托管式节点组更新时,Amazon EKS 会自动更新您的节点。如果您使用针对 Amazon EKS 优化的 AMI,Amazon EKS 会对您的节点自动应用最新的安全补丁和操作系统 (OS) 更新。在节点更新过程中,您可能会收到以下错误之一。根据您收到的错误类型选择解决方法。

对 PodEvictionFailure 错误进行故障排除

当 PodEvictionFailure 阻止升级时,您会收到以下错误:

“Reached max retries while trying to evict pods from nodes in node group”

如果容器组 (Pod) 没有在 15 分钟内离开节点并且没有 --force 标志,升级阶段将失败,并发出 PodEvictionFailure 错误。

当您的容器组中断预算 (PDB) 阻止容器组驱逐,或者您的部署容忍所有污点并使节点保持非空状态时,就会出现 PodEvictionFailure 错误。

根据您收到的错误选择解决方法。

您的 PDB 防止容器组驱逐

当多个 PDB 指向同一容器组时,该容器组具有限制性 PDB 配置。PDB 指定一类容器组在给定时间内可以容忍的中断次数。当主动中断导致服务的容器组数量降至预算以下时,操作将暂停,直到可以满足预算要求。节点耗尽事件会暂时停止,直到有更多的容器组可用。有关更多信息,请参阅 Kubernetes 网站上的干扰。

要更新托管式节点组,请暂时移除 PDB 或使用 --force 选项。--force 选项不考虑 PDB,而是强制节点重新启动并实施更新。

注意: 如果受 PDB 保护的容器组运行基于 Quorum 的应用程序,则 --force 选项可能会导致应用程序暂时不可用。

要确认您的集群中是否已配置 PDB,运行以下命令:

kubectl get pdb --all-namespaces

或者,如果您在 Amazon EKS 控制台中开启了审计日志记录,请完成以下步骤:

  1. 打开 Amazon EKS 控制台。

  2. 在导航窗格中,选择 Clusters(集群),然后选择您的集群。

  3. 选择 Observability(可观测性)选项卡,然后选择 Audit(审计)。系统会打开 Amazon CloudWatch 控制台。

  4. 在 CloudWatch 控制台中,选择 Logs(日志),然后选择 Logs Insights。

  5. 在 Logs 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
  6. 选择 Run query(运行查询)。

  7. 选择 Custom(自定义)以确定更新日期。如果限制性 PDB 导致节点组更新失败,responseObject.message 会描述容器组驱逐失败的原因。

如果您的 PDB 导致此失败,请修改 PDB,使其至少允许中断一次。然后,再次更新托管式节点组。

要编辑 PDB,请运行以下命令:

kubectl edit pdb PDB-NAME

注意: 请将 PDB-NAME 替换为您的 PDB 的名称。

在 PDB 规范中,执行以下操作之一:

  • 将 minAvailable 降低到小于副本总数的值。
  • 将 maxUnavailable 至少设置为 1。

如果多个 PDB 以同一容器组为目标,则移除或合并重复项,这样每个 Pod 只能应用一个 PDB。

您的部署容忍所有污点

在节点耗尽过程驱逐所有容器组后,节点会变为空,因为 Amazon EKS 污染了节点。如果部署容忍所有污点,则节点将保持非空状态,您会看到容器组驱逐失败。

要解决此问题,请检查您的部署容忍度配置并移除不必要的通配符容忍度。然后,再次更新托管式节点组。有关详细信息,请参阅 Kubernetes 网站上的污点和容忍度。

对启动模板配置问题进行故障排除

注意: 如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅排查 AWS CLI 错误。此外,请确保您使用的是最新版本的 AWS CLI。

当托管式节点组更新失败时,失败原因将通过 AWS 管理控制台或 describe-update AWS CLI 命令以错误代码的形式返回。

根据您收到的错误选择解决方法。

启动模板与预期配置不匹配

如果您修改或删除与节点组关联的启动模板,则更新可能会失败,并出现与启动模板配置相关的错误。如果您已手动更改启动模板或者节点组引用的启动模板版本已不存在,则会发生这些错误。

要解决此问题,请验证自动扩缩组是否使用最初与该节点组关联的启动模板版本。此外,还原对启动模板的意外更改。

Amazon EKS 找不到启动模板

如果您删除节点组引用的启动模板,则更新将失败,并出现显示启动模板不存在的错误。缺少启动模板会阻止自动扩缩组在更新过程中启动替换节点。

要解决此问题,请恢复或重新创建启动模板并将正确的版本与节点组相关联。然后,再次更新托管式节点组。

启动模板配置无效

如果启动模板包含无效的参数,则自动扩缩组无法启动新的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。例如,无效的参数包括不正确的用户数据、不支持的块设备映射或不兼容的配置设置。

要解决此问题,请查看启动模板配置,然后更正无效的设置。然后,再次更新托管式节点组。

对 AMI 配置问题进行故障排除

根据您收到的错误选择解决方法。

Amazon EC2 找不到 AMI

如果您删除启动模板中指定的 AMI,则自动扩缩组无法在更新期间启动新节点。如果 AMI 位于其他区域,您也无法启动新的节点组。

要解决此问题,请更新启动模板以引用有效的 AMI,然后再次更新托管式节点组。

AMI ID 不正确

如果启动模板中指定的 AMI ID 不正确,则 Amazon EC2 无法启动实例。不正确的 AMI ID 会阻止更新过程创建新的 Worker 节点。

要解决此问题,请验证 AMI ID 是否有效,然后使用正确的映像更新启动模板。然后,再次更新托管式节点组。

对节点启动失败问题进行故障排除

根据您收到的错误选择解决方法。

指定的实例类型不存在

如果启动模板引用的 EC2 实例类型无效或不受支持,则实例启动请求将在更新期间失败。当实例类型存在拼写错误或所选区域不受支持时,实例启动请求会失败。

要解决此问题,请更新启动模板以使用有效的实例类型,然后再次更新托管式节点组。

Ec2InsufficientCapacity

如果请求的实例类型在所选可用区中暂时不可用,则更新会因容量不足错误而失败。

要解决此问题,请使用其他可用区或不同的实例类型,然后再次更新托管式节点组。

InstanceLimitExceeded 错误

如果您的 AWS 账户达到其 Amazon EC2 实例配额,则自动扩缩组无法在更新期间启动替换节点。

要解决此问题,请申请增加配额或减少正在运行的实例数量。然后,再次更新托管式节点组。

AsgInstanceLaunchFailures 错误

如果您删除或修改支持 Amazon EKS 之外的节点组的自动扩缩组,则更新将失败,因为 Amazon EKS 无法管理节点替换。

要解决此问题,请验证您的节点组配置,如果底层自动扩缩组不再存在,则重新创建节点组。

自动扩缩组配置无效

如果自动扩缩组配置与节点组设置不一致,则更新可能会失败。在 Amazon EKS 之外手动修改启动模板、子网或扩展参数可能会导致这种不一致。

要解决此问题,请恢复自动扩缩组配置以匹配预期的节点组配置。然后,再次更新托管式节点组。

对网络配置错误进行故障排除

根据您收到的错误选择解决方法。

子网配置无效

如果与节点组关联的子网配置不正确或无法正确路由流量,则新节点无法加入集群。缺失路由规则或私有子网缺乏 NAT 网关可能会导致此故障。

要解决此问题,请确保您的子网路由和连接允许节点与集群控制面板通信。

指定的安全组不存在

如果您删除启动模板或节点组配置引用的安全组,则无法启动新节点。

要解决此问题,请更新配置以引用有效的安全组,然后再次更新托管式节点组。

安全组配置无效

如果关联的安全组包含冲突或无效的规则,则新节点将无法启动或连接到集群。

要解决此问题,请验证安全组是否允许 Worker 节点和集群控制面板之间进行所需的入站和出站通信。

InsufficientFreeAddresses 错误

如果与节点组关联的子网耗尽了可用的 IP 地址,则自动扩缩组无法在更新期间启动其他节点。

要解决此问题,请扩展子网 CIDR 范围或添加其他子网以提供更多可用的 IP 地址。

对节点注册失败问题进行故障排除

根据您收到的错误选择解决方法。

新节点无法加入集群

如果您成功启动实例,但实例无法在 Kubernetes 集群中注册,则更新会因节点创建错误而失败。当节点 AWS Identity and Access Management (IAM) 角色缺乏所需权限、引导脚本失败或 aws-auth ConfigMap 不包含节点角色时,就会出现更新失败。

要解决此问题,请验证您节点的 IAM 策略、引导配置和集群身份验证设置。对于访问条目,请确保指定具有 EC2 权限的节点角色。有关详细信息,请参阅 Amazon EKS 节点 IAM 角色。

由于 IAM 权限不足,访问被拒绝

如果节点 IAM 角色不包含 Worker 节点所需的权限,则这些节点无法与所需的 AWS 服务通信。

要解决此问题,请确保节点 IAM 角色包含所需的 IAM 策略,例如 AmazonEKSWorkerNodePolicy 和 AmazonEC2ContainerRegistryReadOnly。

对集群无法访问错误进行故障排除

根据您收到的错误选择解决方法。

Worker 节点无法到达集群端点

如果 Worker 节点无法连接到 Kubernetes API 服务器,则更新将失败,并出现集群无法访问错误。安全组限制、私有节点缺少 NAT 网关访问权限或端点配置不正确可能会阻止 Worker 节点连接到 Kubernetes API 服务器。

要解决此问题,请验证 Worker 节点和集群端点之间的网络连接。

解决更新状态错误

另一个更新已经在进行中错误

如果已在节点组上运行更新操作,则 Amazon EKS 会拒绝其他更新请求,直到当前操作完成。

要解决此问题,请等待现有更新完成,然后再次更新托管式节点组。

请求参数无效

如果更新请求包含无效的参数,例如不支持的版本或不正确的配置值,则更新将失败。对于无效的参数,您会收到一条错误消息。

要解决此问题,请查看更新请求并确保节点组配置支持所有参数。然后,再次更新托管式节点组。

Amazon EKS 找不到节点组

如果更新请求中提供的节点组名称不存在,则更新操作将失败。

要解决此问题,请确保指定正确的集群名称和节点组名称。然后,再次更新托管式节点组。

UnsupportedKubernetesVersion 错误

如果您将节点组更新为集群控制面板不支持的 Kubernetes 版本,则更新将失败。

要解决此问题,请确保节点组版本与当前集群兼容。然后,再次更新托管式节点组。

KubernetesVersionMismatch 错误

Amazon EKS 不允许节点组运行比控制面板更高的 Kubernetes 版本。如果更新尝试将节点组升级到比集群版本更高的版本,则操作将失败。

要解决此问题,请升级控制面板,然后更新节点组。

更新期间节点组不正常

如果在滚动更新过程中反复出现实例启动失败或节点就绪问题,则 Amazon EKS 会将该节点组标记为不正常。然后,Amazon EKS 会停止更新过程。

要解决此问题,请调查实例启动错误、节点初始化日志和网络连接。然后,再次更新托管式节点组。

相关信息

使用启动模板自定义托管式节点

排查 Amazon EKS 集群和节点问题

AWS 官方已更新 5 个月前