kube-controller-manager反復重啟解決


背景

​ 某環境,kube-controller-manager反復重啟,嘗試重建kube-controller-manager的pod,但是過一會問題復現。

如上圖,kube-controller-manager反復重啟了200多次了。

排查

1.通過kubectl logs -n kube-system kube-controller-manager-xxx查看kube-controller-manager日志,日志顯示“failed to renew lease kube-system/kube-controller-manager: failed to tryAcquireOrRenew context deadline exceeded”

2.參考一次kube-controller-manager的bug導致的線上無法調度處理過程,通過kubectl get --raw /api/v1/namespaces/kube-system/endpoints/kube-controller-manager | jq .|grep resource對比正常環境和此異常環境的resourceVersion,異常環境確實kube-controller-manager的endpoint,resourceVersion一直維持不變。

3.通過kubectl delete endpint -n kube-system kube-controller-manager ,刪除此endpoint, 發現kube-controller-manager啟動成功,同時此endpoint的resourceVersion開始更新,初始以為問題解決,后發現kube-controller-manager反復重啟問題依舊,日志報錯仍和之前一樣。

4.分析kube-controller-manager啟動參數,leader-elect設置為true,此為高可用場景下多個kube-controller-manager實例競爭選舉哪個實例為leader角色的開關,開啟時kube-controller-manger實例啟動時會連接kube-api競爭創建名為kube-controller-manager的endpoint,創建成功的kube-controller-manger實例為leader,其他實例為backup,同時leader實例需要定期更新此endpoint,維持leader地位。

5.分析kube-controller-manager日志,顯示更新此endpoint超時,初始懷疑kube-api異常,檢查kube-api日志未發現異常,同時kubectl操作流暢,通過curl調用kube-api 6443端口也正常響應,排除kube-api本身問題。

6.綜上,排除kube-api問題后,懷疑kube-controller-manager實例連接kube-api的網絡異常,檢查/etc/kubernetes/controller-manager.conf發現,發現問題所在,環境配置了kube-controller-manager通過公網IP去連接kube-api,環境為公有雲環境,有內外網IP,通過自動化部署工具創建集群時指定了公網IP,導致kube-controller-manager和kube-scheduler都是通過kube-api所在節點的公網IP去連接,導致連接不穩定。修改相關地址為內網IP后,問題未復現。

總結

1.“failed to renew lease kube-system/kube-controller-manager: failed to tryAcquireOrRenew context deadline exceeded”問題,一般從kube-api和網絡鏈接入手。

2.此環境為非高可用環境,修改leader-elect為false避免kube-controller-manager定期去連接kube-api更新endpoint,理論也可以避免renew超時退出問題。

3.如果特定場景,kube-controller等組件必須通過公網連接kube-api,如果有相關參數配置連接kube-api超時時間也是一種解決思路,筆者搜索kube-controller-manager啟動參數,暫未發現與此有關參數,待代碼確認是否寫死了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM