跳至内容

如何解决 Amazon EKS 的 Amazon VPC CNI 插件问题?

4 分钟阅读
0

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

解决方法

Amazon EKS 需要为 Amazon Virtual Private Cloud (Amazon VPC) 容器网络接口 (CNI) 插件正确分配容器组 (pod) IP 才能正常工作。要解决 VPC CNI 插件问题,请验证以下配置:

  • AWS Identity and Access Management (IAM) 权限,包括附加到 Worker 节点的 IAM 角色的 AmazonEKS_CNI_Policy。或者,您通过服务账户 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) 进入 Ready(就绪)状态的 kube-proxy。
  • 与 Amazon EKS 集群版本一致的 Kube-proxy 版本VPC CNI 版本

完成以下故障排除步骤以解决 VPC CNI 插件问题。

验证 aws-node 容器组 (pod) 是否处于正在运行状态

VPC CNI 插件以名为 aws-node 的进程守护程序容器组 (pod) 在 kube-system 命名空间中运行。集群中的每个 Worker 节点上都有一个 aws-node 容器组 (pod) 在运行。

  1. 要验证每个 Worker 节点上的 aws-node 容器组 (pod) 是否正在运行,请运行以下命令:

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

    **注意:**请将 k8s-app=aws-node 替换为您的标签选择器。

  2. 如果命令输出显示 RESTARTS 次数大于 0,请验证容器的状态以及是否存在错误消息。运行以下 describe 命令:

    kubectl describe pod aws-node-pod-name -n kube-system

    **注意:**请将 aws-node-pod-name 替换为您的 AWS 节点容器组 (pod) 的名称。

  3. 如果 aws-node 容器组 (pod) 卡滞在 ContainerCreating 状态,describe 输出会在事件中显示以下错误消息:

    "Error while dialing dial tcp 127.0.0.1:50051: connect: connection refused"

    然后完成为什么我的 Amazon EKS 容器组 (pod) 卡滞在 ContainerCreating 状态并显示 "Failed to create pod sandbox" 错误?中的步骤

  4. 要查看 aws-node 容器组 (pod) 的日志,请运行以下 logs 命令:

    kubectl logs daemonset/aws-node -n kube-system

    -or-

    kubectl logs aws-node-pod-name -n kube-system

    **注意:**请将 aws-node-pod-name 替换为您的 aws-node 容器组 (pod) 名称。

  5. 检查 Worker 节点上的 VPC CNI 插件的日志。登录到 Worker 节点,然后转到 /var/log/aws-routed-eni/ 目录。找到文件名 plugin.logipamd.log,然后检查这些文件中的日志。

  6. 验证 Worker 节点是否可以访问您的 Amazon EKS 集群的 API 服务器端点。要登录到您的 Worker 节点,请使用 SSH 或 AWS Systems Manager 会话管理器,然后运行以下命令:

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

    **注意:**请将 eks-api-server-endpoint-url 替换为您的 Amazon EKS API 服务器端点 URL。

验证 VPC CNI 版本

检查您的 VPC CNI 插件版本是否为最新,以及是否与您的 Amazon EKS 集群版本兼容。

要检查当前 VPC CNI 版本,请运行以下命令:

kubectl describe daemonset aws-node -n kube-system | grep Image | cut -d "/" -f 2

将您的当前版本与 GitHub 网站上 Amazon VPC CNI plugin releases(Amazon VPC CNI 插件版本)中的最新可用版本进行比较。

如果您的版本已过时,请将 VPC CNI 插件更新到最新版本。有关更多信息,请参阅更新 Amazon VPC CNI(Amazon EKS 附加组件)

验证网络配置和要求

检查您的 Amazon EKS 集群的安全组和子网配置是否正确设置。

验证安全组规则

安全组必须允许控制面板和数据面板之间的连接。

如果您为 Worker 节点使用自定义安全组,请检查端口。最低节点组规则允许来自控制面板安全组的端口 10250 入站流量,以及流向控制面板安全组的 443 出站流量。有关详细信息,请参阅网络规则

如果容器组 (pod) 安全组功能已启用,请检查是否已达到您的安全组限制。如果您已达到安全组中每个弹性网络接口的限制,您的容器组 (pod) 联网配置可能会失败。有关更多信息,请参阅 Amazon VPC 配额

有关所需安全组规则的更多信息,请参阅查看集群的 Amazon EKS 安全组要求

验证子网配置

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

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

验证您的 Worker 节点的子网网络访问控制列表规则是否允许与 Amazon EKS API 服务器进行通信。有关如何配置网络 ACL 的详细信息,请参阅使用网络访问控制列表控制子网流量

验证您的控制面板子网是否有足够的可用 IP 地址。每个控制平面子网必须至少有六个可供 Amazon EKS 使用的 IP 地址。但是,AWS 建议每个子网至少有 16 个 IP 地址。启动容器组 (pod) 的子网的 AvailableIpAddressCount 必须大于 0。有关详细信息,请参阅子网要求和注意事项

验证 kube-proxy 容器组 (pod) 是否处于正在运行状态

kube-proxy 容器组 (pod) 必须处于运行状态才能正常连接网络。

要验证 kube-proxy 是否正在运行,请运行以下命令:

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

确认所有 kube-proxy 容器组 (pod) 均处于正在运行状态。如果 kube-proxy 未运行,请检查容器组 (pod) 日志中是否存在错误:

kubectl logs -n kube-system POD-NAME

**注意:**请将 POD-NAME 替换为您的 kube-proxy 容器组 (pod) 名称。

验证 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 的值。如果已启用前缀委托但 WARM_PREFIX_TARGET 设置为 0,请将该值更新为至少为 1

kubectl set env daemonset aws-node -n kube-system WARM_PREFIX_TARGET=1

检查子网中的预留空间

启用前缀委派后,请验证您的子网是否有足够的 /28 IP CIDR 数据块可用。所有 16 个 IP 地址必须是连续的。如果已启用前缀委托,请检查日志文件是否存在以下错误消息:

"InsufficientCidrBlocks"

要解决此错误,请创建一个新子网,然后从新子网启动容器组 (pod)。使用 Amazon EC2 子网 CIDR 预留在具有指定前缀的子网内预留空间。有关更多信息,请参阅子网 CIDR 预留

验证自定义网络配置

要确定您的 Amazon EKS 集群是否已启用自定义网络,请运行以下命令:

kubectl describe pod -n kube-system $(kubectl get pods -n kube-system -l k8s-app=aws-node -o jsonpath='{.items[0].metadata.name}')

如果此变量设置为 True,则表示已启用自定义网络。

如果已启用自定义网络,则必须正确配置 ENIConfig CRD 以满足集群的联网需求。运行以下命令来检索列表并检查所有 ENIConfig CRD:

kubectl get ENIConfig -A -o yaml

要描述特定的 ENIConfig,请运行以下命令:

kubectl describe ENIConfig eni-config-name

**注意:**请将 Eni-config-name 替换为您的 ENIConfig 名称。

验证每个 ENIConfig 是否为每个可用区配置了正确的子网和安全组。

确认 ENIConfig 中指定的子网与您的 Worker 节点的可用区相匹配。

有关自定义网络的更多信息,请参阅使用自定义网络在备用子网中部署容器组 (pod)

配置冲突解决方法以防止回滚

当您将 AWS Cloud Development Kit (AWS CDK)、AWS CloudFormation 或 eksctl 与托管附加组件一起使用时,请定义冲突解决方法以防止回滚。

正确的方法是覆盖保留

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

有关设置冲突解决方法的更多信息,请参阅更新 Amazon EKS 附加组件

AWS 官方已更新 4 个月前