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

3 分钟阅读
0

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

简述

要使用 CNI 插件(在 Kubernetes 网站上)为 Worker 节点上的容器组 (pod) 分配和运行 IP 地址,必须进行以下配置:

  • 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 地址。
  • 能够成功运行以使 aws-node 容器组 (pod) 进入就绪状态的 kube-proxy。
  • 支持 Amazon EKS 版本的 kube-proxy 版本VPC CNI 版本

解决方法

验证每个 Worker 节点上的 aws-node 容器组 (pod) 处于“正在运行”状态

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

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 节点的子网网络访问控制列表规则是否允许与 Amazon EKS API 服务器端点进行通信。

**重要信息:**在端口 443 上允许入站和出站流量。

3.    验证每个 Worker 节点上的 kube-proxy 容器组 (pod) 是否处于正在运行状态:

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 自管理插件

有关其他故障排除,请参阅 CNI 插件的 AWS GitHub 问题页面发行说明

检查 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 托管插件,在未定义冲突方法时,使用以下服务的更新错误会回滚:

正确的方法是覆盖保留

  • 如果未定义方法,默认值为。当系统检测到冲突时,CloudFormation 堆栈的更新会回滚,不会进行任何更改。
  • 要设置插件的默认配置,使用覆盖方法。从自管理插件迁移到 Amazon EKS 托管插件时,必须使用覆盖方法。
  • 使用自定义配置(如 WARM_IP_TARGET自定义网络)时,使用保留方法。

节点处于 NotReady 状态

当您的 aws-node 未处于正在运行状态时,节点通常会进入 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 年前