

 **協助改進此頁面** 

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 排解 Amazon EKS 叢集和節點問題
<a name="troubleshooting"></a>

此章節涵蓋一些您在使用 Amazon EKS 時可能遇到的常見錯誤，並提供解決方法。如果您需要針對特定 Amazon EKS 區域進行疑難排解，請參閱個別 [疑難排解 IAM](security-iam-troubleshoot.md)、[排解 Amazon EKS 連接器問題](troubleshooting-connector.md) 和[針對使用 EKS 附加元件的 ADOT 進行疑難排解](https://aws-otel.github.io/docs/getting-started/adot-eks-add-on/troubleshooting)主題。

如需其他疑難排解資訊，請參閱 * AWS re：Post* [上的 Amazon Elastic Kubernetes Service 知識中心內容](https://repost.aws/tags/knowledge-center/TA4IvCeWI1TE66q4jEj4Z9zg/amazon-elastic-kubernetes-service)。

## 容量不足
<a name="ice"></a>

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

有些可用區域是叢集無法駐留的。將子網路所在的可用區域與[子網路要求與考量](network-reqs.md#network-requirements-subnets)中的可用區域清單進行比較。

## 節點無法加入叢集
<a name="worker-node-fail"></a>

有幾個常見的原因會阻擋節點加入叢集：
+ 如果節點是受管節點，則 Amazon EKS 會在您建立節點群組時會將項目新增至 `aws-auth` `ConfigMap`。如果該項目被移除或修改，則您需要重新新增項目。如需詳細資訊，請在您的終端機中輸入 `eksctl create iamidentitymapping --help`。您可使用您的叢集名稱取代以下命令中的 *my-cluster* 部分，然後執行修改後的命令來檢視目前的 `aws-auth` `ConfigMap` 項目：`eksctl get iamidentitymapping --cluster my-cluster `。您指定之角色的 ARN 不能包含 `/` 以外的[路徑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names)。例如，如果您的角色名稱是 `development/apps/my-role`，則您需要在指定角色的 ARN 時將其變更為 `my-role`。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。

  如果節點是自我管理的，且您尚未為節點的 IAM 角色的 ARN 建立[存取項目](access-entries.md)，則執行所列出的針對受管節點的命令。如果您已為節點 IAM 角色 ARN 建立存取項目，則可能無法在存取項目中正確進行設定。請確認將節點 IAM 角色 ARN (而非執行個體設定檔 ARN) 指定為 `aws-auth` `ConfigMap` 項目或存取項目中的主體 ARN。如需存取項目的詳細資訊，請參閱 [使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。
+ node AWS CloudFormation 範本中的 **ClusterName** 與您希望節點加入的叢集名稱不完全相符。傳遞不正確的值到節點的 `/var/lib/kubelet/kubeconfig` 檔案之不正確的組態內的此欄位中，而節點不會加入叢集。
+ 節點未標記為叢集*所擁有*。您的節點必須套用下列標籤，其中 *my-cluster* 會以叢集的名稱取代。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/eks/latest/userguide/troubleshooting.html)
+ 節點可能無法使用公有 IP 地址存取叢集。確定已將公有子網路中部署的節點指派給公有 IP 地址。如果沒有，您可以在啟動節點後將彈性 IP 位址關聯至節點。如需詳細資訊，請參閱[將彈性 IP 地址與執行中的執行個體或網路介面建立關聯](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#using-instance-addressing-eips-associating)。如果公有子網路未設定為自動將公有 IP 地址指派給部署到該子網路的執行個體，則建議您啟用該設定。如需詳細資訊，請參閱[修改子網的公有 IPv4 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。如果節點部署到私有子網路，則子網路必須具有指派給它的公有 IP 地址的 NAT 閘道路由。
+ 您的帳戶未啟用您要部署節點之 AWS 區域的 AWS STS 端點。若要啟用區域，請參閱[在 區域中啟用和停用 AWS STS AWS](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-activate-deactivate)。
+ 節點沒有私有 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 選項集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html#AmazonDNS)。
+ 若受管節點群組中的節點在 15 分鐘內沒有連線至叢集，則會發出 "NodeCreationFailure" 運作狀態問題，且主控台狀態會設定為 `Create failed`。若是 AMI 啟動時間較慢，可使用[快速啟動](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/win-ami-config-fast-launch.html)來解決此問題。

若要識別和疑難排解導致 Worker 節點無法加入叢集的常見原因，您可以使用 `AWSSupport-TroubleshootEKSWorkerNode` Runbook。如需詳細資訊，請參閱 * AWS Systems Manager Automation Runbook 參考*` [AWSSupport-TroubleshootEKSWorkerNode](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-troubleshooteksworkernode.html) `中的 。

## 未經授權或存取遭拒 (`kubectl`)
<a name="unauthorized"></a>

如果您在執行 `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 叢集](create-kubeconfig.md)。
+ 如果叢集符合[透過 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權](access-entries.md)的「先決條件」部分的最低平台要求，則 IAM 主體不存在存取項目。如果存在，則沒有為其定義的必要的 Kubernetes 群組名稱，或沒有與其關聯的正確存取政策。如需詳細資訊，請參閱[使用 EKS 存取項目授予 IAM 使用者 Kubernetes 的存取權](access-entries.md)。
+ 如果叢集符合[透過 EKS 存取項目授予 IAM 使用者對 Kubernetes 的存取權](access-entries.md)中的最低平台要求，則 IAM 主體的項目在 `aws-auth` `ConfigMap` 中不存在。如果存在，則不會映射到繫結到具有必要許可的 Kubernetes `Role` 或 `ClusterRole` 的 Kubernetes 群組名稱。若要了解 Kubernetes 角色型授權 (RBAC) 物件的相關詳細資訊，請參閱 Kubernetes 文件中的[使用 RBAC 授權](https://kubernetes.io/docs/reference/access-authn-authz/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](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。如果您透過擔任 IAM 角色來存取叢集上的 Kubernetes 物件，則也可以將 `kubectl` 設定為使用 IAM 角色。如需詳細資訊，請參閱[透過建立 kubeconfig 檔案將 kubectl 連線至 EKS 叢集](create-kubeconfig.md)。

## `hostname doesn’t match`
<a name="python-version"></a>

您的系統 Python 版本必須為 `2.7.9` 或更新版本。否則，您會收到 CLI AWS 呼叫 Amazon EKS 的`hostname doesn’t match`錯誤。如需詳細資訊，請參閱 *Python 請求常見問答集*中的 [什麼是「主機名稱不相符」錯誤？](https://requests.readthedocs.io/en/latest/community/faq.html#what-are-hostname-doesn-t-match-errors)。

## `getsockopt: no route to host`
<a name="troubleshoot-docker-cidr"></a>

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`
<a name="instances-failed-to-join"></a>

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

## 受管節點群組錯誤代碼
<a name="troubleshoot-managed-node-groups"></a>

如果受管節點群組遇到硬體運作狀態問題，Amazon EKS 會傳回錯誤代碼，以協助您診斷問題。這些運作狀態檢查不會偵測軟體問題，因為檢查是以 [Amazon EC2 運作狀態檢查](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)為基礎。以下清單描述了這些錯誤代碼。

 **AccessDenied**   
Amazon EKS 或一或多個受管節點無法透過 Kubernetes 叢集 API 伺服器進行身分驗證或授權。如需有關解決常見原因的詳細資訊，請參閱 [修正受管節點群組的 `AccessDenied` 錯誤的常見原因](#access-denied-managed-node-groups)。私有 Windows AMI 也可能導致此錯誤代碼隨 `Not authorized for images` 錯誤訊息同時出現。如需詳細資訊，請參閱[`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 角色](create-node-role.md)許可不足或節點缺少對外網際網路存取。您的節點必須符合下列任何一項要求：  
+ 能夠使用公有 IP 地址存取網際網路。與節點所在的子網路相關聯的安全群組必須允許通訊。如需詳細資訊，請參閱[子網需求和注意事項](network-reqs.md#network-requirements-subnets)及[檢視叢集的 Amazon EKS 安全群組要求](sec-group-reqs.md)。
+ 您的節點與 VPC 必須滿足[部署網際網路存取受到限制的私有叢集](private-clusters.md)中的要求。

 **InstanceLimitExceeded**   
 AWS 您的帳戶無法啟動任何其他指定執行個體類型的執行個體。您可以請求提升 Amazon EC2 執行個體限制來復原。

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

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

### 修正受管節點群組的 `AccessDenied` 錯誤的常見原因
<a name="access-denied-managed-node-groups"></a>

在受管節點群組上執行操作時發生 `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`
<a name="not-authorized-for-images"></a>

導致 `Not authorized for images` 錯誤訊息的一個潛在原因是使用私有 Amazon EKS Windows AMI 啟動 Windows 受管節點群組。發佈新的 Windows AMIs 後， AWS 會將超過 4 個月的 AMIs 設為私有，使其不再可存取。如果您的受管節點群組使用私有 Windows AMI，請考慮[更新 Windows 受管節點群組](update-managed-node-group.md)。雖然我們無法保證我們可以提供已設為私有AMIs 存取權，但您可以透過向 AWS Support 提交票證來請求存取權。如需詳細資訊，請參閱*Amazon EC2 使用者指南*中的[修補程式](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/aws-windows-ami.html#ami-patches-security-ID)。

## 節點進入 `NotReady` 狀態
<a name="not-ready"></a>

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

若是 Amazon EKS 最佳化 Windows AMI，依預設，`kubelet` 組態中不會保留運算資源。為協助避免資源問題，可向 `kubelet` 提供 [kube-reserved](https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#kube-reserved) 及/或 [system-reserved](https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/#system-reserved) 的組態值，藉此來為系統程序預留運算資源。您可使用引導指令碼中的 `-KubeletExtraArgs` 命令列參數來執行此動作。如需詳細資訊，請參閱《Kubernetes 文件》中的[為系統常駐程式預留運算資源](https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/)，以及本《使用者指南》中的 [引導指令碼組態參數](eks-optimized-windows-ami.md#bootstrap-script-configuration-parameters)。

## EKS 日誌收集器
<a name="log-collector"></a>

如需排解 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 日誌](https://github.com/bottlerocket-os/bottlerocket?tab=readme-ov-file#logs)獲取更多詳細資訊。

## 容器執行階段網路尚未就緒
<a name="troubleshoot-container-runtime-network"></a>

您可能會收到類似下列的 `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` 不存在，則該命令會建立它。將 *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 不能包含 `/` 以外的[路徑](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names)。例如，如果您的角色名稱是 `development/apps/my-role`，則您需要在指定角色的 ARN 時將其變更為 `my-role`。請確認您指定的是節點 IAM 角色 ARN (而非執行個體設定檔 ARN)。

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

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

## TLS 交握逾時
<a name="troubleshoot-tls-handshake-timeout"></a>

當節點無法建立與公有 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
<a name="default-region-env-variable"></a>

如果您針對部署至中國 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 版本
<a name="troubleshoot-node-grups-must-match-kubernetes-version"></a>

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

## 啟動許多節點時，會出現 `Too Many Requests` 錯誤
<a name="too-many-requests"></a>

如果同時啟動許多節點，您可能會 [Amazon EC2 使用者資料](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html#user-data-shell-scripts)執行日誌看見錯誤訊息，其顯示 `Too Many Requests`。這可能是因為控制平面因 `describeCluster` 呼叫超載。超載會導致調節、節點無法執行引導指令碼，以及節點無法完全加入叢集。

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

## 針對 Kubernetes API 伺服器請求回應的 HTTP 401 未經授權的錯誤
<a name="troubleshooting-boundservicetoken"></a>

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

您的 Amazon EKS 叢集的 Kubernetes API 伺服器拒絕使用超過 90 天的字符的請求。在 Kubernetes 舊版本中，字符沒有過期。這意味著倚賴這些字符的客户端必須在一小時內進行重新整理。為了防止 Kubernetes API 伺服器因無效字符而拒絕您的請求，您的工作負載使用的 [Kubernetes 用戶端 SDK](https://kubernetes.io/docs/reference/using-api/client-libraries/) 版本必須與以下版本相同或為更新版本：
+ Go 版本 `0.15.7` 和更新版本
+ Python 版本 `12.0.0` 和更新版本
+ Java 版本 `9.0.0` 和更新版本
+ JavaScript 版本 `0.10.3` 和更新版本
+ Ruby `master` 分支
+ Haskell 版本 `0.3.0.0` 
+ C\$1 `7.0.5` 版及更新版本

您可以識別叢集中所有使用過時字符的現有 Pod。如需詳細資訊，請參閱[服務帳戶字符](service-accounts.md#service-account-tokens)。

## Amazon EKS 平台版本比目前平台版本落後兩個版本以上
<a name="troubleshooting-platform-version"></a>

當 Amazon EKS 無法自動更新叢集的 [platform-version](https://docs.aws.amazon.com/eks/latest/userguide/platform-versions.html) 時，可能會發生這種情況。儘管造成這種情況的原因很多，然而一些常見的原因如下。如果這些問題中有任何一個適用於您的叢集，其可能仍然可以運作，但 Amazon EKS 不會更新其平台版本。

**問題**  
該[叢集 IAM 角色](cluster-iam-role.md)已刪除，此角色是在建立叢集時指定。您可以使用以下命令，查看指定了哪個角色。使用您叢集的名稱取代 *my-cluster*。

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

範例輸出如下。

```
eksClusterRole
```

**解決方案**  
建立具有相同名稱的新[叢集 IAM 角色](cluster-iam-role.md)。

**問題**  
已刪除叢集建立期間指定的子網路 – 即叢集建立期間指定要與叢集搭配使用的子網路。您可以使用以下命令，查看指定了哪些子網路。使用您叢集的名稱取代 *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 位址的子網路。
+ 您在建立叢集時啟用[秘密加密](enable-kms.md)，且您指定的 AWS KMS 金鑰已刪除。假如您希望 Amazon EKS 更新叢集，您必須建立新的叢集

## 叢集運作狀態常見問答集與包含解析路徑的錯誤代碼
<a name="cluster-health-status"></a>

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` 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 物件的第三個欄位是 [Health ClusterIssue](https://docs.aws.amazon.com/eks/latest/APIReference/API_ClusterIssue.html) 物件，其傳回的值取決於問題類型。


| 代碼 | 訊息 | ResourceIds | 叢集可復原？ | 
| --- | --- | --- | --- | 
|  SUBNET\$1NOT\$1FOUND  |  我們找不到目前與叢集關聯的一個或多個子網路。請呼叫 Amazon EKS update-cluster-config API 以更新子網路。  |  子網路 ID  |  是  | 
|  SECURITY\$1GROUP\$1NOT\$1FOUND  |  我們找不到目前與叢集關聯的一個或多個安全群組。請呼叫 Amazon EKS update-cluster-config API 以更新安全群組。  |  安全群組 ID  |  是  | 
|  IP\$1NOT\$1AVAILABLE  |  與叢集關聯的一個或多個子網路沒有足夠的可用 IP 地址供 Amazon EKS 執行叢集管理操作。請使用 Amazon EKS update-cluster-config API 釋放子網路中的地址或將其他子網路關聯到叢集。  |  子網路 ID  |  是  | 
|  VPC\$1NOT\$1FOUND  |  我們找不到與叢集關聯的 VPC。您必須刪除並重新建立叢集。  |  VPC ID  |  否  | 
|  ASSUME\$1ROLE\$1ACCESS\$1DENIED  |  叢集未使用 Amazon EKS 服務連結角色。我們無法擔任與叢集關聯的角色，從而無法執行所需的 Amazon EKS 管理操作。請檢查相應角色是否存在並具有所需的信任政策。  |  叢集 IAM 角色  |  是  | 
|  PERMISSION\$1ACCESS\$1DENIED  |  叢集未使用 Amazon EKS 服務連結角色。與叢集關聯的角色未授予 Amazon EKS 執行所需管理操作需要的足夠許可。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。  |  叢集 IAM 角色  |  是  | 
|  ASSUME\$1ROLE\$1ACCESS\$1DENIED\$1USING\$1SLR  |  我們無法擔任 Amazon EKS 叢集管理服務連結角色。請檢查相應角色是否存在並具有所需的信任政策。  |  Amazon EKS 服務連結角色  |  是  | 
|  PERMISSION\$1ACCESS\$1DENIED\$1USING\$1SLR  |  Amazon EKS 叢集管理服務連結角色未授予 Amazon EKS 執行所需管理操作需要的足夠許可。請檢查連接到叢集角色的政策以及是否套用了任何單獨的拒絕政策。  |  Amazon EKS 服務連結角色  |  是  | 
|  OPT\$1IN\$1REQUIRED  |  您的帳戶沒有 Amazon EC2 服務訂閱。請在帳戶設定頁面中更新帳戶訂閱。  |  N/A  |  是  | 
|  STS\$1REGIONAL\$1ENDPOINT\$1DISABLED  |  相應 STS 區域端點已停用。請啟用相應端點，以讓 Amazon EKS 能夠執行所需的叢集管理操作。  |  N/A  |  是  | 
|  KMS\$1KEY\$1DISABLED  |  與叢集相關聯的 AWS KMS 金鑰已停用。請重新啟用該金鑰以復原叢集。  |  KMS 金鑰 ARN  |  是  | 
|  KMS\$1KEY\$1NOT\$1FOUND  |  我們找不到與您的叢集相關聯的 AWS KMS 金鑰。您必須刪除並重新建立叢集。  |  KMS 金鑰 ARN  |  否  | 
|  KMS\$1GRANT\$1REVOKED  |  與您的叢集相關聯的 AWS KMS 金鑰授權會遭到撤銷。您必須刪除並重新建立叢集。  |  KMS 金鑰 ARN  |  否  | 
|  ETCD\$1DB\$1SIZE\$1EXCEEDED  |  您的 Amazon EKS 叢集已超過刻印資料庫大小限制。 etcd 是在 Kubernetes 控制平面中執行和維護叢集組態和狀態的鍵值資料存放區。為了防止您的叢集進入降級狀態，請移除不必要的 Kubernetes 物件，以縮減已壓縮的資料庫大小。如需識別和清除造成資料庫大小之物件的指導方針，請參閱[管理 Amazon EKS 叢集上的壓縮資料庫大小](https://aws.amazon.com/blogs/containers/managing-etcd-database-size-on-amazon-eks-clusters/)。如果您在清除後持續遇到問題，請聯絡 AWS Support。  |  叢集 ARN  |  是  | 