如何解決 Amazon EKS 叢集的升級失敗問題?

3 分的閱讀內容
0

我的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集更新失敗。如何解決此錯誤?

簡短描述

若要解決 Amazon EKS 叢集更新失敗問題,請嘗試以下操作:

  • 對於 IpNotAvailable 錯誤,請確認與叢集關聯的子網路是否有足夠的可用 IP 地址。
  • 對於 SubnetNotFound 錯誤,請確認子網路是否已存在並正確標記。
  • 對於 SecurityGroupNotFound 錯誤,請確認與叢集關聯的安全群組是否已存在。
  • 對於 EniLimitReached 錯誤,請增加 AWS 帳戶的彈性網絡介面配額。
  • 對於 AccessDenied 錯誤,請確認您具有正確的許可。
  • 對於 OperationNotPermitted 錯誤,請確認 Amazon EKS 服務角色具有正確的許可。
  • 對於 VpcIdNotFound 錯誤,請確認與叢集關聯的 VPC 是否已存在。
  • 確認您用於建立叢集的資源是否已刪除。
  • 對於使用 eksctl 建立的叢集,請確認 AWS CloudFormation 堆疊是否無法回復。
  • 對於 ResourceInUseException 錯誤,請等待一段時間,然後再重試更新。
  • 對於暫時性後端工作流程問題,請再次更新叢集。

解決方案

確認子網路是否擁有可用的 IP 地址 (IpNotAvailable)

若要更新 Amazon EKS 叢集,必須擁有每個子網路的五個可用 IP 地址。如果沒有足夠的可用 IP 地址,則可以刪除叢集子網路中未使用的網路介面。刪除網路介面可釋放 IP 地址。如需詳細資訊,請參閲網路介面基礎知識

若要查閱 Amazon EKS 叢集子網路中的可用 IP 地址,請執行以下操作:

1.    在您建立叢集的區域中開啟 Amazon EKS 主控台

2.    從側邊欄中選取 Clusters (叢集)。然後,選取您的 Amazon EKS 叢集

3.    選擇 Configuration (組態) 索引標籤。

4.    選擇 Networking (聯網) 索引標籤。

5.    在 Subnets (子網路) 下,選取一個 subnet (子網路),以開啟 Subnets (子網路) 頁面。

6.    選取一個 subnet (子網路),然後選擇 Details (詳細資訊) 索引標籤。

7.    找到 Available IPv4 addresses (可用的 IPv4 地址),查看子網路有多少可用的 IP 地址。

從 AWS Command Line Interface 中,執行以下命令:

1.    獲取與叢集關聯的子網路:

$ aws eks describe-cluster --name cluster-name --region your-region

**注意:**以您的叢集名稱取代 cluster-name,以您的 AWS 區域取代 your-region

輸出:

...
   "subnetIds": [
                "subnet-6782e71e",
                "subnet-e7e761ac"
            ],
   ...

2.    描述上述輸出的子網路:

aws ec2 describe-subnets --subnet-ids subet-id --region your-region

注意: 以您的子網路 ID 取代 subnet-id,以您的區域取代 your-region

輸出:

...
"AvailableIpAddressCount": 4089,
...

如果您沒有足夠的可用 IP 地址,則可以將 aws-node 常駐程式中的環境變數設定為 WARM_IP_TARGET。這會定義容器網路介面 (CNI) 必須為 Pod 保留多少次要 IP 地址:

$ kubectl set env ds aws-node -n kube-system WARM_IP_TARGET=number

**注意:**將您要從子網路中保留的 IP 地址數字取代 number

您也可以使用變數 MINIMUM_IP_TARGET 來控制每個節點的 IP 地址數量下限。

最佳實務是使用這些組態變數來控制維護的網路介面和 IP 地址的數量。

確認子網路是否已存在並正確標記 (SubnetNotFound)

若要確認子網路是否已存在,請執行以下命令:

aws ec2 describe-subnets --subnet-ids subet-id --region region

**注意:**以您的 子網路 ID 取代 subnet-id,以子網路所在的區域取代 region

如果子網路不存在,則會收到以下錯誤:

An error occurred (InvalidSubnetID.NotFound) when calling the DescribeSubnets operation: The subnet ID 'subnet-id' does not exist

若要確認子網路是否正確標記,請執行以下操作:

1.    使用 Check if you have enough available IP addresses (IpNotAvailable) (檢查您是否有足夠的可用 IP 地址 (IpNotAvailable)) 區段中的步驟,確認與叢集關聯的子網路。

2.    開啟 VPC 主控台

3.    從側邊欄中選取 Subnets (子網路)。

4.    選取應與叢集關聯的子網路,然後在 Details (詳細資訊) 窗格中選擇 Tags (標籤) 索引標籤。

