協助改善此頁面
想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [ 編輯此頁面於 ] 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
。您指定之角色的 ARN 不能包含
my-cluster
/
以外的
路徑
。例如,如果您的角色名稱是
development/apps/my-role
,則您需要在指定角色的 ARN 時將其變更為
my-role
。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。
如果節點是自我管理的,且您尚未為節點的 IAM 角色的 ARN 建立
存取項目
,則執行所列出的針對受管節點的命令。如果您已為節點 IAM 角色 ARN 建立存取項目,則可能無法在存取項目中正確進行設定。請確認將節點 IAM 角色 ARN (而非執行個體設定檔 ARN) 指定為
aws-auth
ConfigMap
項目或存取項目中的主體 ARN。如需存取項目的詳細資訊,請參閱
IAM使用 EKS 存取項Kubernetes目授予使用者存取權
。
節點 AWS CloudFormation 範本
ClusterName
中的與您希望節點加入的叢集名稱不完全相符。傳遞不正確的值到節點的
/var/lib/kubelet/kubeconfig
檔案之不正確的組態內的此欄位中,而節點不會加入叢集。
節點未標記為叢集
所擁有
。您的節點必須套用下列標籤,其中
會以叢集的名稱取代。
my-cluster
節點可能無法使用公有 IP 地址存取叢集。確定已將公有子網路中部署的節點指派給公有 IP 地址。如果沒有,您可以在啟動節點後將彈性 IP 地址關聯至節點。如需詳細資訊,請參閱
將彈性 IP 地址與執行中的執行個體或網路介面建立關聯
。如果公有子網路未設定為自動將公有 IP 地址指派給部署到該子網路的執行個體,則建議您啟用該設定。如需詳細資訊,請參閱
修改子網路的公有
IPv4
定址屬性
。如果節點部署到私有子網路,則子網路必須具有指派給它的公有 IP 地址的 NAT 閘道路由。
您要部署節點 AWS 區域 的 AWS STS 端點未啟用您的帳戶。若要啟用區域,請參閱 AWS STS 在 AWS 區域 .
節點沒有私有 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 分鐘內連線到叢集,則會發出健全狀況問題「NodeCreation失敗」,並將主控台狀態設定為
Create failed
。對於啟動時間緩慢的 Windows AMI,可以使用
快速啟動
來解決此問題。
若要識別和疑難排解導致 Worker 節點無法加入叢集的常見原因,您可以使用
AWSSupport-TroubleshootEKSWorkerNode
Runbook。如需詳細資訊,請參閱
AWS Systems Manager
Automation Runbook 參考
中的
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
檔案以使用建立叢集時使用的憑證。如需詳細資訊,請參閱
透過建立檔案 Connect 線kubectl至 EKS 叢集 kubeconfig
。
如果叢集符合 IAM使用 EKS 存取項Kubernetes目授予使用者存取權 「先決條件」部分的最低平台要求,則 IAM 主體不存在存取項目。如果存在,則沒有為其定義的必要的 Kubernetes 群組名稱,或沒有與其關聯的正確存取政策。如需詳細資訊,請參閱 IAM使用 EKS 存取項Kubernetes目授予使用者存取權 。
如果叢集不符合
IAM使用 EKS 存取項Kubernetes目授予使用者存取權
中的最低平台要求,則
aws-auth
ConfigMap
中不存在包含 IAM 主體的項目。如果存在,則不會映射到繫結到具有必要許可的 Kubernetes
Role
或
ClusterRole
的 Kubernetes 群組名稱。如需有關 Kubernetes 角色型授權 (RBAC) 物件的詳細資訊,請參閱 Kubernetes 文件中的
Using RBAC authorization
my-cluster
部分,然後執行修改後的命令來檢視目前的
aws-auth
ConfigMap
項目:
eksctl get
iamidentitymapping --cluster
。如果您的 IAM 主體 ARN 的項目不在
my-cluster
ConfigMap
中,則請在終端機中輸入
eksctl create iamidentitymapping --help
以了解如何建立一個。
如果您安裝並設定 AWS CLI,則可以設定您使用的 IAM 登入資料。如需詳細資訊,請參閱《AWS Command Line Interface 使用者指南》中的
設定 AWS CLI
。如果您透過擔任 IAM 角色來存取叢集上的 Kubernetes 物件,則也可以將
kubectl
設定為使用 IAM 角色。如需詳細資訊,請參閱
透過建立檔案 Connect 線kubectl至 EKS 叢集 kubeconfig
。
hostname doesn't match
您的系統 Python 版本必須為
2.7.9
或更新版本。否則,您會在 AWS CLI 撥打 Amazon EKS 時收到
hostname doesn't match
錯誤訊息。如需詳細資訊,請參閱
Python Requests Frequently Asked Questions
中的
What are "hostname doesn't match" errors
getsockopt: no route to
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 AMI 也可能導致此錯誤代碼隨
Not authorized for images
錯誤訊息同時出現。如需詳細資訊,請參閱
Not authorized for
images
。
AmiIdNotFound
我們找不到與您的啟動範本相關聯的 AMI ID。請確認 AMI 已存在且已與您的帳戶共用。
AutoScalingGroupNot找到
我們找不到與受管節點群組相關聯的 Auto Scaling 群組。您可以使用相同設定來重新建立 Auto Scaling 群組以復原。
ClusterUnreachable
Amazon EKS 或一或多個受管節點無法與您的 Kubernetes 叢集 API 伺服器通訊。如果發生網路中斷或 API 伺服器處理請求逾時,就會發生這種情況。
EC2 SecurityGroup NotFound
我們找不到叢集的叢集安全群組。您必須重新建立叢集。
EC2 SecurityGroup DeletionFailure
無法刪除受管節點群組的遠端存取安全群組。從安全群組移除任何相依項目。
EC2 LaunchTemplate NotFound
我們找不到受管節點群組的 Amazon EC2 啟動範本。您必須重新建立節點群組以復原。
EC2 LaunchTemplate VersionMismatch
受管節點群組的 Amazon EC2 啟動範本版本與 Amazon EKS 建立的版本不相符。您可以還原為 Amazon EKS 所建立的版本以復原。
IamInstanceProfileNot找到
我們找不到受管節點群組的 IAM 執行個體設定檔。您可以使用相同設定來重新建立執行個體描述檔以復原。
IamNodeRoleNot找到
我們找不到受管節點群組的 IAM 角色。您可以使用相同設定來重新建立 IAM 角色以復原。
AsgInstanceLaunchFailures
您的 Auto Scaling 群組嘗試啟動執行個體時失敗。
NodeCreation失敗
您啟動的執行個體無法向 Amazon EKS 叢集註冊。這項失敗的常見原因是
節點 IAM 角色
許可不足或節點缺少對外網際網路存取。您的節點必須符合下列任何一項要求:
在受管節點群組上執行操作時發生
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
重試節點群組操作,看看是否可以解決您的問題。
Not authorized for
images
導致
Not authorized for images
錯誤訊息的一個潛在原因是使用私有 Amazon EKS Windows AMI 啟動 Windows 受管節點群組。發布新的 Windows AMI 後, AWS 將超過 4 個月的 AMI 設為私有,這使得它們無法再訪問。如果您的受管節點群組使用私有 Windows AMI,請考慮
更新Windows受管節點群組
。雖然我們無法保證我們可以提供對已設為私密 AMI 的存取權,但您可以向 Sup AWS port 人員提交票證來要求存取權限。如需詳細資訊,請參閱
Amazon EC2 使用者指南
中的
修補程式、安全性更新和 AMI ID
。
節點處於
NotReady
狀態
如果您的節點進入
NotReady
狀態,這可能表示節點運作狀況不佳且無法排程新Pods節點。這可能是由於各種原因而發生的,例如節點缺乏足夠的資源來容納 CPU、記憶體或可用磁碟空間。
對於 Amazon EKS 最佳化的 Windows AMI,組態中預設不會針對預設指定的運算資源保留。
kubelet
若要協助避免資源問題,您可以透過提供
kube-reserved
和/或的組態值,為系統程序保留運算資源
system-reserved
。
kubelet
您可以使用啟動程序指
-KubeletExtraArgs
令碼中的命令列參數來執行此作業 如需詳細資訊,請參閱Kubernetes文件中的
為系統精靈保留計算資源
,以及本使用指南中的
Bootstrap 指令碼組態參數
。
CNI 日誌收集工具
Amazon VPC CNI plugin for Kubernetes 有自己的故障診斷指令碼,在
/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 角色的項目。
如果節點符合以下條件之一,則此 ConfigMap
項目為必需:
若要解決此問題,您可使用您的叢集名稱取代以下命令中的 my-cluster
部分,然後執行修改後的命令來檢視目前 ConfigMap
中的項目:eksctl get iamidentitymapping --cluster
my-cluster
。如果執行該命令時遇到錯誤訊息,則可能是因為叢集沒有 aws-auth
ConfigMap
。以下命令會將項目新增至 ConfigMap
。如果 ConfigMap
不存在,則該命令會建立它。將 111122223333
取代為 IAM 角色的 AWS 帳戶 識別碼,並以節點角色的名稱取代 MyAmazoneks NodeRole
。
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)。
您自我管理節點所在的叢集的平台版本為 IAM使用 EKS 存取項Kubernetes目授予使用者存取權 主題「先決條件」中列出的最低版本,但 aws-auth
ConfigMap
(請參閱上一項) 中沒有針對該節點之 IAM 角色的項目或不存在針對該角色的存取項目。若要解決此問題,您可使用您的叢集名稱取代以下命令中的 my-cluster
部分,然後執行修改後的命令來檢視目前的存取項目:aws eks list-access-entries --cluster-name
my-cluster
。以下命令會為相應節點的 IAM 角色新增一個存取項目。將 111122223333
取代為 IAM 角色的 AWS 帳戶 識別碼,並以節點角色的名稱取代 MyAmazoneks NodeRole
。如果節點為 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
如果您針對中國叢集Pod或DaemonSet
部署到中國叢集的服務帳戶使用 IAM 角色 AWS 區域,且尚未在規格中設定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
- name: AWS_DEFAULT_REGION
value: "region-code
"
VPC 許可 Webhook 憑證過期
如果用來簽署 VPC 許可 Webhook 的憑證過期,則新 Windows Pod 部署的狀態會保持在 ContainerCreating
。
若要解決此問題,如果資料平面支援舊版 Windows,請參閱 續約 VPC 許可 Webhook 憑證。如果叢集和平台版本晚於 Windows 支援先決條件列出的版本,則建議您移除資料平面上的舊版 Windows 支援,並為您的控制平面啟用它。如此,您不再需要管理 Webhook 憑證。如需詳細資訊,請參閱 在 EKS Windows 叢集上部署節點。
升級控制平面之前,節點群組必須符合 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 用戶端開發套件 版本必須與以下版本相同或為更新版本:
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
和更新版本
您可以識別叢集中所有使用過時字符的現有 Pods。如需詳細資訊,請參閱 Kubernetes 服務帳戶。
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
"
如果輸出中傳回的子網路 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 版本更新,該更新可能會因相同的原因而失敗。
Amazon EKS 無法更新叢集平台版本的其他原因
您在建立叢集時指定的每個子網路中,沒有至少六個 (雖然我們建議使用 16 個) 可用的 IP 地址。如果子網路中可用的 IP 地址不足,則需要釋出子網路中的 IP 地址,或是需要變更叢集使用的子網路,使用具有足夠 IP 地址的子網路。
您在建立叢集時啟用了密碼加密,且您指定的 AWS KMS 金鑰已被刪除。假如您希望 Amazon EKS 更新叢集,您必須建立新的叢集
含解析路徑的叢集健康狀態常見問題與錯誤
Amazon EKS 會偵測 Amazon EKS 叢集以及叢集基礎設施的問題,並將問題存放在叢集運作狀態中。藉助叢集運作狀態資訊,您可以更快速地偵測、診斷並解決叢集問題,這可讓您建立更安全且更安全的應用程式環境 up-to-date。此外,由於必要的基礎設施或叢集組態出現問題,您可能無法升級至較新版本的 Kubernetes,也可能無法讓 Amazon EKS 在降級的叢集上安裝安全更新。Amazon EKS 可能需要 3 小時才能偵測到問題或偵測某個問題是否已解決。
維護 Amazon EKS 叢集的運作狀態是 Amazon EKS 及其使用者共同的責任。使用者負責 IAM 角色和 Amazon VPC 子網路的必備基礎設施,以及其他必須事先提供的必要基礎設施。Amazon EKS 偵測此基礎設施和叢集的組態變更。
若要在 Amazon EKS 主控台中查看叢集的運作狀態,請在 Amazon EKS 叢集詳細資訊頁面的概觀索引標籤中,找到名為運作狀態問題的區段。相關資料也可以透過呼叫 EKS API 中的 DescribeCluster
動作來取得,例如從 AWS Command Line Interface中進行呼叫。
這個功能有什麼用?
您可以提高 Amazon EKS 叢集運作狀態的可見度、快速診斷並修復任何問題,而無需花費時間偵錯或開啟 AWS 支援案例。例如:您不小心刪除了 Amazon EKS 叢集的子網路,Amazon EKS 將無法建立跨帳戶網路界面和Kubernetes AWS CLI 命令 (例如 kubectl
exec 或日誌)。kubectl
這些操作將會失敗並顯示錯誤:"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) 的問題。
當偵測到新問題時我會收到通知嗎?
不會。您需要查看 Amazon EKS 主控台或呼叫 EKS DescribeCluster
API。
主控台是否會向我發出有關運作狀態問題的警告?
是。任何存在運作狀態問題的叢集都會在主控台頂部包含一則橫幅。
前兩欄是 API 回應值所需的內容。「Health」 ClusterIssue 對象的第三個字段是resourceIds,其返回取決于問題類型。
ResourceIds
叢集可復原?
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 service-linked-role。我們無法擔任與叢集關聯的角色,從而無法執行所需的 Amazon EKS 管理操作。請檢查相應角色是否存在並具有所需的信任政策。
叢集 IAM 角色
PERMISSION_ACCESS_DENIED
您的叢集並未使用 Amazon EKS service-linked-role。與叢集關聯的角色未授予 Amazon EKS 執行所需管理操作需要的足夠許可。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。
叢集 IAM 角色
ASSUME_ROLE_ACCESS_DENIED_USING_SLR
我們無法假設 Amazon EKS 叢集管理 service-linked-role。請檢查相應角色是否存在並具有所需的信任政策。
Amazon EKS service-linked-role
PERMISSION_ACCESS_DENIED_USING_SLR
Amazon EKS 叢集管理 service-linked-role 未授與足夠的許可讓 Amazon EKS 執行所需的管理操作。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。
Amazon EKS service-linked-role
OPT_IN_REQUIRED
您的帳戶沒有 Amazon EC2 服務訂閱。請在帳戶設定頁面中更新帳戶訂閱。
STS_REGIONAL_ENDPOINT_DISABLED
相應 STS 區域端點已停用。請啟用相應端點,以讓 Amazon EKS 能夠執行所需的叢集管理操作。
KMS_KEY_DISABLED
與叢集關聯的 AWS KMS 金鑰已停用。請重新啟用該金鑰以復原叢集。
KMS Key Arn
KMS_KEY_NOT_FOUND
我們找不到與您的叢集相關聯的 AWS KMS 金鑰。您必須刪除並重新建立叢集。
KMS Key ARN
KMS_GRANT_REVOKED
與叢集相關聯之 AWS KMS 金鑰的授權會遭到撤銷。您必須刪除並重新建立叢集。
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 運作狀態檢查 為基礎。以下清單描述了這些錯誤代碼。
Amazon EKS 或一或多個受管節點無法透過 Kubernetes 叢集 API 伺服器進行身分驗證或授權。如需有關解決常見原因的詳細資訊,請參閱
修正受管節點群組的 AccessDenied 錯誤的常見原因
。私有 Windows AMI 也可能導致此錯誤代碼隨
Not authorized for images
錯誤訊息同時出現。如需詳細資訊,請參閱
Not authorized for
images
。
我們找不到與您的啟動範本相關聯的 AMI ID。請確認 AMI 已存在且已與您的帳戶共用。
我們找不到與受管節點群組相關聯的 Auto Scaling 群組。您可以使用相同設定來重新建立 Auto Scaling 群組以復原。
Amazon EKS 或一或多個受管節點無法與您的 Kubernetes 叢集 API 伺服器通訊。如果發生網路中斷或 API 伺服器處理請求逾時,就會發生這種情況。
我們找不到叢集的叢集安全群組。您必須重新建立叢集。
無法刪除受管節點群組的遠端存取安全群組。從安全群組移除任何相依項目。
我們找不到受管節點群組的 Amazon EC2 啟動範本。您必須重新建立節點群組以復原。
受管節點群組的 Amazon EC2 啟動範本版本與 Amazon EKS 建立的版本不相符。您可以還原為 Amazon EKS 所建立的版本以復原。
我們找不到受管節點群組的 IAM 執行個體設定檔。您可以使用相同設定來重新建立執行個體描述檔以復原。
我們找不到受管節點群組的 IAM 角色。您可以使用相同設定來重新建立 IAM 角色以復原。
您的 Auto Scaling 群組嘗試啟動執行個體時失敗。
您啟動的執行個體無法向 Amazon EKS 叢集註冊。這項失敗的常見原因是 節點 IAM 角色 許可不足或節點缺少對外網際網路存取。您的節點必須符合下列任何一項要求:
在受管節點群組上執行操作時發生
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
重試節點群組操作,看看是否可以解決您的問題。
Not authorized for
images
導致
Not authorized for images
錯誤訊息的一個潛在原因是使用私有 Amazon EKS Windows AMI 啟動 Windows 受管節點群組。發布新的 Windows AMI 後, AWS 將超過 4 個月的 AMI 設為私有,這使得它們無法再訪問。如果您的受管節點群組使用私有 Windows AMI,請考慮
更新Windows受管節點群組
。雖然我們無法保證我們可以提供對已設為私密 AMI 的存取權,但您可以向 Sup AWS port 人員提交票證來要求存取權限。如需詳細資訊,請參閱
Amazon EC2 使用者指南
中的
修補程式、安全性更新和 AMI ID
。
節點處於
NotReady
狀態
如果您的節點進入
NotReady
狀態,這可能表示節點運作狀況不佳且無法排程新Pods節點。這可能是由於各種原因而發生的,例如節點缺乏足夠的資源來容納 CPU、記憶體或可用磁碟空間。
對於 Amazon EKS 最佳化的 Windows AMI,組態中預設不會針對預設指定的運算資源保留。
若要協助避免資源問題,您可以透過提供
kubelet
kube-reserved
system-reserved
您可以使用啟動程序指
kubelet
-KubeletExtraArgs
令碼中的命令列參數來執行此作業 如需詳細資訊,請參閱Kubernetes文件中的
為系統精靈保留計算資源
CNI 日誌收集工具
Amazon VPC CNI plugin for Kubernetes 有自己的故障診斷指令碼,在
/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 角色的項目。如果節點符合以下條件之一,則此
ConfigMap
項目為必需:若要解決此問題,您可使用您的叢集名稱取代以下命令中的
my-cluster
部分,然後執行修改後的命令來檢視目前ConfigMap
中的項目:eksctl get iamidentitymapping --cluster
。如果執行該命令時遇到錯誤訊息,則可能是因為叢集沒有my-cluster
aws-auth
ConfigMap
。以下命令會將項目新增至ConfigMap
。如果ConfigMap
不存在,則該命令會建立它。將111122223333
取代為 IAM 角色的 AWS 帳戶 識別碼,並以節點角色的名稱取代MyAmazoneks NodeRole
。
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)。您自我管理節點所在的叢集的平台版本為 IAM使用 EKS 存取項Kubernetes目授予使用者存取權 主題「先決條件」中列出的最低版本,但
aws-auth
ConfigMap
(請參閱上一項) 中沒有針對該節點之 IAM 角色的項目或不存在針對該角色的存取項目。若要解決此問題,您可使用您的叢集名稱取代以下命令中的my-cluster
部分,然後執行修改後的命令來檢視目前的存取項目:aws eks list-access-entries --cluster-name
。以下命令會為相應節點的 IAM 角色新增一個存取項目。將my-cluster
111122223333
取代為 IAM 角色的 AWS 帳戶 識別碼,並以節點角色的名稱取代MyAmazoneks NodeRole
。如果節點為 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
--typeEC2_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
如果您針對中國叢集Pod或
DaemonSet
部署到中國叢集的服務帳戶使用 IAM 角色 AWS 區域,且尚未在規格中設定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 - name: AWS_DEFAULT_REGION value: "
region-code
"VPC 許可 Webhook 憑證過期
如果用來簽署 VPC 許可 Webhook 的憑證過期,則新 Windows Pod 部署的狀態會保持在
ContainerCreating
。若要解決此問題,如果資料平面支援舊版 Windows,請參閱 續約 VPC 許可 Webhook 憑證。如果叢集和平台版本晚於 Windows 支援先決條件列出的版本,則建議您移除資料平面上的舊版 Windows 支援,並為您的控制平面啟用它。如此,您不再需要管理 Webhook 憑證。如需詳細資訊,請參閱 在 EKS Windows 叢集上部署節點。
升級控制平面之前,節點群組必須符合 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 用戶端開發套件
版本必須與以下版本相同或為更新版本:
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
和更新版本
您可以識別叢集中所有使用過時字符的現有 Pods。如需詳細資訊,請參閱 Kubernetes 服務帳戶。
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
"如果輸出中傳回的子網路 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 版本更新,該更新可能會因相同的原因而失敗。
Amazon EKS 無法更新叢集平台版本的其他原因
您在建立叢集時指定的每個子網路中,沒有至少六個 (雖然我們建議使用 16 個) 可用的 IP 地址。如果子網路中可用的 IP 地址不足,則需要釋出子網路中的 IP 地址,或是需要變更叢集使用的子網路,使用具有足夠 IP 地址的子網路。
您在建立叢集時啟用了密碼加密,且您指定的 AWS KMS 金鑰已被刪除。假如您希望 Amazon EKS 更新叢集,您必須建立新的叢集
含解析路徑的叢集健康狀態常見問題與錯誤
Amazon EKS 會偵測 Amazon EKS 叢集以及叢集基礎設施的問題,並將問題存放在叢集運作狀態中。藉助叢集運作狀態資訊,您可以更快速地偵測、診斷並解決叢集問題,這可讓您建立更安全且更安全的應用程式環境 up-to-date。此外,由於必要的基礎設施或叢集組態出現問題,您可能無法升級至較新版本的 Kubernetes,也可能無法讓 Amazon EKS 在降級的叢集上安裝安全更新。Amazon EKS 可能需要 3 小時才能偵測到問題或偵測某個問題是否已解決。
維護 Amazon EKS 叢集的運作狀態是 Amazon EKS 及其使用者共同的責任。使用者負責 IAM 角色和 Amazon VPC 子網路的必備基礎設施,以及其他必須事先提供的必要基礎設施。Amazon EKS 偵測此基礎設施和叢集的組態變更。
若要在 Amazon EKS 主控台中查看叢集的運作狀態,請在 Amazon EKS 叢集詳細資訊頁面的概觀索引標籤中,找到名為運作狀態問題的區段。相關資料也可以透過呼叫 EKS API 中的
DescribeCluster
動作來取得,例如從 AWS Command Line Interface中進行呼叫。這個功能有什麼用? 您可以提高 Amazon EKS 叢集運作狀態的可見度、快速診斷並修復任何問題,而無需花費時間偵錯或開啟 AWS 支援案例。例如:您不小心刪除了 Amazon EKS 叢集的子網路,Amazon EKS 將無法建立跨帳戶網路界面和Kubernetes AWS CLI 命令 (例如
kubectl
exec 或日誌)。kubectl
這些操作將會失敗並顯示錯誤:"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) 的問題。
當偵測到新問題時我會收到通知嗎? 不會。您需要查看 Amazon EKS 主控台或呼叫 EKS
DescribeCluster
API。主控台是否會向我發出有關運作狀態問題的警告? 是。任何存在運作狀態問題的叢集都會在主控台頂部包含一則橫幅。
前兩欄是 API 回應值所需的內容。「Health」 ClusterIssue 對象的第三個字段是resourceIds,其返回取決于問題類型。
ResourceIds 叢集可復原? 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 service-linked-role。我們無法擔任與叢集關聯的角色,從而無法執行所需的 Amazon EKS 管理操作。請檢查相應角色是否存在並具有所需的信任政策。 叢集 IAM 角色PERMISSION_ACCESS_DENIED
您的叢集並未使用 Amazon EKS service-linked-role。與叢集關聯的角色未授予 Amazon EKS 執行所需管理操作需要的足夠許可。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。 叢集 IAM 角色ASSUME_ROLE_ACCESS_DENIED_USING_SLR
我們無法假設 Amazon EKS 叢集管理 service-linked-role。請檢查相應角色是否存在並具有所需的信任政策。 Amazon EKS service-linked-rolePERMISSION_ACCESS_DENIED_USING_SLR
Amazon EKS 叢集管理 service-linked-role 未授與足夠的許可讓 Amazon EKS 執行所需的管理操作。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。
Amazon EKS service-linked-role
OPT_IN_REQUIRED
您的帳戶沒有 Amazon EC2 服務訂閱。請在帳戶設定頁面中更新帳戶訂閱。
STS_REGIONAL_ENDPOINT_DISABLED
相應 STS 區域端點已停用。請啟用相應端點,以讓 Amazon EKS 能夠執行所需的叢集管理操作。
KMS_KEY_DISABLED
與叢集關聯的 AWS KMS 金鑰已停用。請重新啟用該金鑰以復原叢集。
KMS Key Arn
KMS_KEY_NOT_FOUND
我們找不到與您的叢集相關聯的 AWS KMS 金鑰。您必須刪除並重新建立叢集。
KMS Key ARN
KMS_GRANT_REVOKED
與叢集相關聯之 AWS KMS 金鑰的授權會遭到撤銷。您必須刪除並重新建立叢集。