排解 Amazon EKS 叢集和節點問題 - Amazon EKS

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

排解 Amazon EKS 叢集和節點問題

此章節涵蓋一些您在使用 Amazon EKS 時可能遇到的常見錯誤,並提供解決方法。如果您需要針對特定 Amazon EKS 區域進行疑難排解,請參閱個別 疑難排解 IAM排解 Amazon EKS 連接器問題針對使用 EKS 附加元件的 ADOT 進行疑難排解主題。

若要了解其他疑難排解資訊,請參閱 AWS re:Post 上的 Amazon Elastic Kubernetes Service 的知識中心內容

容量不足

如果您在嘗試建立 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 託管於此錯誤訊息傳回之可用區域之中。

有些可用區域是叢集無法駐留的。將子網路所在的可用區域與子網路要求與考量中的可用區域清單進行比較。

節點無法加入叢集

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

  • 如果節點是受管節點,則 Amazon EKS 會在您建立節點群組時會將項目新增至 aws-auth ConfigMap。如果該項目被移除或修改,則您需要重新新增項目。如需詳細資訊,請在您的終端機中輸入 eksctl create iamidentitymapping --help。您可使用您的叢集名稱取代以下命令中的 my-cluster 部分,然後執行修改後的命令來檢視目前的 aws-auth ConfigMap 項目:eksctl get iamidentitymapping --cluster my-cluster 。您指定之角色的 ARN 不能包含 / 以外的路徑。例如,如果您的角色名稱是 development/apps/my-role,則您需要在指定角色的 ARN 時將其變更為 my-role。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。

    如果節點是自我管理的,且您尚未為節點的 IAM 角色的 ARN 建立存取項目,則執行所列出的針對受管節點的命令。如果您已為節點 IAM 角色 ARN 建立存取項目,則可能無法在存取項目中正確進行設定。請確認將節點 IAM 角色 ARN (而非執行個體設定檔 ARN) 指定為 aws-auth ConfigMap 項目或存取項目中的主體 ARN。如需存取項目的詳細資訊,請參閱 使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權

  • 在您的節點 AWS CloudFormation 範本中的 ClusterName 與您想要工作節點加入的叢集名稱不同。傳遞不正確的值到節點的 /var/lib/kubelet/kubeconfig 檔案之不正確的組態內的此欄位中,而節點不會加入叢集。

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

    金鑰

    kubernetes.io/cluster/my-cluster

    owned

  • 節點可能無法使用公有 IP 地址存取叢集。確定已將公有子網路中部署的節點指派給公有 IP 地址。如果沒有,您可以在啟動節點後將彈性 IP 位址關聯至節點。如需詳細資訊,請參閱將彈性 IP 地址與執行中的執行個體或網路介面建立關聯。如果公有子網路未設定為自動將公有 IP 地址指派給部署到該子網路的執行個體,則建議您啟用該設定。如需詳細資訊,請參閱修改子網的公有 IPv4 定址屬性。如果節點部署到私有子網路,則子網路必須具有指派給它的公有 IP 地址的 NAT 閘道路由。

  • 您要部署節點的 AWS 區域的 AWS STS 端點並未針對您的帳戶啟用。若要啟用區域,請參閱在 AWS 區域中啟用和停用 AWS STS

  • 節點沒有私有 DNS 項目,導致 kubelet 日誌包含 node "" not found 錯誤。確保建立節點所在的 VPC 具有為 domain-name 設定的值以及在 DHCP options set 中將 domain-name-servers 設定為 Options。預設值為 domain-name:<region>.compute.internaldomain-name-servers:AmazonProvidedDNS。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的 DHCP 選項集

  • 若受管節點群組中的節點在 15 分鐘內沒有連線至叢集,則會發出 "NodeCreationFailure" 運作狀態問題,且主控台狀態會設定為 Create failed。若是 AMI 啟動時間較慢,可使用快速啟動來解決此問題。

若要識別和疑難排解導致 Worker 節點無法加入叢集的常見原因,您可以使用 AWSSupport-TroubleshootEKSWorkerNode Runbook。如需詳細資訊,請參閱 AWS Systems Manager 自動化執行手冊參考中的 AWSSupport-TroubleshootEKSWorkerNode

