如何對 Amazon EKS 節點群組更新失敗的常見問題進行疑難排解?

2 分的閱讀內容
0

我想要使用最新的 Amazon Machine Image (AMI) 版本更新 Amazon Elastic Kubernetes Service (Amazon EKS) 節點群組。

簡短說明

當您啟動受管節點群組更新時,Amazon EKS 會自動更新您的節點。如果您使用 Amazon EKS 最佳化的 AMI,Amazon EKS 會自動將最新的安全修補程式和作業系統更新套用到您的節點。

在此更新程序期間,您可能會看到下列任何錯誤。針對您遇到的錯誤,請依照相關的疑難排解步驟執行。如需更新錯誤的詳細資訊,請參閱受管理的節點更新行為

解決方法

更新因 PodEvictionFailure 失敗

下列錯誤表示 PodEvictionFailure 正在封鎖升級:

「錯誤訊息: 嘗試從節點群組中的節點移出 Pod 時,已達到重試次數上限。」

如果 Pod 未在 15 分鐘內離開節點,且沒有強制旗標,則升級階段會失敗並顯示 PodEvictionFailure 錯誤。

由於以下任何原因,可能會發生 PodEvictionFailure 錯誤:

進取性 PDB(Pod 中斷預算)

當有多個 PDB 指向同一個 Pod 時,Pod 會定義為進取性 PDB

PDB 表示某類 Pod 在指定時間可以容忍的中斷次數 (或「故障預算」)。當自願中斷導致服務的 Pod 降至低於預算時,作業會暫停,直到能夠維持預算為止。節點排出事件會暫時停止,直到有更多 Pod 可用為止。這可確保您不會透過移出 Pod 來超出預算。如需詳細資訊,請參閱 Kubernetes 網站上的中斷

若要確認順利的受管節點群組更新,請暫時移除 Pod 中斷預算,或使用強制選項進行更新。此選項不會遵守 Pod 中斷預算。而是會強制節點重新啟動,因此實施更新。

**注意:**如果應用程式是基於 Quorum 的應用程式,則強制選項可能會導致應用程式暫時無法使用。

若要確認您已在叢集中設定 PDB,請執行下列命令:

$ kubectl get pdb --all-namespaces

或者,如果您在 Amazon EKS 主控台中開啟稽核日誌記錄功能,請執行下列步驟:

  1. 叢集標籤下,從清單中選擇所需的叢集 (例如 rpam-eks-qa2-control-plane)。

  2. 日誌記錄標籤下,選擇稽核。此動作會將您重新導向至 Amazon CloudWatch 主控台。

  3. 在 CloudWatch 主控台中,選擇日誌。然後,選擇日誌見解並執行以下查詢:

    fields @timestamp, @message| filter @logStream like "kube-apiserver-audit"
    | filter ispresent(requestURI)
    | filter objectRef.subresource = "eviction"
    | display @logStream, requestURI, responseObject.message
    | stats count(*) as retry by requestURI, responseObject.message
  4. 選擇自訂以識別更新的日期。如果因為進取性 PDB 而導致節點群組更新失敗,resposeObject.message 會說明 Pod 移出失敗的原因。

  5. 如果是 PDB 造成失敗,請修改 PDB。執行下列命令,然後再次升級節點群組:

    $ kubectl edit pdb pdb_name;

部署容忍所有污點

移出每個 Pod 之後,節點會變為空白,因為節點在先前的步驟中遭到污染。但是,如果部署容許每個污點,則節點更可能是非空的。這會導致 Pod 移出失敗。如需詳細資訊,請參閱 Kubernetes 網站上的污染和容忍

更新因無效的發行版本而失敗

如果您的發行版本無效,則可能會收到下列錯誤訊息:

「錯誤訊息: 要求的發行版本 1.xx 對於 Kubernetes 版本 1.xx 無效。」

若要解決此問題,請再次執行升級命令。此命令會將節點群組升級至與控制平面的 Kubernetes 版本相同的版本:

eksctl upgrade nodegroup --name=test --cluster=test --kubernetes-version=1.xx

**注意:**將 1.xx 版本取代為 Amazon EKS 控制平面支援的版本。

更新失敗,因為節點群組有健全狀況問題

如果節點群組有健全狀況問題,則失敗的更新會傳回下列錯誤:

「錯誤訊息: 節點群組有 [ AsgInstanceLaunchFailures、InstanceLimitExceeded、InsufficientFreeAddresses、ClusterUnreachable] 以外的健全狀況問題。」

這表示節點群組的 Auto Scaling 群組找不到其 Amazon Elastic Compute Cloud (Amazon EC2) 啟動範本的預期版本。如果您手動修改或刪除與節點群組相關聯的範本版本,就會發生這個錯誤。這會導致 EKS 將節點群組顯示為降級。

如果您未刪除啟動範本,請手動將 Auto Scaling 群組的啟動範本版本變更回適當的版本。此動作會將節點群組還原為狀況良好且使用中的狀態,您可以重新啟動更新程序。

更新失敗,因為新節點未加入節點群組

如果節點群組的新節點無法加入叢集,就會發生這個問題。因此,節點群組會復原至先前的版本。在此情況下,您可能會看到下列錯誤:

「NodeCreationFailure
由於新節點未加入節點組 ng-backend,因此無法繼續升級過程」

更新的節點無法加入叢集的原因有多種:

您已變更現有節點群組使用的安全群組規則

確認節點的安全群組的輸出規則是否允許連接到叢集安全群組的連接埠 443。

叢集的安全群組不允許來自節點安全群組的流量

確認叢集的安全群組的輸入規則是否允許來自節點安全群組的連接埠 443。如需詳細資訊,請參閱 Amazon EKS 安全群組需求和考量

您已使用自訂啟動範本建立節點群組

如果您要更新自訂啟動範本,則新版本的範本必須具有正確的使用者資料。此外,如果您使用自訂 AMI,請確定您已正確設定 AMI 以加入叢集。

若要對啟動範本問題進行疑難排解,請使用相同的啟動範本建立新節點群組。請確定範本使用最新版本的自訂 AMI。然後,查看節點是否成功加入叢集。如果節點未加入叢集,請使用 SSH 連線至節點執行個體,並檢查 kubelet 日誌。

缺少 IAM 權限

檢查節點群組的 AWS 身分和存取管理 (IAM) 角色是否具有必要的權限

ACL 拒絕流量

節點子網路的存取控制清單 (ACL) 可能會拒絕連接埠 443 的輸出流量或暫時連接埠的輸入流量。請確定允許節點的子網路使用這些規則。

同樣,叢集子網路的 ACL 可能會拒絕連接埠 443 的輸入流量。請確定允許叢集的子網路使用此流量。

新節點無法新增外掛程式

Amazon Virtual Private Cloud (Amazon VPC) CNI 外掛程式或 kube-proxy 附加元件可能無法出現在新節點上。如需詳細資訊,請參閱如何解決 Amazon EKS 的 Kubelet 或 CNI 外掛程式問題?

**子網路有連線問題 **

Amazon EKS 在其中建立節點的子網路可能沒有必要端點的連線。這些端點可能包括 Amazon Elastic Container Registry (Amazon ECR)、Amazon Simple Storage Service (Amazon S3) 或 Amazon EC2。連線可能無法連接網際網路或 VPC 端點。對於 VPC 端點,請檢查節點和端點的安全群組,以確保它們允許所需的流量。如果您使用 NAT 閘道或網際網路閘道,請確認子網路路由表格中的路由規則正確。此外,請確認對應的 NAT 閘道或網際網路閘道存在。

AWS 官方
AWS 官方已更新 9 個月前