如何为 Amazon EKS 解决 kubelet 或 CNI 插件问题?

3 分钟阅读
0

我想要为 Amazon Elastic Kubernetes Service(Amazon EKS)解决 kubelet 或 CNI 插件问题。

简短描述

要使用您的 CNI 插件(在 Kubernetes 网站上)运行 IP 地址并将其分配到 Worker 节点上的容器组(pod),您必须具备以下配置:

  • AWS Identity and Access Management(IAM)权限,包括附加到您的 Worker 节点的 IAM 角色的 CNI 策略。或者,您通过服务账户 IAM 角色提供的 IAM 权限。
  • 可从 Worker 节点访问的 Amazon EKS API 服务器端点。
  • 对 Amazon Elastic Compute Cloud(Amazon EC2)、Amazon Elastic Container Registry(Amazon ECR)和 Amazon Simple Storage Service(Amazon S3)的 API 端点的网络访问权限。
  • 您的子网中有足够的可用 IP 地址。
  • 成功运行的 kube-proxy,以便 aws-node 容器组(pod)进入 Ready 状态。
  • 支持 Amazon EKS 版本的 kube-proxy 版本VPC CNI 版本

解决方法

验证 aws-node 容器组(pod)是否在每个 Worker 节点处于 Running 状态

要验证 aws-node 容器组(pod)是否在 Worker 节点处于 Running 状态,请运行以下命令:

kubectl get pods -n kube-system -l k8s-app=aws-node -o wide

如果命令输出显示 RESTARTS 计数为 0,则 aws-node 容器组(pod)处于 Running 状态。尝试验证您的子网具有足够的免费 IP 地址可用部分中的步骤。

如果命令输出显示 RESTARTS 计数大于 0,则验证 Worker 节点是否可以访问您的 Amazon EKS 集群的 API 服务器端点。运行以下命令:

curl -vk https://eks-api-server-endpoint-url

验证至 Amazon EKS 集群的连接

1.    验证 Worker 节点的 Amazon EKS 安全组设置是否已正确配置。如需更多信息,请参阅 Amazon EKS 安全组要求和注意事项

2.    验证您的工作线程节点针对子网的网络访问控制列表(网络 ACL)规则允许与 Amazon EKS API 服务器终端节点通信。

**重要提示:**允许端口 443 入站和出站流量。

3.    验证 kube-proxy pod 是否在每个 Worker 节点处于正在运行状态

kubectl get pods -n kube-system -l k8s-app=kube-proxy -o wide

4.    验证您的 Worker 节点是否可访问 Amazon EC2、Amazon ECR 和 Amazon S3 的 API 端点。

**注意:**通过公共端点AWS PrivateLink 配置这些服务。

验证您的子网具有足够的免费 IP 地址可用

要在 Amazon Virtual Private Cloud(Amazon VPC)ID 中列出每个子网中的可用 IP 地址,请运行以下命令:

aws ec2 describe-subnets --filters "Name=vpc-id,Values= VPCID" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'

**注意:**对于启动容器组(pod)的子网,AvailableIpAddressCount 必须大于 0

检查是否已达到您的安全组限制数量

如果您已达到每个弹性网络接口的安全组限制数量,则您的容器组(pod)联网配置可能会失败。

有关更多信息,请参阅 Amazon VPC 配额

验证您正在运行的是否是 CNI 插件的最新稳定版本

要确认您拥有 CNI 插件的最新版本,请参阅更新 Amazon VPC CNI plugin for Kubernetes 自行管理的附加组件

有关问题排查的更多信息,请参阅 AWS GitHub 问题页面和 CNI 插件的发布说明

检查 Worker 节点上的 VPC CNI 插件的日志

如果您已创建容器组(pod)并且没有将 IP 地址分配给容器,您会收到以下错误:

failed to assign an IP address to container

要查看日志,请转至 /var/log/aws-routed-eni/ 目录,然后找到文件名 plugin.logipamd.log

验证您的 kubelet 是否拉取 Docker 容器映像

如果您的 kubelet 没有拉取 kube-proxyamazon-k8s-cni 容器的 Docker 容器映像,您会收到以下错误:

network plugin is not ready: cni config uninitialized

确保您可以从 Worker 节点访问 Amazon EKS API 服务器端点。

验证 WARM_PREFIX_TARGET 值是否正确设置

**注意:**这仅当前缀委托启用时适用。如果前缀委托已启用,则检查以下日志错误消息:

Error: Setting WARM_PREFIX_TARGET = 0 is not supported while WARM_IP_TARGET/MINIMUM_IP_TARGET is not set. 
Please configure either one of the WARM_{PREFIX/IP}_TARGET or MINIMUM_IP_TARGET env variable

WARM_PREFIX_TARGET 必须设置为大于或等于 1 的值。如果此值设为 0,您会收到以下错误:

有关更多信息,请参阅 GitHub 网站上的 CNI 配置变量

检查子网中的预留空间

**注意:**这仅当前缀委托启用时适用。如果前缀委托已启用,则检查以下日志错误消息:

InsufficientCidrBlocks

确保子网中有足够的可用 /28 IP CIDR(16 个 IP)块。所有 16 个 IP 都必须是连续的。如果没有 /28 范围的连续 IP,您会收到 InsufficientCidrBlocks 错误。

要解决该错误,请创建新的子网并从中启动容器组(pod)。您还可以使用 Amazon EC2 子网 CIDR 预留,在具有分配前缀的子网内预留空间。有关更多信息,请参阅使用子网 CIDR 预留

使用基础设施即代码(IaC)进行的更新会因冲突而回滚

如果您使用 Amazon EKS 托管附加插件,则未定义冲突方法时,使用以下服务的更新错误会回滚:

正确方法是 NONEOVERWRITEPRESERVE

  • 如果未定义任何方法,则默认值为 NONE。当系统检测到冲突时,CloudFormation 堆栈的更新会回滚,并且不进行任何更改。
  • 要设置附加组件的默认配置,请使用 Overwrite 方法。从自托管附加组件迁移到 Amazon EKS 托管附加组件时,您必须使用 OVERWRITE
  • 使用自定义配置(例如 WARM_IP_TARGET自定义联网)时,请使用 PRESERVE 方法。

节点处于 NotReady 状态

当您有 aws-nodes 未处于 Running 状态时,节点通常处于 NotReady 状态。有关更多信息,请参阅如何将我的节点的状态从 NotReady 或 Unknown 状态更改为 Ready 状态?

自定义联网配置的挑战

当 VPC CNI 的自定义联网处于活动状态时,ENIConfig 自定义资源定义(CRD)必须定义正确的子网和安全组。

要验证自定义网络是否处于活动状态,请描述 kube-system 命名空间中的 aws-node 容器组(pod)。然后,查看以下环境变量是否设置为 true

AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG

如果自定义联网处于活动状态,请检查 CRD 是否配置正确。

kubectl get ENIConfig -A -o yaml

描述与可用区名称匹配的每个条目。子网 ID 与 VPC 和 Worker 节点位置匹配。安全组可以访问或与集群安全组共享。有关最佳实践的更多信息,请参阅 GitHub 网站上的 Amazon EKS 最佳实践指南


AWS 官方
AWS 官方已更新 1 个月前