未經授權或存取遭拒 (kubectl)

如果您在執行 kubectl 命令時,收到以下其中一個錯誤,則表示未為 Amazon EKS 正確設定 kubectl,或者表示您使用的 IAM 主體 (角色或使用者) 憑證並未映射到對 Amazon EKS 叢集上的 Kubernetes 物件具有足夠許可的 Kubernetes 使用者名稱。

  • 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 主體的憑證建立,而 kubectl 設定為使用另一個 IAM 主體的憑證。若要解決此問題,請更新 kube config 檔案以使用建立叢集時使用的憑證。如需詳細資訊,請參閱 透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集

  • 如果叢集符合透過 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權的「先決條件」部分的最低平台要求,則 IAM 主體不存在存取項目。如果存在,則沒有為其定義的必要的 Kubernetes 群組名稱,或沒有與其關聯的正確存取政策。如需詳細資訊,請參閱 使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權

  • 如果叢集符合透過 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權中的最低平台要求,則 IAM 主體的項目在 aws-auth ConfigMap 中不存在。如果存在,則不會映射到繫結到具有必要許可的 Kubernetes RoleClusterRole 的 Kubernetes 群組名稱。若要了解 Kubernetes 角色型授權 (RBAC) 物件的相關詳細資訊,請參閱 Kubernetes 文件中的使用 RBAC 授權。您可使用您的叢集名稱取代以下命令中的 my-cluster 部分,然後執行修改後的命令來檢視目前的 aws-auth ConfigMap 項目:eksctl get iamidentitymapping --cluster my-cluster 。如果您的 IAM 主體 ARN 的項目不在 ConfigMap 中,則請在終端機中輸入 eksctl create iamidentitymapping --help 以了解如何建立一個。

安裝和設定 AWS CLI 時,您可以設定使用的 IAM 憑證。如需詳細資訊,請參閱《AWS 命令列介面使用者指南》中的設定 AWS CLI。如果您透過擔任 IAM 角色來存取叢集上的 Kubernetes 物件,則也可以將 kubectl 設定為使用 IAM 角色。如需詳細資訊,請參閱 透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集

hostname doesn’t match

您的系統 Python 版本必須為 2.7.9 或更新版本。否則,對 Amazon EKS 發出 AWS CLI 呼叫時您會收到 hostname doesn’t match 錯誤。如需詳細資訊,請參閱 Python 請求常見問答集中的 什麼是「主機名稱不相符」錯誤?

getsockopt: no route to host

Docker 會在 Amazon EKS 叢集的 172.17.0.0/16 CIDR 範圍中執行。我們建議不要將叢集的 VPC 子網路與這個範圍重疊。否則,您會收到以下錯誤:

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

Instances failed to join the Kubernetes cluster

如果您在 AWS 管理主控台 中收到錯誤 Instances failed to join the Kubernetes cluster,請確定已啟用叢集的私有端點存取,或您已正確設定公有端點存取的 CIDR 區塊。如需詳細資訊,請參閱 叢集 API 伺服器端點

受管節點群組錯誤代碼

如果受管節點群組遇到硬體運作狀態問題,Amazon EKS 會傳回錯誤代碼,以協助您診斷問題。這些運作狀態檢查不會偵測軟體問題,因為檢查是以 Amazon EC2 運作狀態檢查為基礎。以下清單描述了這些錯誤代碼。

AccessDenied

Amazon EKS 或一或多個受管節點無法透過 Kubernetes 叢集 API 伺服器進行身分驗證或授權。如需有關解決常見原因的詳細資訊,請參閱 修正受管節點群組的 AccessDenied 錯誤的常見原因。私有 Windows AMI 也可能導致此錯誤代碼隨 Not authorized for images 錯誤訊息同時出現。如需詳細資訊,請參閱 Not authorized for images

AmiIdNotFound

我們找不到與您的啟動範本相關聯的 AMI ID。請確認 AMI 已存在且已與您的帳戶共用。

