赞
踩
在查看 pod 运行状态时,发现有的 pod 的状态是
Evicted
,通过describe
去查看发现了The node had condition: [DiskPressure].
的报错
原因是
kubelet
检测到本地磁盘使用率超过了85%
,这是 kubelet 的默认配置
grep '85%' /var/log/messages
可以看到类似如下的内容
May 7 10:45:19 DC3-03-010 kubelet[637219]: I0507 10:45:19.660844 637219 image_gc_manager.go:300] [imageGCManager]: Disk usage on image filesystem is at 85% which is over the high threshold (85%). Trying to free 4934070272 bytes down to the low threshold (80%).
方法只有两种,要么清理磁盘或者磁盘扩容,要么就是修改 kubelet 的配置
docker system prune
命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及 dangling 的镜像(docker images
命令输出的 REPOSITORY
和 TAG
显示为 <none>
的镜像)docker system prune -a
命令清理得更加彻底,可以将没有容器使用Docker镜像都删掉
docker system prune
docker system prune -a
PodPhase
设置为 Failed
。这将终止 Podmemory.available
cgroup memory
子系统中 memory.usage_in_bytes
中的值减去 memory.stat
中 total_inactive_file
的值memory.available<100Mi
nodefs.available
--root-dir
指定的文件分区和 /var/lib/kubelet/
所在的分区磁盘使用率nodefs.available<10%
nodefs.inodesFree
nodefs.available
分区的 inode
使用率imagefs.available
imagefs.available<15%
imagefs.inodesFree
nodefs.inodesFree<5%
(Linux 节点)pid.available
/proc/sys/kernel/pid_max
中的值为系统最大可用 pid 数--eviction-hard
来配置以上几个参数的阈值,当达到阈值时会驱逐节点上的容器[eviction-signal][operator][quantity]
eviction-signal
是要使用的驱逐信号operator
是你想要的关系运算符, 比如 <
(小于)quantity
是驱逐条件数量,例如 1Gi
quantity
的值必须与 Kubernetes 使用的数量表示相匹配%
)memory.available<10%
memory.available<1G
eviction-soft
:一组驱逐条件,如 memory.available<1.5Gi
, 如果驱逐条件持续时长超过指定的宽限期,可以触发 Pod 驱逐。eviction-soft-grace-period
:一组驱逐宽限期, 如 memory.available=1m30s
,定义软驱逐条件在触发 Pod 驱逐之前必须保持多长时间。eviction-max-pod-grace-period
:在满足软驱逐条件而终止 Pod 时使用的最大允许宽限期(以秒为单位)eviction-hard
:一组硬驱逐条件, 如 memory.available<1Gi
housekeeping-interval
评估驱逐条件
10s
MemoryPressure
DiskPressure
PIDPressure
--node-status-update-frequency
更新节点条件
10s
--eviction-minimum-reclaim
标志为每个资源配置最小回收量
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:
memory.available: "500Mi"
nodefs.available: "1Gi"
imagefs.available: "100Gi"
evictionMinimumReclaim:
memory.available: "0Mi"
nodefs.available: "500Mi"
imagefs.available: "2Gi"
memory.available
信号满足驱逐条件, kubelet 会回收资源
500Mi
的条件nodefs.available
信号满足驱逐条件, kubelet 会回收资源
1Gi
的条件, 然后继续回收至少 500Mi
直到信号达到 1.5Gi
imagefs.available
信号满足驱逐条件, kubelet 会回收资源
100Gi
的条件, 然后继续回收至少 2Gi
直到信号达到 102Gi
eviction-minimum-reclaim
都为 0
其他更多细节,可以查看官方文档:节点压力驱逐
systemctl cat kubelet
以自己的路径为准,找到相关的 yaml 配置文件,我的是
kubeadm
的方式部署的,看KUBELET_CONFIG_ARGS=--config
指定的路径即可
cp /var/lib/kubelet/config.yaml{,.bak}
vim /var/lib/kubelet/config.yaml
# 软驱逐 evictionSoft
# 硬驱逐 evictionHard
evictionHard:
nodefs.available: "5Gi"
imagefs.available: "5Gi"
# 最小驱逐回收,可以不配置
evictionMinimumReclaim:
nodefs.available: "500Mi"
systemctl cat kubelet
找到 kubelet.service 文件的路径
以自己的路径为准,一般都会有
EnvironmentFile
参数,如果没有,可以加到Environment
参数后面
cp /etc/sysconfig/kubelet{,.bak}
vim /etc/sysconfig/kubelet
软驱逐必须要设置驱逐宽限期,如果没有配置,kubelet 会启动失败,报错:
grace period must be specified for the soft eviction threshold imagefs.available
--eviction-soft=nodefs.available<5%,imagefs.available<5% \
--eviction-soft-grace-period=nodefs.available=2m,imagefs.available=2m \
--eviction-max-pod-grace-period=30
systemctl restart kubelet
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。