如何排查 Amazon EKS 的 kubelet 或 CNI 插件问题?

上次更新时间:2020 年 9 月 11 日

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

简短描述

要使用您的 CNI 插件运行 IP 地址并将其分配到您工作线程节点上的 pod,您必须具备以下条件:

  • AWS Identity and Access Management (IAM) 权限,包括附加到您工作线程节点的 IAM 角色或通过 服务账户的 IAM 角色 提供的 Amazon EKS CNI 策略
  • 可从工作线程节点访问的 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 在每个工作线程节点处于正在运行状态

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

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

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

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

要验证工作线程节点可访问您的 Amazon EKS 集群的 API 服务器终端节点,请运行以下命令:

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

如果您无法连接到您的 Amazon EKS 集群,则尝试以下步骤:

1.    验证您工作线程节点的 Amazon EKS 安全组设置已正确配置。

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

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

3.    要验证 kube-proxy pod 在每个工作线程节点处于正在运行状态,请运行以下命令:

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 的子网,available-ip-address-count 应大于 0

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

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

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

验证您工作线程节点所用的实例类型由 CNI 插件提供支持

有关更多信息,请参阅 CNI 插件的支持的实例类型列表

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

要确认您拥有的是 CNI 插件最新版本,请参阅用于 Kubernetes 升级的 Amazon VPC CNI 插件。

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


这篇文章对您有帮助吗?


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