5.    確認每個子網路都具有正確的標籤:

Key - kubernetes.io/cluster/cluster-name

**注意:**上述標籤僅新增至 Amazon EKS 叢集版本 1.18 或更早版本。對於使用 Kubernetes 1.19 版及更新版本建立的叢集,標籤並非強制性。以您的叢集名稱取代 cluster-name

標籤的值可以共享或擁有。

如果您有支援計劃,則請聯絡支援團隊以更新您的 Amazon EKS 子網路。

請確認與叢集關聯的安全群組是否已存在 (SecurityGroupNotFound)

若要確認與叢集關聯的安全群組,請執行以下操作:

1.    在您建立叢集的區域中開啟 Amazon EKS 主控台

2.    選取 Cluster (叢集)。

3.    選擇 Configuration (組態) 索引標籤。

4.    選擇 Networking (聯網) 索引標籤。

5.    選取 Cluster security group (叢集安全群組) 和 Additional security groups (其他安全群組) 下列出的安全群組。

如果安全群組已存在,則主控台將會開啟並顯示安全群組詳細資訊。

從 AWS CLI 中:

1.    獲取與叢集關聯的安全群組:

$ aws eks describe-cluster --name cluster-name --region your-region

**注意:**以您的叢集名稱取代 cluster-name,以您的區域取代 your-region

輸出:

...
"securityGroupIds": [
    "sg-xxxxxxxx"
]
...

2.    描述上述輸出的安全群組:

$ aws ec2 describe-security-groups --group-ids security-group-id --region your-region

**注意:**以您的安全群組 ID 取代 security-group-id,以您的區域取代 your-region

增加 AWS 帳戶的彈性網絡介面配額 (EniLimitReached)

如果達到網路介面配額,則可以移除未使用的網路介面,或請求提高限制

如果您的網路介面已連接至叢集,則刪除該叢集以移除網路介面。如果您的網路介面已連接至未使用的工作節點,則刪除自我管理節點群組的 Auto Scaling 群組。對於受管節點群組,請從 Amazon EKS 主控台刪除節點群組。若要將工作負載從一個節點群組移至另一個節點群組,請參閲遷移至新的節點群組

確認您是否具有正確的許可 (AccessDenied)

1.    開啟 IAM 主控台

2.    在導覽窗格上,選擇 Roles (角色) 或 Users (使用者)。

3.    選取 role (角色) 或 user (使用者)。

4.    確認 IAM 角色或使用者擁有正確的許可

確認服務角色是否具有正確的許可 (OperationNotPermitted)

1.    開啟 IAM 主控台

2.    在導覽窗格上,選擇 Roles (角色)。

3.    篩選 AWSServiceRoleForAmazonEKS 並選取角色。

4.    確認角色是否已連接 AmazonEKSServiceRolePolicy 政策。

如果未連接政策,請參閲新增 IAM 身分許可

確認與叢集關聯的 VPC 是否已存在 (VpcNotFound)

1.    在您建立叢集的區域中開啟 Amazon EKS 主控台

2.    選取叢集。

3.    選擇 Configuration (組態) 索引標籤。

4.    選擇 Networking (聯網) 索引標籤。

5.    選取 VPC ID 連結以查看 VPC 是否已存在。

如果 VPC 不存在,必須建立一個新的叢集。

確認與叢集關聯的資源是否已刪除

如果您在 Amazon EKS 主控台上建立了叢集,並且用於建立叢集的子網路已刪除,則叢集無法更新。您必須重新建立叢集,並將工作負載從舊叢集移至新叢集。如果您有支援計劃,則請聯絡支援團隊以更新您的 Amazon EKS 子網路。

確認 AWS CloudFormation 堆疊是否無法回復 (eksctl)

如果 CloudFormation 堆疊無法回復,則請參閲如果 CloudFormation 堆疊停留在 UPDATE_ROLLBACK_FAILED 狀態,如何對其更新?

請等待一段時間,然後再次啟動控制平面更新 (ResourceInUseException)

如果您在啟動更新時正在進行自動化 Amazon EKS 控制平面動作 (例如平台版本更新),則會發生此錯誤。Amazon EKS 會自動偵測並取代狀況不良的控制平面執行個體,而且提供自動化版本升級及這些執行個體的修補。請等待一段時間讓自動化動作完成,然後再次啟動控制平面更新。

**注意:**您的等待時間取決於自動更新的開始時間。如果您不確定自動化動作何時會解決,請等待一小時,然後再重試控制平面更新。

再次更新叢集

暫時性問題可能會導致後端工作流程不穩定。如果上述疑難排解步驟與您的問題無關,請嘗試再次更新叢集。


AWS 官方
AWS 官方已更新 1 年前