背景
? 某環(huán)境硼一,kube-controller-manager反復重啟,嘗試重建kube-controller-manager的pod梦抢,但是過一會問題復現(xiàn)般贼。
如上圖,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導致的線上無法調(diào)度處理過程,通過kubectl get --raw /api/v1/namespaces/kube-system/endpoints/kube-controller-manager | jq .|grep resource
對比正常環(huán)境和此異常環(huán)境的resourceVersion霞赫,異常環(huán)境確實kube-controller-manager的endpoint腮介,resourceVersion一直維持不變。
3.通過kubectl delete endpint -n kube-system kube-controller-manager
,刪除此endpoint端衰, 發(fā)現(xiàn)kube-controller-manager啟動成功叠洗,同時此endpoint的resourceVersion開始更新,初始以為問題解決旅东,后發(fā)現(xiàn)kube-controller-manager反復重啟問題依舊灭抑,日志報錯仍和之前一樣。
<img src="https://360linux.oss-cn-hangzhou.aliyuncs.com/img/企業(yè)微信截圖_20200501225526.png" style="zoom: 50%;" />
4.分析kube-controller-manager啟動參數(shù)抵代,leader-elect設(shè)置為true腾节,此為高可用場景下多個kube-controller-manager實例競爭選舉哪個實例為leader角色的開關(guān),開啟時kube-controller-manger實例啟動時會連接kube-api競爭創(chuàng)建名為kube-controller-manager的endpoint荤牍,創(chuàng)建成功的kube-controller-manger實例為leader案腺,其他實例為backup,同時leader實例需要定期更新此endpoint康吵,維持leader地位劈榨。
5.分析kube-controller-manager日志,顯示更新此endpoint超時涎才,初始懷疑kube-api異常鞋既,檢查kube-api日志未發(fā)現(xiàn)異常力九,同時kubectl操作流暢,通過curl調(diào)用kube-api 6443端口也正常響應(yīng)邑闺,排除kube-api本身問題跌前。
6.綜上,排除kube-api問題后陡舅,懷疑kube-controller-manager實例連接kube-api的網(wǎng)絡(luò)異常抵乓,檢查/etc/kubernetes/controller-manager.conf發(fā)現(xiàn),發(fā)現(xiàn)問題所在靶衍,環(huán)境配置了kube-controller-manager通過公網(wǎng)IP去連接kube-api灾炭,環(huán)境為公有云環(huán)境,有內(nèi)外網(wǎng)IP颅眶,通過自動化部署工具創(chuàng)建集群時指定了公網(wǎng)IP蜈出,導致kube-controller-manager和kube-scheduler都是通過kube-api所在節(jié)點的公網(wǎng)IP去連接,導致連接不穩(wěn)定涛酗。修改相關(guān)地址為內(nèi)網(wǎng)IP后铡原,問題未復現(xiàn)。
總結(jié)
1.“failed to renew lease kube-system/kube-controller-manager: failed to tryAcquireOrRenew context deadline exceeded”問題商叹,一般從kube-api和網(wǎng)絡(luò)鏈接入手燕刻。
2.此環(huán)境為非高可用環(huán)境,修改leader-elect為false避免kube-controller-manager定期去連接kube-api更新endpoint剖笙,理論也可以避免renew超時退出問題卵洗。
3.如果特定場景,kube-controller等組件必須通過公網(wǎng)連接kube-api弥咪,如果有相關(guān)參數(shù)配置連接kube-api超時時間也是一種解決思路过蹂,筆者搜索kube-controller-manager啟動參數(shù),暫未發(fā)現(xiàn)與此有關(guān)參數(shù)酪夷,待代碼確認是否寫死了榴啸。