AutoScalingGroupNotFound

我們找不到與受管節點群組相關聯的 Auto Scaling 群組。您可以使用相同設定來重新建立 Auto Scaling 群組以復原。

ClusterUnreachable

Amazon EKS 或一或多個受管節點無法與您的 Kubernetes 叢集 API 伺服器通訊。如果發生網路中斷或 API 伺服器處理請求逾時,就會發生這種情況。

Ec2SecurityGroupNotFound

我們找不到叢集的叢集安全群組。您必須重新建立叢集。

Ec2SecurityGroupDeletionFailure

無法刪除受管節點群組的遠端存取安全群組。從安全群組移除任何相依項目。

Ec2LaunchTemplateNotFound

我們找不到受管節點群組的 Amazon EC2 啟動範本。您必須重新建立節點群組以復原。

Ec2LaunchTemplateVersionMismatch

受管節點群組的 Amazon EC2 啟動範本版本與 Amazon EKS 建立的版本不相符。您可以還原為 Amazon EKS 所建立的版本以復原。

IamInstanceProfileNotFound

我們找不到受管節點群組的 IAM 執行個體設定檔。您可以使用相同設定來重新建立執行個體描述檔以復原。

IamNodeRoleNotFound

我們找不到受管節點群組的 IAM 角色。您可以使用相同設定來重新建立 IAM 角色以復原。

AsgInstanceLaunchFailures

您的 Auto Scaling 群組嘗試啟動執行個體時失敗。

NodeCreationFailure

您啟動的執行個體無法向 Amazon EKS 叢集註冊。這項失敗的常見原因是節點 IAM 角色許可不足或節點缺少對外網際網路存取。您的節點必須符合下列任何一項要求:

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 範例進行比較。

如果在請求受管節點群組操作時您發現缺少或損壞 ClusterRoleClusterRoleBindingAcessDenied 錯誤的原因,您可以將其還原。儲存以下內容至名稱為 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

重試節點群組操作,看看是否可以解決您的問題。

Not authorized for images

導致 Not authorized for images 錯誤訊息的一個潛在原因是使用私有 Amazon EKS Windows AMI 啟動 Windows 受管節點群組。發布全新 Windows AMI 之後,AWS 會將超過 4 個月的 AMI 設定為私有,這會使其不再可供存取。如果您的受管節點群組使用私有 Windows AMI,請考慮更新 Windows 受管節點群組。雖然我們不能保證向已經設定為私有的 AMI 提供存取權,但您可藉由向 AWS Support 提交工單來請求存取權。如需詳細資訊,請參閱Amazon EC2 使用者指南中的修補程式

節點進入 NotReady 狀態

若節點進入 NotReady 狀態,這可能表明節點狀況不佳,並且無法排程新的 Pod。發生這種情況可能出於各種原因,例如,節點缺少 CPU、記憶體或可用磁碟空間等充足的資源。

若是 Amazon EKS 最佳化 Windows AMI,依預設,kubelet 組態中不會保留運算資源。為協助避免資源問題,可向 kubelet 提供 kube-reserved 及/或 system-reserved 的組態值,藉此來為系統程序預留運算資源。您可使用引導指令碼中的 -KubeletExtraArgs 命令列參數來執行此動作。如需詳細資訊,請參閱《Kubernetes 文件》中的為系統常駐程式預留運算資源,以及本《使用者指南》中的 引導指令碼組態參數

EKS 日誌收集器

如需排解 Amazon EKS 節點問題,位於 /etc/eks/log-collector-script/eks-log-collector.sh 的節點上提供了預先建置的指令碼。您可以使用指令碼來收集支援案例和一般故障診斷的診斷日誌。

在您的節點使用以下命令即可執行指令碼:

sudo bash /etc/eks/log-collector-script/eks-log-collector.sh
注意

若指令碼在該位置不存在。您可使用以下命令手動下載並執行指令碼:

curl -O https://amazon-eks.s3.amazonaws.com/support/log-collector-script/linux/eks-log-collector.sh sudo bash eks-log-collector.sh

