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 中的子網路來建立您的叢集,叢集 VPC 託管於此錯誤訊息傳回之可用區域之中。

節點無法加入叢集

有幾個常見的原因會阻擋節點加入叢集:

  • 所以此aws-auth-cm.yaml檔案沒有可供您節點使用的正確 IAM 角色 ARN。請確認節點 IAM 角色 ARN (而非執行個體描述檔 ARN) 已在您的aws-auth-cm.yamlfile. 如需更多詳細資訊,請參閱 啟動自我管理的亞馬遜

  • 所以此ClusterName與您想要節點加入的叢集名稱不同。將不正確的值傳遞給此欄位會導致節點的/var/lib/kubelet/kubeconfig檔案,節點將不會加入叢集。

  • 節點未標記為擁有由叢集。您的節點必須套用下列標籤,其中<cluster-name>會以您叢集的名稱取代。

    Key

    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作為OptionsDHCP options set。預設值為domain-name:<region>.compute.internaldomain-name-servers:AmazonProvidedDNS。如需詳細資訊,請參閱「」DHCP 選項集(位於 Amazon VPC 使用者指南)。

未經授權或存取遭拒 (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"

這可能因為叢集是由 IAM 使用者或角色以一組 AWS 登入資料建立,而kubectl正在使用一組不同的憑證。

當 Amazon EKS 叢集已建立時,建立叢集的 IAM 實體 (使用者或角色) 會新增到 Kubernetes RBAC 授權表格做為管理員 (使用者或角色)。system:masters許可)。一開始,只有 IAM 使用者可以使用對 Kubernetes API 伺服器進行呼叫。kubectl。如需更多詳細資訊,請參閱 管理叢集的使用者或 IAM 角色。如果您使用主控台來建立叢集,您必須確保當您執行時,同一個 IAM 使用者登入資料位於 AWS 開發套件登入資料鏈中。kubectl命令。

如果安裝和設定 AWS CLI,您可以為使用者設定 IAM 登入資料。如需詳細資訊,請參閱「」設定 AWS CLI中的AWS 命令列界面使用者指南

如果您擔任建立 Amazon EKS 叢集的角色,您必須確保kubectl被配置為承擔相同的角色。使用下列命令以更新您的 kubeconfig 檔案,以利使用 IAM 角色。如需更多詳細資訊,請參閱 建立kubeconfig適用於 Amazon EKS

aws --region <region-code> eks update-kubeconfig --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對亞馬遜 EKS 呼叫時發生錯誤。如需詳細資訊,請參閱 Python 請求常見問答集的 What are "hostname doesn't match" errors?

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 管理主控台中收到錯誤「執行個體無法加入 kubernetes 叢集」,請確定已啟用叢集的私有端點存取,或您已正確設定公有端點存取的 CIDR 區塊。如需更多詳細資訊,請參閱 Amazon EKS 叢集端點存取控制

如果受管節點群組遇到運作狀態問題,Amazon EKS 會傳回錯誤訊息,以協助您診斷問題。下列錯誤訊息及其相關聯說明如下所示。

  • AccessDenied:Amazon EKS 或一或多個受管節點無法對您的 Kubernetes 叢集 API 伺服器進行驗證或授權。如需解決此錯誤的相關資訊,請參閱「」固定AccessDenied受管節點群組的錯誤

  • 找不到 AmiID:我們找不到與您的啟動範本相關聯的 AMI ID。確保 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 de:找不到受管節點群組的 IAM 角色。您可以使用相同設定來重新建立 IAM 角色以復原。

  • 隨 AsgInstanceLaunchFailures:您的 Auto Scaling 群組嘗試啟動執行個體時遇到失敗。

  • NodeCreationFailure:您啟動的執行個體無法向 Amazon EKS 叢集註冊。此失敗的常見原因不足節點 IAM 角色許可或節點缺少對外網際網路存取。您的節點必須能夠使用公用 IP 位址存取網際網路,才能正常運作。如需更多詳細資訊,請參閱 VPC IP 定址。您的節點也必須具備可向網際網路開啟的連接埠。如需更多詳細資訊,請參閱 Amazon EKS 安全群組考量

  • InstanceLimitExceeded 產:您的 AWS 帳戶無法再啟動所指定執行個體類型的任何執行個體。您可以要求增加 Amazon EC2 執行個體限制來復原。

  • InsufficientFreeAddresses:一或多個與受管節點群組相關聯的子網路沒有足夠的可用 IP 位址供新節點使用。

  • InternalFailure:這些錯誤通常由 Amazon EKS 伺服器端問題所造成。

最常見的原因AccessDenied在受管理節點群組上執行作業時發生錯誤,遺漏eks:node-manager ClusterRoleClusterRoleBinding。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範例。

如果您發現遺失或損壞ClusterRoleClusterRoleBinding作為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

這些錯誤很可能與節點未套用的 AWS IAM Authenticator 組態映射有關。配置對應提供system:bootstrapperssystem:nodesKubernetes RBAC 許可以讓節點註冊到叢集。如需詳細資訊,請參閱「」讓節點加入您的叢集自我管理節點的標籤啟動自我管理的亞馬遜。請確定您在組態映射中指定執行個體角色的 Role ARN (角色 ARN),而不是 Instance Profile ARN (執行個體描述檔 ARN)

驗證者無法辨識角色 ARN如果它包含path以外/,例如以下範例:

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>"