【Azure K8S】AKS升級 Kubernetes version 失敗問題的分析與解決

2023-06-06 21:00:38

問題描述

建立Azure Kubernetes Service服務後,需要升級AKS叢集的 kubernetes version。在AKS頁面的 Cluster configuration 頁面中,選擇新的版本 1.25.5,確認升級。等待50分鐘左右,卻等到了升級失敗的訊息:

Failed to save Kubernetes service 'xxxx-aks3'. Error: Drain of aks-agentpool-xxxxxxxx-vmss00000j did not complete: Too many req pod aks-helloworld-one-9df87f7df-zxnbq on node aks-agentpool-xxxxxxxx-vmss00000j: ingress-basic/aks-helloworld-one-9df87f7df-zxnbq blocked by pdb pdbforhelloworldone with unready pods []. See  http://aka.ms/aks/debugdrainfailures

 

問題解答

檢視錯誤訊息,其中提到 「... blocked by pdb pdbforhelloworldone with unready pods ... 」 ,所以需要檢查AKS叢集中PDB(Pod Disruption Budget:Pod中斷預算 --  https://kubernetes.io/docs/tasks/run-application/configure-pdb/). 

 

第一步:檢視AKS叢集中的事件,檢查錯誤內容

使用指令:kubectl get event , 得到錯誤資訊 :Eviction blocked by too many Requests ( usually a pdb)

 

第二步:檢視AKS叢集中PDB的設定資訊

使用指令  kubectl get pdb -A , 檢視到其中一個設定為 MIN AVAILABLE : 100%, ALLOWED DISRUPTIONS: 0

MIN AVAILABLE 為 100%, 說明POD都需要處於活躍狀態,不能中斷。

ALLOWED DISRUPTIONS為0,也表明POD可以中斷的數量為0,即全部的POD都不能中斷。

所以,升級失敗的根源就是PDB策略的阻擋,升級的時候POD需要中斷替換,而PDB策略不允許有POD中斷,所以無法完成升級。

 

解決方案:

方案一:修改PDB設定,根據情況改變MIN AVAILABLE和ALLOWED DISRUPITIONS的值。

方案二:(當不能修改PDB設定時),可以先把PDB儲存到本地,然後刪除它,在執行升級,當升級完成後,恢復PDB設定即可。

第一種方式很簡單,修改POD YAML中的設定即可。而本文中主要使用的是第二種方式:

 

1)儲存PDB設定到本地(如pdb.yaml)

使用命令:kubectl get pdb <the block pdb name> -o yaml --namespace <the pdb namespace> 

然後把輸出的內容複製到檔案 pdb.yaml 中

 

2)刪除阻擋升級操作的PDB設定

使用命令刪除pdb:kubectl delete pdb <your pdb name> --namespace <right namespace>

 

 

3)執行升級操作

因為在門戶上,先前的升級操作報錯,鎖定了頁面上的升級操作(即無法繼續在頁面中執行升級), 並且ASK 控制層面(Control panel)的版本升級已經完成,只是Node的升級是失敗的。所以可以通過az aks nodepool upgrade 指令,執行對NodePool的升級。

az aks nodepool upgrade -g <group name> --cluster-name <name> --name <node name> --kubernetes-version 1.25.5 --no-wait

 

升級過程中,節點由2個 變為 3個,然後節點的kubernetes Version也在改變中

 

升級完成後, 節點數恢復為2,kubernetes Version都變為新的 1.25.5 

完成此步後,整個AKS叢集的升級表示完成,下一步就是根據第一步儲存的pdb.yaml,重新建立PDB

4)恢復原有的PDB設定

使用指令

kubectl apply -f pdb.yaml --namespace <the pdb namespace>

kubectl get pdb -A

 

 


參考資料

Specifying a Disruption Budget for your Application :  https://kubernetes.io/docs/tasks/run-application/configure-pdb/

排查「PodDrainFailure」錯誤程式碼 :  https://learn.microsoft.com/zh-cn/troubleshoot/azure/azure-kubernetes/error-code-poddrainfailure