該指令碼收集的診斷資訊如下。

$ sudo bash /etc/eks/log-collector-script/eks-log-collector.sh This is version 0.7.8. New versions can be found at https://github.com/awslabs/amazon-eks-ami/blob/main/log-collector-script/ Trying to collect common operating system logs... Trying to collect kernel logs... Trying to collect mount points and volume information... ... ... Done... your bundled logs are located in /var/log/eks_i-EXAMPLE_2025-03-25_0000-UTC_0.7.8.tar.gz

診斷資訊收集後將存放於:

/var/log/eks_i-EXAMPLE_2025-03-25_0000-UTC_0.7.8.tar.gz

如需擷取 Bottlerocket 節點的日誌套件,請參閱 Bottlerocket 日誌獲取更多詳細資訊。

容器執行階段網路尚未就緒

您可能會收到類似下列的 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

這種情況可能由下列原因之一造成:

  1. 叢集上沒有 aws-auth ConfigMap,或者它不包含針對您設定節點時所使用 IAM 角色的項目。

    若要解決此問題,您可使用您的叢集名稱取代以下命令中的 my-cluster 部分,然後執行修改後的命令來檢視目前 ConfigMap 中的項目:eksctl get iamidentitymapping --cluster my-cluster 。如果執行該命令時遇到錯誤訊息,則可能是因為叢集沒有 aws-auth ConfigMap。以下命令會將項目新增至 ConfigMap。如果 ConfigMap 不存在,則該命令會建立它。使用相應 IAM 角色的 AWS 帳戶 ID 取代 111122223333,並使用節點的角色名稱取代 myAmazonEKSNodeRole

    eksctl create iamidentitymapping --cluster my-cluster \ --arn arn:aws:iam::111122223333:role/myAmazonEKSNodeRole --group system:bootstrappers,system:nodes \ --username system:node:{{EC2PrivateDNSName}}

    您指定之角色的 ARN 不能包含 / 以外的路徑。例如,如果您的角色名稱是 development/apps/my-role,則您需要在指定角色的 ARN 時將其變更為 my-role。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。

  2. 您的自我管理節點所在的叢集的平台版本為透過 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權主題「先決條件」中列出的最低版本,但 aws-auth ConfigMap (請參閱上一項) 中沒有針對該節點之 IAM 角色的項目或不存在針對該角色的存取項目。若要解決此問題,您可使用您的叢集名稱取代以下命令中的 my-cluster 部分,然後執行修改後的命令來檢視目前的存取項目:aws eks list-access-entries --cluster-name my-cluster 。以下命令會為相應節點的 IAM 角色新增一個存取項目。使用相應 IAM 角色的 AWS 帳戶 ID 取代 111122223333,並使用節點的角色名稱取代 myAmazonEKSNodeRole。如果節點為 Windows 節點,請使用 EC2_Windows 取代 EC2_LINUX。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。

    aws eks create-access-entry --cluster-name my-cluster --principal-arn arn:aws:iam::111122223333:role/myAmazonEKSNodeRole --type EC2_LINUX

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

如果您使用針對部署至中國 AWS 區域內叢集的 Pod 或 Daemonset 服務帳戶的 IAM 角色且尚未在規格中設定 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"

升級控制平面之前,節點群組必須符合 Kubernetes 版本

在將控制平面更新為新的 Kubernetes 版本之前,您叢集中的 Kubernetes 次要版本的受管和 Fargate 節點必須要與控制平面目前版本的版本相同。在將所有 Amazon EKS 受管節點升級為目前的叢集版本前,Amazon EKS update-cluster-version API 都會拒絕請求。Amazon EKS 提供 API 來升級受管節點。如需升級受管節點群組的 Kubernetes 版本的資訊,請參閱 更新叢集的受管節點群組。若要升級 Fargate 節點的版本,請刪除節點所代表的 Pod,並在升級控制平面後重新部署 Pod。如需詳細資訊,請參閱 將現有叢集更新至全新 Kubernetes 版本

啟動許多節點時,會出現 Too Many Requests 錯誤

