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

上次更新日期:2021 年 11 月 15 日

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

简短描述

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

  • AWS Identity and Access Management (IAM) 权限,包括附加到 Worker 节点的 IAM 角色或通过 服务账户 IAM 角色 提供的 CNI 策略
  • 可从节点访问的 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 进入就绪状态

解决方法

验证 aws-node pod 在每个 Worker 节点处于正在运行状态

要验证 aws-node pod 在 Worker 节点处于正在运行状态,请运行以下命令:

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

如果命令输出显示 RESTARTS 计数为 0,则 aws-node pod 处于正在运行状态。尝试验证您的子网具有足够的免费 IP 地址可用部分中的问题排查步骤。

如果命令输出显示 RESTARTS 计数大于 0,则尝试以下步骤:

验证 Worker 节点是否可以到达 Amazon EKS 集群的 API 服务器终端节点:

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

验证至 Amazon EKS 集群的连接

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

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

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

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

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

4.    验证您的工作线程节点可访问 Amazon EC2 的 API 终端节点、Amazon ECR 和 Amazon S3。

注意:您可通过公共终端节点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 附加组件

有关问题排查的更多信息,请参阅 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 节点达到 EKS API 服务器端点。

验证 WARM_PREFIX_TARGET 值是否正确设置

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

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

有关更多信息,请参阅 CNI 插件配置变量

检查子网中的预留实例

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

InsufficientCidrBlocks

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?