問題描述
創(chuàng)建Azure Kubernetes Service服務(wù)后,需要升級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
?文章來源地址http://www.zghlxwxcb.cn/news/detail-473523.html
問題解答
查看錯誤消息,其中提到 “... blocked by pdb pdbforhelloworldone with unready pods ... ” ,所以需要檢查AKS集群中PDB(Pod Disruption Budget:Pod中斷預(yù)算 -- ?https://kubernetes.io/docs/tasks/run-application/configure-pdb/#create-the-pdb-object).?
?
第一步:查看AKS集群中的事件,檢查錯誤內(nèi)容
使用指令: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都需要處于活躍狀態(tài),不能中斷。
ALLOWED DISRUPTIONS為0,也表明POD可以中斷的數(shù)量為0,即全部的POD都不能中斷。
所以,升級失敗的根源就是PDB策略的阻擋,升級的時候POD需要中斷替換,而PDB策略不允許有POD中斷,所以無法完成升級。
?
解決方案:
方案一:修改PDB設(shè)置,根據(jù)情況改變MIN AVAILABLE和ALLOWED DISRUPITIONS的值。
方案二:(當不能修改PDB設(shè)置時),可以先把PDB保存到本地,然后刪除它,在執(zhí)行升級,當升級完成后,恢復(fù)PDB設(shè)置即可。
第一種方式很簡單,修改POD YAML中的配置即可。而本文中主要使用的是第二種方式:
?
1)保存PDB配置到本地(如pdb.yaml)
使用命令:kubectl get pdb <the block pdb name> -o yaml --namespace <the pdb namespace>?
然后把輸出的內(nèi)容復(fù)制到文件 pdb.yaml 中
?
2)刪除阻擋升級操作的PDB設(shè)置
使用命令刪除pdb:kubectl delete pdb <your pdb name> --namespace <right namespace>
?
?
3)執(zhí)行升級操作
因為在門戶上,先前的升級操作報錯,鎖定了頁面上的升級操作(即無法繼續(xù)在頁面中執(zhí)行升級), 并且ASK 控制層面(Control panel)的版本升級已經(jīng)完成,只是Node的升級是失敗的。所以可以通過az aks nodepool upgrade 指令,執(zhí)行對NodePool的升級。
az aks nodepool upgrade -g <group name> --cluster-name <name> --name <node name> --kubernetes-version 1.25.5 --no-wait
?
升級過程中,節(jié)點由2個 變?yōu)?3個,然后節(jié)點的kubernetes Version也在改變中
?
升級完成后, 節(jié)點數(shù)恢復(fù)為2,kubernetes Version都變?yōu)樾碌?1.25.5?
完成此步后,整個AKS集群的升級表示完成,下一步就是根據(jù)第一步保存的pdb.yaml,重新創(chuàng)建PDB
4)恢復(fù)原有的PDB設(shè)置
使用指令
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/#create-the-pdb-object
排查“PodDrainFailure”錯誤代碼 :??https://learn.microsoft.com/zh-cn/troubleshoot/azure/azure-kubernetes/error-code-poddrainfailure文章來源:http://www.zghlxwxcb.cn/news/detail-473523.html
?
到了這里,關(guān)于【Azure K8S】AKS升級 Kubernetes version 失敗問題的分析與解決的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!