如果同時啟動許多節點,您可能會 Amazon EC2 使用者資料執行日誌看見錯誤訊息,其顯示 Too Many Requests。這可能是因為控制平面因 describeCluster 呼叫超載。超載會導致調節、節點無法執行引導指令碼,以及節點無法完全加入叢集。

確認將 --apiserver-endpoint--b64-cluster-ca--dns-cluster-ip 引數傳遞至節點的引導指令碼。包含這些引數時,不需要引導指令碼進行 describeCluster 呼叫,這有助於防止控制平面超載。如需詳細資訊,請參閱 提供使用者資料將引數傳遞給 bootstrap.sh 檔案,其中包含 Amazon EKS 最佳化 Linux/Bottlerocket AMI

針對 Kubernetes API 伺服器請求回應的 HTTP 401 未經授權的錯誤

如果叢集上的 Pod 服務帳戶字符已過期,您會看到這些錯誤。

您的 Amazon EKS 叢集的 Kubernetes API 伺服器拒絕使用超過 90 天的字符的請求。在 Kubernetes 舊版本中,字符沒有過期。這意味著倚賴這些字符的客户端必須在一小時內進行重新整理。為了防止 Kubernetes API 伺服器因無效字符而拒絕您的請求,您的工作負載使用的 Kubernetes 用戶端 SDK 版本必須與以下版本相同或為更新版本:

  • Go 版本 0.15.7 和更新版本

  • Python 版本 12.0.0 和更新版本

  • Java 版本 9.0.0 和更新版本

  • JavaScript 版本 0.10.3 和更新版本

  • Ruby master 分支

  • Haskell 版本 0.3.0.0

  • C# 7.0.5 版及更新版本

您可以識別叢集中所有使用過時字符的現有 Pod。如需詳細資訊,請參閱 服務帳戶字符

Amazon EKS 平台版本比目前平台版本落後兩個版本以上

當 Amazon EKS 無法自動更新叢集的 platform-version 時,可能會發生這種情況。儘管造成這種情況的原因很多,然而一些常見的原因如下。如果這些問題中有任何一個適用於您的叢集,其可能仍然可以運作,但 Amazon EKS 不會更新其平台版本。

問題

叢集 IAM 角色已刪除,此角色是在建立叢集時指定。您可以使用以下命令,查看指定了哪個角色。使用您叢集的名稱取代 my-cluster

aws eks describe-cluster --name my-cluster --query cluster.roleArn --output text | cut -d / -f 2

範例輸出如下。

eksClusterRole
解決方案

建立具有相同名稱的新叢集 IAM 角色

問題

已刪除叢集建立期間指定的子網路 – 即叢集建立期間指定要與叢集搭配使用的子網路。您可以使用以下命令,查看指定了哪些子網路。使用您叢集的名稱取代 my-cluster

aws eks describe-cluster --name my-cluster --query cluster.resourcesVpcConfig.subnetIds

範例輸出如下。

[ "subnet-EXAMPLE1", "subnet-EXAMPLE2" ]
解決方案

確認您的帳戶中是否存在子網路 ID。

vpc_id=$(aws eks describe-cluster --name my-cluster --query cluster.resourcesVpcConfig.vpcId --output text) aws ec2 describe-subnets --filters "Name=vpc-id,Values=$vpc_id" --query "Subnets[*].SubnetId"

範例輸出如下。

[ "subnet-EXAMPLE3", "subnet-EXAMPLE4" ]

如果輸出中傳回的子網路 ID 與建立叢集時指定的子網路 ID 不符,假如您希望 Amazon EKS 更新叢集,則需要變更叢集使用的子網路。這是因為如果您在建立叢集時指定了兩個以上的子網路,Amazon EKS 會隨機選取您指定在其中建立新彈性網路介面的子網路。這些網路介面可讓控制平面與節點進行通訊。如果叢集選取的子網路不存在,Amazon EKS 將不會更新叢集。您無法控制 Amazon EKS 會從您於建立叢集時指定的子網路中選擇哪些在其中建立新網路介面。

