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

2 分的閱讀內容
0

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

簡短描述

較新版本的 Amazon EKS 也包含適用於節點群組更新的新版 Amazon AMI。客戶若透過多個節點群組部署工作負載,在更新節點以跟上發行週期方面會面臨挑戰。

當您起始受管節點群組更新時,Amazon EKS 會自動為您更新節點。如果您使用的是 Amazon EKS 最佳化 AMI,則 Amazon EKS 會自動將最新的安全修補程式和作業系統更新套用至節點,做為最新 AMI 發行版本的一部分。為了實作更新,AWS Auto Scaling 會在節點群組中存在節點的每個可用區域啟動節點。此服務也會重新平衡可用區域。由於現有節點只會耗盡一次,因此啟動步驟會取得成功。縮減規模階段會將 Auto Scaling 群組的大小上限和所需大小遞減 1,以傳回更新前的值。如需詳細資訊,請參閱受管理節點更新行為中的「縮減規模階段」。

解決方案

在此更新程序期間,您可能會看到下列某些錯誤,需要其自己的緩解措施。事先了解這些問題,可以將停機時間降至最低。如需更新錯誤的詳細資訊,請參閱受管節點更新行為

PodEvictionFailure 導致更新失敗

Error message : Reached max retries while trying to evict pods from nodes in node group.

此錯誤表示升級已被 PodEvictionFailure 封鎖。如果 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.    在 Clusters (叢集) 索引標籤下,從清單中選擇所需的叢集 (例如,rpam-eks-qa2-control-plane)。

2.    在 Logging (記錄) 標籤下,選擇 Audit (稽核)。這會將您重新導向至 Amazon CloudWatch 主控台。

3.    在 CloudWatch 主控台中,選擇 Logs (日誌)。然後,選擇 Log Insights (日誌洞察),並執行下列查詢:

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.    從右上角選取 Custom (自訂),以識別更新日期。如果因為主動性 PDB 而導致節點群組更新失敗,resposeObject.message 會說明 Pod 移出失敗的原因。

5.    如果 PDB 導致失敗,請使用下列指令來修改 PDB。然後,再次升級節點群組:

$ kubectl edit pdb pdb_name;

部署容忍所有污點

移出每個 Pod 之後,節點會變為空白,因為節點在先前的步驟中已存在污點。但是,如果部署容許所有污點,則節點很可能為非空白,導致 Pod 移出失敗。如需詳細資訊,請參閱 Kubernetes 網站上的污點與容錯性

無效的發行版本導致更新失敗

Error Message: Requested release version 1.xx is not valid for kubernetes version 1.xx.

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

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

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

節點群組存在運作狀態問題導致更新失敗

Error message: Nodegroup has health issue other than [ AsgInstanceLaunchFailures, InstanceLimitExceeded, InsufficientFreeAddresses, ClusterUnreachable]

如果您手動修改節點群組的 Auto Scaling 群組,以使用其他版本的 Amazon Elastic Compute Cloud (Amazon EC2) 啟動範本,則會發生此失敗。或者,您可能已刪除與節點群組關聯的範本版本。EKS 節點群組使用與 Auto Scaling 群組的啟動範本相衝突的預設啟動範本。此啟動範本會使 EKS 將節點群組顯示為已降級。

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


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