Amazon EKS 故障排除 - Amazon EKS

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon EKS 故障排除

本章介绍使用 Amazon EKS 时可能遇到的一些常见错误以及相应的错误处理方式。

容量不足

如果您在尝试创建 Amazon EKS 集群时收到以下错误,则说明您指定的可用区之一的容量不足,无法支持集群。

Cannot create cluster 'example-cluster' because region-1d, the targeted Availability Zone, does not currently have sufficient capacity to support the cluster. Retry and choose from these Availability Zones: region-1a, region-1b, region-1c

在集群 VPC 中使用此错误消息所返回的可用区中托管的子网重新尝试创建集群。

节点未能加入集群

有集中常见原因会阻止节点加入集群:

  • 这些区域有:aws-auth-cm.yaml文件没有针对节点的正确的 IAM 角色 ARN。确保节点 IAM 角色 ARN(而不是实例配置文件 ARN)在您的aws-auth-cm.yaml文件。有关更多信息,请参阅 启动自我管理的亚马逊 Linux 节点

  • 这些区域有:ClusterName在节点中AWS CloudFormation模板与您希望节点加入的集群的名称未完全匹配。将不正确的值传递给此字段会导致节点的配置不正确。/var/lib/kubelet/kubeconfig文件,并且节点将不会加入群集。

  • 节点未标记为拥有按群集进行。您的节点必须应用了以下标签,其中<cluster-name>将替换为您集群的名称。

    密钥

    kubernetes.io/cluster/<cluster-name>

    owned

  • 节点可能无法使用公有 IP 地址访问集群。确保向部署在公有子网中的节点分配了公有 IP 地址。如果没有,您可以在节点启动后将弹性 IP 地址关联到节点。有关更多信息,请参阅 。将弹性 IP 地址与正在运行的实例或网络接口关联。如果公有子网未设置为自动将公有 IP 地址分配给部署到其中的实例,我们建议启用该设置。有关更多信息,请参阅修改子网的公有 IPv4 寻址属性。如果节点部署到私有子网,则该子网必须具有指向分配了公有 IP 地址的 NAT 网关的路由。

  • 未为您的账户启用您将节点部署到的区域的 STS 终端节点。要启用该区域,请参阅在 AWS 区域中激活和停用 AWS STS

  • 工作线程节点没有私有 DNS 条目,从而导致kubelet日志包含node "" not found错误。确保创建工作线程节点的 VPC 具有domain-namedomain-name-servers作为Options在一个DHCP options set。默认值是。domain-name:<region>.compute.internaldomain-name-servers:AmazonProvidedDNS。有关更多信息,请参阅 Amazon VPC 用户指南 中的 DHCP 选项集

未经授权或访问被拒绝 (kubectl)

如果运行时收到以下错误之一kubectl命令,然后您的kubectl未为 Amazon EKS 正确配置,或您使用的 IAM 用户或角色凭证未映射到 Amazon EKS 集群中具有足够权限的 Kubernetes RBAC 用户。

  • could not get token: AccessDenied: Access denied

  • error: You must be logged in to the server (Unauthorized)

  • error: the server doesn't have a resource type "svc"

这可能是因为集群是使用一组AWS(来自 IAM 用户或角色),以及kubectl正在使用一组不同的凭据。

创建 Amazon EKS 集群后,创建集群的 IAM 实体(用户或角色)将添加到 Kubernetes RBAC 授权表作为管理员(使用system:masters权限)。最初,仅该 IAM 用户可以使用调用 Kubernetes API 服务器。kubectl。有关更多信息,请参阅 管理集群的用户或 IAM 角色。如果使用控制台创建集群,您必须确保相同的 IAM 用户凭证位于AWS运行时的 SDK 凭据链kubectl命令。

如果安装和配置AWS CLI,您可以为用户配置 IAM 凭证。有关更多信息,请参阅 AWS CLI 用户指南 中的配置 AWS Command Line Interface

