Kubernetes節點資源耗盡狀態的處理


1、問題現象

[root@master35 scripts]# ./list_pod.sh | grep imis imis-866d46c464-nvz4b     0/1    ContainerCreating   0    3m     <none>          node149
發現有的pod無法啟動,剛開始describe查了下原因,看到,一直在拉鏡像狀態中,但是3分鍾了,也不至於鏡像拉不下來啊!
查看了下node149的狀態,發現Warning: “EvictionThresholdMet Attempting to reclaim nodefs”發現大概應該是由於磁盤原因造成的,
也可以看下kubelet日志,也會報這個類似的錯誤 

2、原因分析

[root@node149 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root        36G  30G   6G  86% / devtmpfs 7.8G     0  7.8G   0% /dev tmpfs 7.8G     0  7.8G   0% /dev/shm tmpfs 7.8G  9.3M  7.8G   1% /run tmpfs 7.8G     0  7.8G   0% /sys/fs/cgroup /dev/sda1                1014M  186M  829M  19% /boot 由於這是測試環境,所以docker的目錄,默認在/var/lib/docker,沒有單獨掛載別的目錄,這樣的話,也沒加定時任務清理磁盤,/ 磁盤就會越來越滿,現在看是用了86%
由於某些原因,我們的那個portal pod必須運行於該node上(通過nodeSelector選定node的方式)。
在無法擴充根分區size的情況下,為了臨時恢復pod運行,我們只能進一步“壓榨”node了。
於是我們的思路是:通過調整node的eviction threshold值來讓node恢復healthy。

3、解決方案

每個node上的kubelet都負責定期采集資源占用數據,並與預設的 threshold值進行比對,如果超過 threshold值,kubelet就會嘗試殺掉一些Pod以回收相關資源,對Node進行保護。kubelet關注的資源指標threshold大約有如下幾種: 

- memory.available - nodefs.available - nodefs.inodesFree - imagefs.available - imagefs.inodesFree

每種threshold又分為eviction-soft和eviction-hard兩組值。soft和hard的區別在於前者在到達threshold值時會給pod一段時間優雅退出,而后者則崇尚“暴力”,直接殺掉pod,沒有任何優雅退出的機會。這里還要提一下nodefs和imagefs的區別:

nodefs: 指node自身的存儲,存儲daemon的運行日志等,一般指root分區/;
imagefs: 指docker daemon用於存儲image和容器可寫層(writable layer)的磁盤;

4、解決步驟

我們需要為kubelet重新設定nodefs.available的threshold值。怎么做呢?

kubelet是運行於每個kubernetes node上的daemon,它在system boot時由systemd拉起:

root@master35 ~# ps -ef|grep kubelet root 5718  5695  0 16:38 pts/3    00:00:00 grep --color=auto kubelet root 13640     1  4 10:25 ?        00:17:25 /usr/bin/kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --require-kubeconfig=true --pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt --cadvisor-port=0

查看一下kubelet service的狀態:

[root@master35 scripts]# systemctl status kubelet ● kubelet.service - kubelet: The Kubernetes Node Agent Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system/kubelet.service.d └─10-kubeadm.conf Active: active (running) since Thu 2018-07-19 21:04:35 CST; 8 months 29 days ago Docs: http://kubernetes.io/docs/
 Main PID: 1921 (kubelet) Tasks: 19 Memory: 54.9M CGroup: /system.slice/kubelet.service └─1921 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=... Apr 14 09:26:16 master35 kubelet[1921]: W0414 09:26:16.673359    1921 reflector.go:341] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:47: watch o...(56737582) Apr 15 06:36:48 master35 kubelet[1921]: W0415 06:36:48.938194    1921 reflector.go:341] k8s.io/kubernetes/pkg/kubelet/config/apiserver.go:47: watch o...(56940044)

我們定義一個新的Environment var,比如就叫:KUBELET_EVICTION_POLICY_ARGS 在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

Environment="KUBELET_EVICTION_POLICY_ARGS=--eviction-hard=nodefs.available<5%" ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_EXTRA_ARGS $KUBELET_EVICTION_POLICY_ARGS

這樣控制,node的磁盤策略為<5%的硬盤就可以用,不像之前默認的15%就用不了了!

詳細操作可以看https://shenshengkun.github.io/posts/ak013ldk.html

本文完全抄自於:https://blog.csdn.net/weixin_37934134/article/details/106774835

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM