kubernetes集群中 硬盘空间使用率过高,pod不调度的解决方案

模拟环境

现在环境里准备了3台机器

[root@vms11 ~]# kubectl get nodes
NAME             STATUS   ROLES           AGE   VERSION
vms11.rhce.cc    Ready    control-plane   75d   v1.25.2
vms12.rhce.cc    Ready              75d   v1.25.2
vms222.rhce.cc   Ready              12m   v1.25.2
[root@vms11 ~]#

在vms222.rhce.cc这台机器上根分区的使用率已经达到了63%。

[root@vms222 ~]# df -hT | grep 'root '
/dev/mapper/centos-root xfs       8.0G  5.0G  3.0G   63% /
[root@vms222 ~]#

在master上为vms222.rhce.cc设置一个标签xx=xx

[root@vms11 ~]# kubectl label nodes vms222.rhce.cc xx=xx
node/vms222.rhce.cc labeled
[root@vms11 ~]#

在master上创建pod1让其在vms222.rhce.cc上运行,yaml文件如下


apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: pod1
  name: pod1
spec:
  terminationGracePeriodSeconds: 0
  nodeSelector:
    xx: xx
  containers:
  - image: nginx
    imagePullPolicy: IfNotPresent
    name: pod1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

创建pod1

[root@vms11 ~]# kubectl apply -f pod1.yaml 
pod/pod1 created
[root@vms11 ~]# 
[root@vms11 ~]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP             NODE            ... 
pod1   1/1     Running   0          8s   10.244.173.1   vms222.rhce.cc  ...
[root@vms11 ~]#

在这里可以看到pod1可以在vms222节点上正常运行。
删除pod1

kubectl delete pod pod1

模拟故障

切换到vms222上,在vms222上创建一个大文件用于消耗磁盘空间

[root@vms222 ~]# dd if=/dev/zero of=/file bs=1M count=2048
记录了2048+0 的读入
记录了2048+0 的写出
2147483648字节(2.1 GB)已复制,1.42681 秒,1.5 GB/秒
[root@vms222 ~]# 
[root@vms222 ~]# df -hT | grep 'root '
/dev/mapper/centos-root xfs       8.0G  7.0G 1022M   88% /
[root@vms222 ~]#

此时vms222上的磁盘使用率是88%
再次切换到master上创建pod1

[root@vms11 ~]# kubectl apply -f pod1.yaml 
pod/pod1 created
[root@vms11 ~]# kubectl get pods 
NAME   READY   STATUS    RESTARTS   AGE
pod1   0/1     Pending   0          14s
[root@vms11 ~]# 

在这里能看到pod1的状态是pending的,因为默认情况下,当磁盘使用率超过85%的话,kube-scheduler就不会再往此worker节点上调度pod了。
在master上删除pod1

kubectl delete pod pod1

故障解决

用vim编辑/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf,在第四行下面添加一行变量

效果如下

Environment="KUBELET_AA_ARGS=--eviction-hard=nodefs.available <5%"

并在最后一行的ExecStart最后添加$KUBELET_AA_ARGS,效果如下

ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS $KUBELET_AA_ARGS

添加这个变量的意思是,磁盘剩余空间只要超过5%,那么仍然可以继续往该节点调度pod。
在worker上重启kubelet

systemctl daemon-reload ; systemctl restart kubelet

再次查看磁盘使用率

[root@vms222 ~]# df -hT | grep 'root '
/dev/mapper/centos-root xfs       8.0G  7.2G  818M   91% /
[root@vms222 ~]#

这里显示是91%。
切换到master上,再次创建pod1

[root@vms11 ~]# kubectl apply -f pod1.yaml 
pod/pod1 created
[root@vms11 ~]# kubectl get pods -o wide
NAME READY   STATUS  RESTARTS   AGE   IP             NODE          
pod1  1/1     Running   0         3s   10.244.173.3 vms222.rhce.cc   
[root@vms11 ~]#

此时pod可以正常运行。

相关新闻

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读