如果您已代入一个角色来创建 Amazon EKS 集群,您必须确保kubectl配置为承担相同的角色。使用以下命令更新kubeconfig文件以使用 IAM 角色。有关更多信息,请参阅 创建kubeconfigAmazon EKS

aws eks update-kubeconfig \ --region <region-code> \ --name <cluster_name> \ --role-arn arn:aws:iam::<aws_account_id>:role/<role_name>

要将 IAM 用户映射到 Kubernetes RBAC 用户,请参阅管理集群的用户或 IAM 角色

未找到 aws-iam-authenticator

如果您收到错误"aws-iam-authenticator": executable file not found in $PATH,然后您的kubectl未针对亚马逊 EKS 进行配置。有关更多信息,请参阅 安装 aws-iam-authenticator

注意

这些区域有:aws-iam-authenticator如果您有AWS CLI版本 1.16.156 或更高版本已安装。

hostname doesn't match

系统的 Python 版本必须为 2.7.9 或更高版本。否则,您会收到hostname doesn't match错误与AWS CLI呼叫亚马逊 EKS。有关更多信息,请参阅“Python 请求常见问题”中的什么是“主机名不匹配”错误?

getsockopt: no route to host

码头运行在172.17.0.0/16亚马逊 EKS 集群中的 CIDR 范围。我们建议您的集群的 VPC 子网不重叠此范围。否则,您将收到以下错误:

Error: : error upgrading connection: error dialing backend: dial tcp 172.17.<nn>.<nn>:10250: getsockopt: no route to host

托管节点组错误

如果您在 AWS Management Console中收到“Instances failed to join the kubernetes cluster (实例无法加入 kubernetes 集群)”错误,请确保已启用集群的私有终端节点访问,或者您已正确配置 CIDR 块以用于公有终端节点访问。有关更多信息,请参阅 Amazon EKS 集群终端节点访问控制

如果您的托管节点组遇到运行状况问题,Amazon EKS 将返回错误消息以帮助诊断问题。以下错误消息及其相关描述如下所示。

  • AccessDenied:Amazon EKS 或您的一个或多个托管节点未能通过 Kubernetes 集群 API 服务器进行身份验证或授权。有关解决此错误的更多信息,请参阅修复AccessDenied托管节点组错误

  • 未找到朋友:我们找不到与您的启动模板关联的 AMI 编号。请确保 AMI 存在并与您的账户共享。

  • AutoScalingGroupNotFound:找不到与托管节点组关联的 Auto Scaling 组。您可以重新创建具有相同设置的 Auto Scaling 组进行恢复。

  • 群集无法访问:Amazon EKS 或您的一个或多个托管节点无法与 Kubernetes 集群 API 服务器通信。如果存在网络中断或 API 服务器超时处理请求,则可能会发生这种情况。

  • 未找到 EC2 安全组:找不到集群的集群安全组。您必须重新创建集群。

  • EC2 安全组删除失败:无法删除托管节点组的远程访问安全组。从安全组中删除所有依赖关系。

  • 未找到 EC2 启动模板:找不到您的托管节点组的 Amazon EC2 启动模板。您可以重新创建具有相同设置的启动模板进行恢复。

  • EC2 启动模板版本不匹配:您的托管节点组的 Amazon EC2 启动模板版本与 Amazon EKS 创建的版本不匹配。您可以恢复到 Amazon EKS 创建用于进行恢复的版本。

  • IamInstanceProfileNotFound:找不到您的托管节点组的 IAM 实例配置文件。您可以重新创建具有相同设置的实例配置文件进行恢复。

  • IamNodeRoleNotFound:找不到您的托管节点组的 IAM 角色。您可以重新创建具有相同设置的 IAM 角色进行恢复。

  • AsgInstanceLaunchFailures:您的 Auto Scaling 组在尝试启动实例时出现故障。

  • NodeCreationFailure:您启动的实例无法注册到您的 Amazon EKS 集群。导致这种失败的常见原因是不够的IAM 角色权限或缺少节点的出站 Internet 访问权限。您的节点必须能够使用公有 IP 地址访问 Internet 才能正常运行。有关更多信息,请参阅 VPC IP 寻址。您的节点还必须具有向 Internet 开放的端口。有关更多信息,请参阅 Amazon EKS 安全组注意事项

  • InstanceLimitExceeded:您的AWS账户无法启动指定实例类型的更多实例。您可以请求提高 Amazon EC2 实例限制以进行恢复。

  • InsufficientFreeAddresses:与托管节点组关联的一个或多个子网没有足够的 IP 地址供新节点使用。

  • InternalFailure:这些错误一般由 Amazon EKS 服务器端问题导致。