當您啟動叢集的 Kubernetes 版本更新,該更新可能會因相同的原因而失敗。

問題

叢集建立期間指定的安全群組已刪除 – 如果您在叢集建立期間指定了安全群組,您可以使用下列命令查看其 ID。使用您叢集的名稱取代 my-cluster

aws eks describe-cluster --name my-cluster --query cluster.resourcesVpcConfig.securityGroupIds

範例輸出如下。

[ "sg-EXAMPLE1" ]

如果傳回 [],若在建立叢集時未指定安全群組,而缺少安全群組並不是問題所在。如果傳回安全群組,則請確認安全群組位於您的帳戶中。

解決方案

請確認這些安全性群組是否位於您的帳戶中。

vpc_id=$(aws eks describe-cluster --name my-cluster --query cluster.resourcesVpcConfig.vpcId --output text) aws ec2 describe-security-groups --filters "Name=vpc-id,Values=$vpc_id" --query "SecurityGroups[*].GroupId"

範例輸出如下。

[ "sg-EXAMPLE2" ]

如果輸出中傳回的安全群組 ID 與建立叢集時指定的安全群組 ID 不符,若您希望 Amazon EKS 更新該叢集,則需要變更叢集使用的安全群組。如果在建立叢集時指定的安全群組 ID 不存在,Amazon EKS 將不會更新叢集。

當您啟動叢集的 Kubernetes 版本更新,該更新可能會因相同的原因而失敗。

  • 您在建立叢集時指定的每個子網路中,沒有至少六個 (雖然我們建議使用 16 個) 可用的 IP 位址。如果子網路中可用的 IP 位址不足,則需要釋出子網路中的 IP 位址,或是需要變更叢集使用的子網路,使用具有足夠 IP 位址的子網路。

  • 當您建立叢集和已刪除您指定的 AWS KMS 金鑰,您已啟用秘密加密。假如您希望 Amazon EKS 更新叢集,您必須建立新的叢集

叢集運作狀態常見問答集與包含解析路徑的錯誤代碼

Amazon EKS 可偵測 Amazon EKS 叢集以及叢集基礎結構的問題,並將問題存放在 EKS 叢集資源的運作狀態物件中。藉助叢集運作狀態資訊,您可以更快速地偵測、診斷並解決叢集問題,從而建立更安全且及時更新的應用程式環境。此外,由於必要的基礎結構或叢集組態出現問題,您可能無法升級至較新版本的 Kubernetes,也可能無法讓 Amazon EKS 在降級的叢集上安裝安全更新。Amazon EKS 可能需要 3 小時才能偵測到問題或偵測某個問題是否已解決。

維護 Amazon EKS 叢集的運作狀態是 Amazon EKS 及其使用者共同的責任。使用者負責 IAM 角色和 Amazon VPC 子網路的必備基礎設施,以及其他必須事先提供的必要基礎設施。Amazon EKS 偵測此基礎設施和叢集的組態變更。

若要在 Amazon EKS 主控台中存取叢集的運作狀態,請在透過 Amazon EKS 叢集詳細資訊頁面存取的可觀測性儀表板的叢集運作狀態問題索引標籤中,尋找名稱為運作狀態問題的資料表。相關資料亦可透過呼叫 EKS API 中的 DescribeCluster 動作來取得,例如透過 AWS 命令列介面進行呼叫。

這項功能有什麼用?

您將能夠更深入地了解 Amazon EKS 叢集的運作狀態,快速診斷和修復問題,而無需花費時間偵錯或開啟 AWS 支援案例。例如:如果您意外刪除了 Amazon EKS 叢集的子網路,則 Amazon EKS 將無法建立跨帳戶網路介面和 Kubernetes AWS CLI 命令,例如 kubectl exec 或 kubectl logs。這些操作將會失敗並顯示錯誤:"Error from server: error dialing backend: remote error: tls: internal error."。這時會出現內容為此的 Amazon EKS 運作狀態問題:subnet-da60e280 was deleted: could not create network interface

此功能與其他 AWS 服務有何關係或如何協同運作?

