建立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/).
使用指令:kubectl get event , 得到錯誤資訊 :Eviction blocked by too many Requests ( usually a 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中的設定即可。而本文中主要使用的是第二種方式:
使用命令:kubectl get pdb <the block pdb name> -o yaml --namespace <the pdb namespace>
然後把輸出的內容複製到檔案 pdb.yaml 中
使用命令刪除pdb:kubectl delete pdb <your pdb name> --namespace <right namespace>
因為在門戶上,先前的升級操作報錯,鎖定了頁面上的升級操作(即無法繼續在頁面中執行升級), 並且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
使用指令
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
當在複雜的環境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 雲中,恰是如此!