最常见的原因AccessDenied在托管节点组上执行操作时出现错误缺少eks:node-manager ClusterRole或者ClusterRoleBinding。Amazon EKS 在您的集群中设置这些资源,作为托管节点组启动的一部分,这些资源是管理节点组所必需的。

这些区域有:ClusterRole可能会随时间而改变,但应该类似于以下示例:

apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: eks:node-manager rules: - apiGroups: - '' resources: - pods verbs: - get - list - watch - delete - apiGroups: - '' resources: - nodes verbs: - get - list - watch - patch - apiGroups: - '' resources: - pods/eviction verbs: - create

这些区域有:ClusterRoleBinding可能会随时间而改变,但应该类似于以下示例:

apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks:node-manager roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: eks:node-manager subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: eks:node-manager

验证eks:node-manager ClusterRole存在。

kubectl describe clusterrole eks:node-manager

如果存在,则将输出与上一个ClusterRole示例。

验证eks:node-manager ClusterRoleBinding存在。

kubectl describe clusterrolebinding eks:node-manager

如果存在,则将输出与上一个ClusterRoleBinding示例。

如果您确定了缺少或损坏的ClusterRole或者ClusterRoleBinding作为导致AcessDenied请求托管节点组操作时出现错误,您可以还原它们。将以下内容保存到名为的文件中eks-node-manager-role.yaml

apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: eks:node-manager rules: - apiGroups: - '' resources: - pods verbs: - get - list - watch - delete - apiGroups: - '' resources: - nodes verbs: - get - list - watch - patch - apiGroups: - '' resources: - pods/eviction verbs: - create --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: eks:node-manager roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: eks:node-manager subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: eks:node-manager

应用文件。

kubectl apply -f eks-node-manager-role.yaml

重试节点组操作,查看是否解决了您的问题。

CNI 日志收集工具

针对 Kubernetes 的 Amazon VPC CNI 插件具有自己的故障排除脚本,可在/opt/cni/bin/aws-cni-support.sh。您可以使用脚本收集支持案例和常规故障排除的诊断日志。

使用以下命令可在节点上运行脚本:

sudo bash /opt/cni/bin/aws-cni-support.sh
注意

如果脚本在该位置不存在,CNI 容器将无法运行。可以使用以下命令手动下载并运行脚本:

curl -O https://raw.githubusercontent.com/awslabs/amazon-eks-ami/master/log-collector-script/linux/eks-log-collector.sh sudo bash eks-log-collector.sh

该脚本收集以下诊断信息。您已部署的 CNI 版本可以早于脚本版本。

This is version 0.6.1. New versions can be found at https://github.com/awslabs/amazon-eks-ami Trying to collect common operating system logs... Trying to collect kernel logs... Trying to collect mount points and volume information... Trying to collect SELinux status... Trying to collect iptables information... Trying to collect installed packages... Trying to collect active system services... Trying to collect Docker daemon information... Trying to collect kubelet information... Trying to collect L-IPAMD information... Trying to collect sysctls information... Trying to collect networking information... Trying to collect CNI configuration information... Trying to collect running Docker containers and gather container data... Trying to collect Docker daemon logs... Trying to archive gathered information... Done... your bundled logs are located in /var/log/eks_i-0717c9d54b6cfaa19_2020-03-24_0103-UTC_0.6.1.tar.gz

