k8s-mtu設置不當引發的線上故障

背景

在部署新的paas平臺線上環境時,突發consul和es中間件無法創建。

排查過程

以consul

通過查詢k8s集羣中pod狀態發現原來3pod的consul集羣,其中2個pod一直重啓。
# kubectl get pods -n paasconsul-propaas
通過describe查看pod信息,發現是liveness失敗。
# kubectl describe pods -n paasconsul-propaas
查看liveness調用的是health-check的二進制文件,經過分析源碼發現這個二進制文件的作用爲連接本地consul節點,查看當前節點狀態。現在查看集羣狀態錯誤。此時懷疑consul集羣配置出現問題

通過查看operator的log發現集羣並沒有報錯。並且打印有副本集配置完成的日誌出現在最後一行。但是後續一直沒有日誌打印,此時懷疑是operator沒有收到events事件。

爲了驗證events事件沒有獲取到,通過修改cr文件的cpu和內存參數,想要觸發新的更新event。結果不出意外,operator並沒有觸發更新操作,日誌並無新增,節點狀態並沒有改變

看到operator無任何響應,懷疑其已經卡死,爲了驗證此想法,又從paas平臺創建一個集羣,發現出現新日誌,後續又到副本集配置完成日誌打印,然後卡死。判斷operator狀態存活正常,只是對更新cr信息無響應。

問題分析

針對無法更新cr的狀態無法獲取events時間。開始分析

懷疑etcd寫入失敗,通過查看etcd日誌發現一切正常。(❎)

想起之前遇見的pod名字受DNS Label Names 63位長度限制,懷疑其cr是否也存在其問題。通過將原cr的yaml信息保留下來,改其名稱再運行。結果發現其正常運行。(✅)

問題處理

爲什麼名稱長度限制會導致operator卡死無響應?

這時候想到了tcp的mtu設置。虛擬機mtu和容器mtu不匹配將會導致網絡不通。

因爲當前k8s集羣採用的是IP-IN-IP協議,此協議可以解決掉k8s生產擴容時,不會引起新老主機不通問題。

# 查看物理節點mtu:
netstat -i
# 發現其物理節點mtu值爲1450

# 查看calico配置的mtu參數
kubectl get configmap/cali-config -n kube-system | grep "veth_mtu"
# 發現其mtu值也爲1450
此時問題原因找到,calico啓用tunnel模式,因此經過tunnel會封裝一個新的20字節的ip包頭,所以當發送大量數據時,calico生成的1450大小的數據包再加上20大小的ip包頭爲1470字節的包。
本地網卡轉發calico通訊數據包1470,將失敗。

可以通過兩種方式解決此問題。1、更改物理節點mtu值大小。2.修改calicomtu值大小爲 物理節點mtu-20。
推薦使用第二種

kubectl patch configmap/calico-config -n kube-system --type merge -p '{"data":{"veth_mtu": "1430"}}
根據實際需要調整所在k8s node節點的 eth0或tunl0的mtu,需確保tunl0的mtu比eth0的mtu少20。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章