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可以正常运行。