K8S故障處理指南:pod驅(qū)逐問(wèn)題處理
在K8S集群故障處理過(guò)程中,你可能遇到過(guò)pod的各種狀態(tài),Evicted狀態(tài)代表你的K8S環(huán)境遇到了資源驅(qū)逐的問(wèn)題,本節(jié)通過(guò)對(duì)驅(qū)逐問(wèn)題的解決,參數(shù)的調(diào)整,問(wèn)題的處理思路,希望給你解決此類問(wèn)題提供幫助。
pod驅(qū)逐問(wèn)題
pod出現(xiàn)狀態(tài)為Evicted時(shí),表示出現(xiàn)了驅(qū)逐。pod驅(qū)逐出現(xiàn)的原因一般為資源不足,內(nèi)存或磁盤空間不足,kubect describe node 根據(jù)集群事件或者系統(tǒng)日志來(lái)判斷處于哪種驅(qū)逐場(chǎng)景。
- 內(nèi)存驅(qū)逐
關(guān)鍵字:MemPressure
操作系統(tǒng)日志,kubelet廠商驅(qū)逐pod來(lái)回收內(nèi)存
- 磁盤驅(qū)逐
根據(jù)pod日志查看也可以。
關(guān)鍵字:DiskPressure
當(dāng)出現(xiàn)磁盤驅(qū)逐的時(shí)候,K8S的機(jī)制會(huì)在磁盤資源不足時(shí)刪除未使用的容器鏡像來(lái)釋放空間。
處理思路
總體策略:根據(jù)分析的原因?qū)?yīng)處理即可,找到驅(qū)逐pod所在的node節(jié)點(diǎn),分析內(nèi)存,cpu或者磁盤空間,分別采取不同措施。
首先是釋放資源,讓pod不再出現(xiàn)驅(qū)逐事件,保證業(yè)務(wù)使用不受影響。
內(nèi)存場(chǎng)景說(shuō)明
- 如果是內(nèi)存出現(xiàn)驅(qū)逐,應(yīng)用是多副本的情況下,可以擇時(shí)重啟導(dǎo)致內(nèi)存占用高的服務(wù)釋放資源
- 若沒(méi)有發(fā)現(xiàn)占用內(nèi)存高的資源,查看buff/cache占用是否過(guò)多不釋放,可以臨時(shí)或者加定時(shí)任務(wù)釋放
echo 1 > /proc/sys/vm/drop_caches
或者 sysctl -w vm.drop_caches=1
echo 2 > /proc/sys/vm/drop_caches
或者 sysctl -w vm.drop_caches=2
echo 3 > /proc/sys/vm/drop_caches
或者sysctl -w vm.drop_caches=3
3.如果是正常業(yè)務(wù)占用,則后續(xù)及時(shí)擴(kuò)容內(nèi)存即可。
4.如果是其他場(chǎng)景,檢查操作系統(tǒng)是否為XC系統(tǒng),需要找廠商進(jìn)行分析。
- 清理驅(qū)逐pod
清理驅(qū)逐的pod,避免反復(fù)重啟積累過(guò)多。
kubectl get pod -o wide | grep 'Evicted' | awk '{print $2}' | xargs kubectl delete pod
- 關(guān)于驅(qū)逐的監(jiān)控項(xiàng)
在K8S集群中,為了及時(shí)監(jiān)控到驅(qū)逐問(wèn)題,我們可以通過(guò)添加Prometheus監(jiān)控來(lái)提前檢測(cè)。
# 監(jiān)控內(nèi)存驅(qū)逐
kube_node_status_condition{cnotallow="MemoryPressure",status="true"} ==1
#監(jiān)控磁盤驅(qū)逐
kube_node_status_condition{cnotallow="DiskPressure",status="true"} == 1
驅(qū)逐參數(shù)配置
解決了問(wèn)題,我們來(lái)研究下驅(qū)逐的策略是怎樣的。
節(jié)點(diǎn)壓力驅(qū)逐是 kubelet 主動(dòng)終止 Pod 以回收節(jié)點(diǎn)上資源的過(guò)程。
kubelet 監(jiān)控集群節(jié)點(diǎn)的內(nèi)存、磁盤空間和文件系統(tǒng)的 inode 等資源。當(dāng)這些資源中的一個(gè)或者多個(gè)達(dá)到特定的消耗水平, kubelet 可以主動(dòng)地使節(jié)點(diǎn)上一個(gè)或者多個(gè) Pod 失效,以回收資源。
驅(qū)逐的默認(rèn)配置:
memory.available<100Mi
nodefs.available<10%
imagefs.available<15%
nodefs.inodesFree<5%(Linux 節(jié)點(diǎn))
例如,如果一個(gè)節(jié)點(diǎn)的總內(nèi)存為 10GiB,并且你希望在可用內(nèi)存低于 1GiB 時(shí)觸發(fā)驅(qū)逐則可以將驅(qū)逐條件定義為 memory.available<10% 或 memory.available< 1G(你不能同時(shí)使用二者)。
有些情況下,當(dāng)你的內(nèi)存或者磁盤足夠多時(shí),采用百分比可能會(huì)導(dǎo)致在資源充足的情況下,產(chǎn)生驅(qū)逐問(wèn)題,因此我們可以將默認(rèn)驅(qū)逐修改為當(dāng)剩余資源低于某個(gè)閾值時(shí)產(chǎn)生驅(qū)逐問(wèn)題。
cat /data/kube/kubelet/kubelet-config.yaml | grep -A 4 evictionHard
evictionHard:
imagefs.available: "1Gi"
memory.available: "200Mi"
nodefs.available: "1Gi"
nodefs.inodesFree: "5%"
重啟讓配置生效。
sudo systemctl daemon-reload && sudo systemctl restart kubelet
重啟完成后檢查pod是否正常,業(yè)務(wù)閑時(shí)操作。
官方網(wǎng)站: https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/#eviction-signals