K8S故障處理指南:pod驅(qū)逐問題處理

在K8S集群故障處理過程中,你可能遇到過pod的各種狀態(tài),Evicted狀態(tài)代表你的K8S環(huán)境遇到了資源驅(qū)逐的問題,本節(jié)通過對驅(qū)逐問題的解決,參數(shù)的調(diào)整,問題的處理思路,希望給你解決此類問題提供幫助。
pod驅(qū)逐問題
pod出現(xiàn)狀態(tài)為Evicted時,表示出現(xiàn)了驅(qū)逐。pod驅(qū)逐出現(xiàn)的原因一般為資源不足,內(nèi)存或磁盤空間不足,kubect describe node 根據(jù)集群事件或者系統(tǒng)日志來判斷處于哪種驅(qū)逐場景。

- 內(nèi)存驅(qū)逐
 

關(guān)鍵字:MemPressure
操作系統(tǒng)日志,kubelet廠商驅(qū)逐pod來回收內(nèi)存

- 磁盤驅(qū)逐
 
根據(jù)pod日志查看也可以。

關(guān)鍵字:DiskPressure
當(dāng)出現(xiàn)磁盤驅(qū)逐的時候,K8S的機制會在磁盤資源不足時刪除未使用的容器鏡像來釋放空間。
處理思路
總體策略:根據(jù)分析的原因?qū)?yīng)處理即可,找到驅(qū)逐pod所在的node節(jié)點,分析內(nèi)存,cpu或者磁盤空間,分別采取不同措施。
首先是釋放資源,讓pod不再出現(xiàn)驅(qū)逐事件,保證業(yè)務(wù)使用不受影響。
內(nèi)存場景說明
- 如果是內(nèi)存出現(xiàn)驅(qū)逐,應(yīng)用是多副本的情況下,可以擇時重啟導(dǎo)致內(nèi)存占用高的服務(wù)釋放資源
 - 若沒有發(fā)現(xiàn)占用內(nèi)存高的資源,查看buff/cache占用是否過多不釋放,可以臨時或者加定時任務(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=33.如果是正常業(yè)務(wù)占用,則后續(xù)及時擴容內(nèi)存即可。
4.如果是其他場景,檢查操作系統(tǒng)是否為XC系統(tǒng),需要找廠商進行分析。
- 清理驅(qū)逐pod
 
清理驅(qū)逐的pod,避免反復(fù)重啟積累過多。
kubectl get pod -o wide | grep  'Evicted' | awk '{print $2}' | xargs kubectl delete pod- 關(guān)于驅(qū)逐的監(jiān)控項
 
在K8S集群中,為了及時監(jiān)控到驅(qū)逐問題,我們可以通過添加Prometheus監(jiān)控來提前檢測。
# 監(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ù)配置
解決了問題,我們來研究下驅(qū)逐的策略是怎樣的。
節(jié)點壓力驅(qū)逐是 kubelet 主動終止 Pod 以回收節(jié)點上資源的過程。
kubelet 監(jiān)控集群節(jié)點的內(nèi)存、磁盤空間和文件系統(tǒng)的 inode 等資源。當(dāng)這些資源中的一個或者多個達到特定的消耗水平, kubelet 可以主動地使節(jié)點上一個或者多個 Pod 失效,以回收資源。
驅(qū)逐的默認配置:
memory.available<100Mi
nodefs.available<10%
imagefs.available<15%
nodefs.inodesFree<5%(Linux 節(jié)點)例如,如果一個節(jié)點的總內(nèi)存為 10GiB,并且你希望在可用內(nèi)存低于 1GiB 時觸發(fā)驅(qū)逐則可以將驅(qū)逐條件定義為 memory.available<10% 或 memory.available< 1G(你不能同時使用二者)。
有些情況下,當(dāng)你的內(nèi)存或者磁盤足夠多時,采用百分比可能會導(dǎo)致在資源充足的情況下,產(chǎn)生驅(qū)逐問題,因此我們可以將默認驅(qū)逐修改為當(dāng)剩余資源低于某個閾值時產(chǎn)生驅(qū)逐問題。
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ù)閑時操作。
官方網(wǎng)站: https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/#eviction-signals















 
 
 













 
 
 
 