如何排查 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。
验证您的子网具有足够的免费 IP 地址可用
要在 Amazon Virtual Private Cloud (Amazon VPC) ID 中列出每个子网中的可用 IP 地址,请运行以下命令:
aws ec2 describe-subnets --filters "Name=vpc-id,Values=" | jq '.Subnets[] | .SubnetId + "=" + "\(.AvailableIpAddressCount)"'
对于启动 pod 的子网,available-ip-address-count 应大于 0。
检查是否已达到您的安全组限制数量
如果您已达到每个弹性网络接口的安全组限制数量,则您的 pod 联网可能会失败。
验证您工作线程节点所用的实例类型由 CNI 插件提供支持
有关更多信息,请参阅 CNI 插件的支持的实例类型列表。
验证您正在运行的是 CNI 插件的最新稳定版本
有关问题排查的更多信息,请参阅 AWS GitHub 问题页面和 CNI 插件的发布说明。
这篇文章对您有帮助吗?
您是否需要账单或技术支持?