協助改善此頁面
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
若要提供此使用者指南,請選擇位於每個頁面右窗格中的 GitHub 上編輯此頁面連結。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
此章節涵蓋一些您在使用 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
。您指定之角色的 ARN 不能包含 以外的路徑my-cluster
/
。例如,如果您的角色名稱是development/apps/my-role
,則當您為角色指定 ARNmy-role
時,需要將其變更為 。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。如果節點是自我管理的,而且您尚未為節點 IAM 角色的 ARN 建立存取項目,則請執行針對受管節點列出的相同命令。如果您已為節點 IAM 角色 ARN 建立存取項目,則可能無法在存取項目中正確進行設定。請確認將節點 IAM 角色 ARN (而非執行個體設定檔 ARN) 指定為
aws-auth
ConfigMap
項目或存取項目中的主體 ARN。如需存取項目的詳細資訊,請參閱 授予 IAM 使用者使用 EKS 存取項目存取 Kubernetes。 -
node AWS CloudFormation 範本中的 ClusterName 與您希望節點加入的叢集名稱不完全相符。將不正確的值傳遞至此欄位會導致節點
/var/lib/kubelet/kubeconfig
檔案的組態不正確,而且節點不會加入叢集。 -
節點未標記為叢集所擁有。您的節點必須套用下列標籤,其中
my-cluster
會取代為您的叢集名稱。金鑰 值 kubernetes.io/cluster/
my-cluster
owned
-
節點可能無法使用公有 IP 地址存取叢集。確定已將公有子網路中部署的節點指派給公有 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.internal
和domain-name-servers:AmazonProvidedDNS
。如需詳細資訊,請參閱《Amazon VPC 使用者指南》中的 DHCP 選項集。 -
如果受管節點群組中的節點未在 15 分鐘內連線到叢集,則會發出「NodeCreationFailure」的運作狀態問題,且主控台狀態會設為
Create failed
。對於啟動時間緩慢AMIs,可以使用快速啟動解決此問題。
若要識別和疑難排解導致 Worker 節點無法加入叢集的常見原因,您可以使用 AWSSupport-TroubleshootEKSWorkerNode
Runbook。如需詳細資訊,請參閱 AWS Systems Manager Automation Runbook 參考 AWSSupport-TroubleshootEKSWorkerNode
中的 。
未經授權或存取遭拒 (kubectl
)
如果您在執行kubectl
命令時收到下列其中一個錯誤,表示您未正確kubectl
設定 Amazon EKS,或您所使用的 IAM 委託人 (角色或使用者) 的登入資料,未對應到 Kubernetes 使用者名稱,該使用者名稱具有對 Amazon EKS 叢集上 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 叢集。 -
如果您的叢集符合授予 IAM 使用者使用 EKS 存取項目存取 Kubernetes 的先決條件區段中的最低平台需求,則存取項目不會與您的 IAM 主體存在。如果存在,表示它沒有為其定義的必要 Kubernetes 群組名稱,或沒有與其相關聯的適當存取政策。如需詳細資訊,請參閱授予 IAM 使用者使用 EKS 存取項目存取 Kubernetes。
-
如果您的叢集不符合使用 EKS 存取項目授予 IAM 使用者存取 Kubernetes 的最低平台需求,則 中不存在具有 IAM 主體的項目
aws-auth
ConfigMap
。如果存在,則不會映射到綁定到 KubernetesRole
或ClusterRole
具有必要許可的 Kubernetes 群組名稱。如需 Kubernetes 角色型授權 (RBAC) 物件的詳細資訊,請參閱 Kubernetes 文件中的使用 RBAC 授權。您可使用您的叢集名稱取代以下命令中的 my-cluster
部分,然後執行修改後的命令來檢視目前的aws-auth
ConfigMap
項目:eksctl get iamidentitymapping --cluster
。如果具有 IAM 主體 ARN 的 項目不在 中my-cluster
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
或更新版本。否則,您會收到 CLI AWS 呼叫 Amazon EKS 的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
如果您在 Instances failed to join the Kubernetes cluster
中收到錯誤 AWS Management Console,請確定叢集的私有端點存取已啟用,或您已正確設定 CIDR 區塊以進行公有端點存取。如需詳細資訊,請參閱控制叢集 API 伺服器端點的網路存取。
受管節點群組錯誤代碼
如果受管節點群組遇到硬體運作狀態問題,Amazon EKS 會傳回錯誤代碼,以協助您診斷問題。這些運作狀態檢查不會偵測到軟體問題,因為它們是以 Amazon EC2 運作狀態檢查為基礎。以下清單描述了這些錯誤代碼。
- AccessDenied
-
Amazon EKS 或一或多個受管節點無法與您的 Kubernetes 叢集 API 伺服器進行身分驗證或授權。如需有關解決常見原因的詳細資訊,請參閱 修正受管節點群組的 AccessDenied 錯誤的常見原因。私有 Windows AMIs 也可能導致此錯誤碼與
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 角色許可不足或節點缺少對外網際網路存取。您的節點必須符合下列任何一項要求:
-
能夠使用公有 IP 地址存取網際網路。與節點所在的子網路相關聯的安全群組必須允許通訊。如需詳細資訊,請參閱 子網需求和注意事項 和 檢視叢集的 Amazon EKS 安全群組需求。
-
您的節點和 VPC 必須符合部署具有有限網際網路存取的私有叢集中的要求。
-
- 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
範例進行比較。
如果您在請求受管節點群組操作AcessDenied
時發現遺失或損壞,ClusterRole
或ClusterRoleBinding
發現錯誤的原因,您可以還原它們。將下列內容儲存至名為 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 AMIs 之後, AWS 會讓超過 4 個月的 AMIs 成為私有,使其不再可存取。如果您的受管節點群組使用私有 Windows AMI,請考慮更新您的 Windows 受管節點群組。雖然我們無法保證我們可以提供已設為私有AMIs 存取權,但您可以透過向 AWS Support 提交票證來請求存取權。如需詳細資訊,請參閱《Amazon EC2 使用者指南》中的修補程式。
節點處於 NotReady
狀態
如果您的節點進入 NotReady
狀態,這可能表示節點運作狀態不佳,且無法排程新的 Pod。這可能由於各種原因而發生,例如節點缺少足夠 CPU、記憶體或可用磁碟空間的資源。
對於 Amazon EKS 最佳化 Windows AMIs,在kubelet
組態中預設指定的運算資源沒有保留。為了協助防止資源問題,您可以為系統程序預留運算資源,方法是提供 kube 預留kubelet
組態值。您可以使用引導指令碼中的-KubeletExtraArgs
命令列參數來執行此操作。如需詳細資訊,請參閱 Kubernetes 文件和本使用者指南引導指令碼組態參數中的預留系統精靈的運算資源
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-auth
ConfigMap
上沒有 ,或者它不包含您設定節點之 IAM 角色的項目。若要解決此問題,您可使用您的叢集名稱取代以下命令中的
my-cluster
部分,然後執行修改後的命令來檢視目前ConfigMap
中的項目:eksctl get iamidentitymapping --cluster
。如果您收到來自 命令的錯誤訊息,可能是因為您的叢集沒有my-cluster
aws-auth
ConfigMap
。以下命令會將項目新增至ConfigMap
。如果ConfigMap
不存在,命令也會建立它。將111122223333
取代為 IAM 角色 AWS 的帳戶 ID,將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
,則在指定角色的 ARNmy-role
時,您需要將其變更為 。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。 -
您的自我管理節點位於叢集中,其平台版本至少列於 授予 IAM 使用者使用 EKS 存取項目主題存取 Kubernetes 的先決條件中,但節點 IAM 角色的項目未列在
aws-auth
ConfigMap
(請參閱上一個項目) 中,或角色的存取項目不存在。若要解決此問題,您可使用您的叢集名稱取代以下命令中的my-cluster
部分,然後執行修改後的命令來檢視目前的存取項目:aws eks list-access-entries --cluster-name
。下列命令會為節點的 IAM 角色新增存取項目。將my-cluster
111122223333
取代為 IAM 角色 AWS 的帳戶 ID,將myAmazonEKSNodeRole
取代為節點角色的名稱。如果您有 Windows 節點,請將EC2_LINUX
取代為EC2_Windows
。請確認您指定的是節點 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 版本之前,叢集中受管節點和 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
呼叫,這有助於防止控制平面過載。如需詳細資訊,請參閱提供使用者資料,將引數傳遞至 Amazon EKS 最佳化 Linux/Bottlerocket AMI 隨附的bootstrap.sh檔案。
針對 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 無法自動更新叢集的平台版本時,可能會發生這種情況。儘管造成這種情況的原因很多,然而一些常見的原因如下。如果任何這些問題適用於您的叢集,它仍然可以運作,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"
]
如果輸出中傳回的子網路 IDs 與建立叢集時指定的子網路 IDs 不相符,則如果您希望 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"
]
如果輸出中傳回的安全群組 IDs 與建立叢集時指定的安全群組 IDs 不相符,則如果您希望 Amazon EKS 更新叢集,則需要變更叢集使用的安全群組。如果叢集建立時指定的安全群組 IDs 不存在,Amazon EKS 不會更新叢集。
當您啟動叢集的 Kubernetes 版本更新時,更新可能會因為相同原因而失敗。
-
您在建立叢集時指定的每個子網路中沒有至少六個 (雖然我們建議 16 個) 可用的 IP 地址。如果您在子網路中沒有足夠的可用 IP 地址,您需要釋放子網路中的 IP 地址,或者您需要變更叢集使用的子網路,以使用具有足夠可用 IP 地址的子網路。
-
您在建立叢集時啟用秘密加密,且您指定的 AWS KMS 金鑰已刪除。假如您希望 Amazon EKS 更新叢集,您必須建立新的叢集
叢集運作狀態FAQs和錯誤代碼,以及解析路徑
Amazon EKS 會偵測 Amazon 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
log。這些操作將會失敗並顯示錯誤:"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 Outpost 上的擴充叢集和 AWS Outpost 上的本機叢集。叢集運作狀態無法偵測 Amazon EKS Anywhere 或 Amazon EKS Distro (EKS-D) 的問題。
- 偵測到新問題時,我會收到通知嗎?
-
是。偵測到新的叢集運作狀態問題時, AWS 會傳送電子郵件和個人運作狀態儀表板通知。
- 主控台是否針對健康問題警告我?
-
是。任何存在運作狀態問題的叢集都會在主控台頂部包含一則橫幅。
前兩欄是 API 回應值所需的內容。Health ClusterIssue 物件的第三個欄位是 resourceIds,其傳回取決於問題類型。
代碼 | 訊息 | 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 叢集管理service-linked-role。請檢查相應角色是否存在並具有所需的信任政策。 |
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 |
否 |