K8S故障處理指南:pod驅逐問題處理
在K8S集群故障處理過程中,你可能遇到過pod的各種狀態,Evicted狀態代表你的K8S環境遇到了資源驅逐的問題,本節通過對驅逐問題的解決,參數的調整,問題的處理思路,希望給你解決此類問題提供幫助。
pod驅逐問題
pod出現狀態為Evicted時,表示出現了驅逐。pod驅逐出現的原因一般為資源不足,內存或磁盤空間不足,kubect describe node 根據集群事件或者系統日志來判斷處于哪種驅逐場景。
- 內存驅逐
關鍵字:MemPressure
操作系統日志,kubelet廠商驅逐pod來回收內存
- 磁盤驅逐
根據pod日志查看也可以。
關鍵字:DiskPressure
當出現磁盤驅逐的時候,K8S的機制會在磁盤資源不足時刪除未使用的容器鏡像來釋放空間。
處理思路
總體策略:根據分析的原因對應處理即可,找到驅逐pod所在的node節點,分析內存,cpu或者磁盤空間,分別采取不同措施。
首先是釋放資源,讓pod不再出現驅逐事件,保證業務使用不受影響。
內存場景說明
- 如果是內存出現驅逐,應用是多副本的情況下,可以擇時重啟導致內存占用高的服務釋放資源
- 若沒有發現占用內存高的資源,查看buff/cache占用是否過多不釋放,可以臨時或者加定時任務釋放
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.如果是正常業務占用,則后續及時擴容內存即可。
4.如果是其他場景,檢查操作系統是否為XC系統,需要找廠商進行分析。
- 清理驅逐pod
清理驅逐的pod,避免反復重啟積累過多。
kubectl get pod -o wide | grep 'Evicted' | awk '{print $2}' | xargs kubectl delete pod
- 關于驅逐的監控項
在K8S集群中,為了及時監控到驅逐問題,我們可以通過添加Prometheus監控來提前檢測。
# 監控內存驅逐
kube_node_status_condition{cnotallow="MemoryPressure",status="true"} ==1
#監控磁盤驅逐
kube_node_status_condition{cnotallow="DiskPressure",status="true"} == 1
驅逐參數配置
解決了問題,我們來研究下驅逐的策略是怎樣的。
節點壓力驅逐是 kubelet 主動終止 Pod 以回收節點上資源的過程。
kubelet 監控集群節點的內存、磁盤空間和文件系統的 inode 等資源。當這些資源中的一個或者多個達到特定的消耗水平, kubelet 可以主動地使節點上一個或者多個 Pod 失效,以回收資源。
驅逐的默認配置:
memory.available<100Mi
nodefs.available<10%
imagefs.available<15%
nodefs.inodesFree<5%(Linux 節點)
例如,如果一個節點的總內存為 10GiB,并且你希望在可用內存低于 1GiB 時觸發驅逐則可以將驅逐條件定義為 memory.available<10% 或 memory.available< 1G(你不能同時使用二者)。
有些情況下,當你的內存或者磁盤足夠多時,采用百分比可能會導致在資源充足的情況下,產生驅逐問題,因此我們可以將默認驅逐修改為當剩余資源低于某個閾值時產生驅逐問題。
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是否正常,業務閑時操作。