IAM 角色和 Amazon VPC 子網路是叢集運作狀態對其進行問題偵測的其中兩項必備基礎設施。如果這些資源設定不正確,則此功能將傳回詳細錯誤資訊。

有運作狀態問題的叢集是否收費?

是的。每個 Amazon EKS 叢集均以標準 Amazon EKS 定價計費。但叢集運作狀態功能是免費提供的。

此功能是否可用於 AWS Outposts 上的 Amazon EKS 叢集?

是。此功能會偵測 AWS 雲端中 EKS 叢集的叢集問題,包括 AWS Outposts 上的擴充叢集和 AWS Outposts 上的本機叢集。叢集運作狀態功能不會偵測 Amazon EKS Anywhere 或 Amazon EKS Distro (EKS-D) 的問題。

偵測到新問題時我是否會收到通知?

是。偵測到新的叢集運作狀態問題時,AWS 會傳送電子郵件與運作狀態儀表板個人通知。

主控台是否會向我發出有關運作狀態問題的警告?

是。任何存在運作狀態問題的叢集都會在主控台頂部包含一則橫幅。

前兩欄是 API 回應值所需的內容。Health ClusterIssue 物件的第三個欄位是 Health ClusterIssue 物件,其傳回的值取決於問題類型。

代碼 訊息 ResourceIds 叢集可復原?

SUBNET_NOT_FOUND

我們找不到目前與叢集關聯的一個或多個子網路。請呼叫 Amazon EKS update-cluster-config API 以更新子網路。

子網路 ID

SECURITY_GROUP_NOT_FOUND

我們找不到目前與叢集關聯的一個或多個安全群組。請呼叫 Amazon EKS update-cluster-config API 以更新安全群組。

安全群組 ID

IP_NOT_AVAILABLE

與叢集關聯的一個或多個子網路沒有足夠的可用 IP 地址供 Amazon EKS 執行叢集管理操作。請使用 Amazon EKS update-cluster-config API 釋放子網路中的地址或將其他子網路關聯到叢集。

子網路 ID

VPC_NOT_FOUND

我們找不到與叢集關聯的 VPC。您必須刪除並重新建立叢集。

VPC ID

ASSUME_ROLE_ACCESS_DENIED

叢集未使用 Amazon EKS 服務連結角色。我們無法擔任與叢集關聯的角色,從而無法執行所需的 Amazon EKS 管理操作。請檢查相應角色是否存在並具有所需的信任政策。

叢集 IAM 角色

PERMISSION_ACCESS_DENIED

叢集未使用 Amazon EKS 服務連結角色。與叢集關聯的角色未授予 Amazon EKS 執行所需管理操作需要的足夠許可。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。

叢集 IAM 角色

ASSUME_ROLE_ACCESS_DENIED_USING_SLR

我們無法擔任 Amazon EKS 叢集管理服務連結角色。請檢查相應角色是否存在並具有所需的信任政策。

Amazon EKS 服務連結角色

PERMISSION_ACCESS_DENIED_USING_SLR

Amazon EKS 叢集管理服務連結角色未授予 Amazon EKS 執行所需管理操作需要的足夠許可。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。

Amazon EKS 服務連結角色

OPT_IN_REQUIRED

您的帳戶沒有 Amazon EC2 服務訂閱。請在帳戶設定頁面中更新帳戶訂閱。

N/A

STS_REGIONAL_ENDPOINT_DISABLED

相應 STS 區域端點已停用。請啟用相應端點,以讓 Amazon EKS 能夠執行所需的叢集管理操作。

N/A

KMS_KEY_DISABLED

與叢集關聯的 AWS KMS 金鑰 已停用。請重新啟用該金鑰以復原叢集。

KMS 金鑰 ARN

KMS_KEY_NOT_FOUND

我們找不到與叢集關聯的 AWS KMS 金鑰。您必須刪除並重新建立叢集。

KMS 金鑰 ARN

KMS_GRANT_REVOKED

與叢集關聯的 AWS KMS 金鑰的授予已被撤銷。您必須刪除並重新建立叢集。

KMS 金鑰 ARN