诊断信息收集并存储在

/var/log/eks_i-0717c9d54b6cfaa19_2020-03-24_0103-UTC_0.6.1.tar.gz

容器运行时网络未准备就绪

您可能会收到类似于以下内容的 Container runtime network not ready 错误和授权错误:

4191 kubelet.go:2130] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
4191 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:452: Failed to list *v1.Service: Unauthorized
4191 kubelet_node_status.go:106] Unable to register node "ip-10-40-175-122.ec2.internal" with API server: Unauthorized
4191 reflector.go:205] k8s.io/kubernetes/pkg/kubelet/kubelet.go:452: Failed to list *v1.Service: Unauthorized

这些错误很可能与AWSIAM 身份验证器配置映射未应用到节点。配置映射提供了system:bootstrapperssystem:nodesKubernetes RBAC 权限供节点注册到集群。有关更多信息,请参阅 。启用节点以加入集群上的自托管节点选项卡启动自我管理的亚马逊 Linux 节点。确保您在配置映射中指定实例角色的 Role ARN (角色 ARN) ,而不是 Instance Profile ARN (实例配置文件 ARN)

身份验证器无法识别角色 ARN如果它包含一个路径值是/,如以下示例:

arn:aws:iam::<111122223333>:role/<development/apps/prod-iam-role-NodeInstanceRole-621LVEXAMPLE>

当指定角色 ARN,该配置映射包含除/,则必须删除路径。将以上 ARN 指定为以下内容:

arn:aws:iam::<111122223333>:role/<prod-iam-role-NodeInstanceRole-621LVEXAMPLE>

TLS 握手超时

当节点无法建立到公有 API 服务器终端节点的连接时,您可能会遇到类似于以下错误的错误。

server.go:233] failed to run Kubelet: could not init cloud provider "aws": error finding instance i-1111f2222f333e44c: "error listing AWS instances: \"RequestError: send request failed\\ncaused by: Post net/http: TLS handshake timeout\""

kubelet 进程将持续重新生成并测试 API 服务器终端节点。在控制层面中执行集群滚动更新(例如配置更改或版本更新)的任何过程中,也可能临时发生此错误。

要解决此问题,请检查路由表和安全组,以确保来自节点的流量可以到达公有终端节点。

InvalidClientTokenId

如果您将 IAM 角色用于部署到中国区域集群的 Pod 或 daemonset 的服务账户,但尚未设置AWS_DEFAULT_REGION环境变量时,Pod 或 daemonset 可能会收到以下错误:

An error occurred (InvalidClientTokenId) when calling the GetCallerIdentity operation: The security token included in the request is invalid

要解决此问题,您需要将 AWS_DEFAULT_REGION 环境变量添加到您的 Pod 或 daemonset 规范中,如以下示例 Pod 规范中所示。

apiVersion: v1 kind: Pod metadata: name: envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: gcr.io/google-samples/node-hello:1.0 env: - name: AWS_DEFAULT_REGION value: "<region-code>"

VPC 准入 Webhook 证书到期

如果用于签名 VPC 接入 Webhook 的证书过期,则新 Windows 容器部署的状态将保持在ContainerCreating。如果您看到此信息,请使用以下命令查看有关处于此状态的容器的信息。

kubectl describe pod my-pod -n my-namespace

您将在返回的输出中看到以下事件。

Warning FailedCreatePodSandBox 39s kubelet

使用以下命令查看证书的到期日期。

kubectl get secret \ -n kube-system \ vpc-admission-webhook-certs -o json | \ jq -r '.data."cert.pem"' | \ base64 --decode | \ openssl x509 \ -noout \ -enddate | \ cut -d= -f2

输出

May 27 14:23:00 2021 GMT

如果您的证书已过期,则必须续订证书。有关更多信息,请参阅 续订 VPC 准入 Webhook 证书。部署新证书后,您必须重新部署每个卡在ContainerCreating状态。