一、问题描述
在日常操作维护 Kubernetes 过程中我们会经常遇到很多问题,其中经常收到的告警信息就是节点磁盘压力,即 DiskPressure 警告。当出现该警告不久后 Pod 会被驱逐,甚至节点机器的 Docker 镜像也被清理。在生产中这些情况是不能忍受的,我们探究一下是什么原因导致的这些,以及如何提前预防并解决相关问题。
二、问题分析
什么原因导致经常出现 DiskPressure 警告
推测经常出现这个警告的原因可能是:
-
• 默认情况下 docker 会将自己的持久化文件存储到 /var/lib/docker 目录下,这个目录占用空间比较大,导致 /var 目录挂载的磁盘非常容易被占满。
-
• 默认情况下 kubelet 会将自身的 Pod 运行时相关数据存储在 /var/lib/kubelet 目录下,这个目录空间比较大,导致 /var 目录挂载的磁盘非常容易被占满。
-
• 默认情况下 Docker、Kubernetes 和系统等相关日志默认都会存储到 /var/log 目录下,日志相关文件占用空间非常大,导致 /var 目录挂载的磁盘非常容易被占满。
上面三个默认配置,一个是 kubelet,一个是 docker 的,还有就是相关日志配置的,并且发现 var 目录一般分配的空间不是很大,所以 /var 目录挂载的磁盘空间非常容易被日志文件占满。除此之外,还有一种可能,那就是当发生 DiskPressure 告警时,此时磁盘其实可用存储空间还很充足,例如 1TB 存储空间,使用率 80% 提示 DiskPressure 告警,这时候其实还有 200GB 可用存储空间。所以,这个磁盘告警比例需要根据节点磁盘的真实情况进行调整。
三、解决问题
更改 kubelet 存储目录与告警阈值
既然 Kubelet 目录默认在 /var/lib/kubelet 目录下,且这个目录所挂载的磁盘容易被占满,所以我们修改 Kubelet 配置,将存储的数据单独存放到挂载其它大磁盘的目录中。并且根据磁盘真实大小,调整 Kubelet 触发 DisPress 告警的比例。 (1) 查看 kubelet 状态,根据显示的信息定位 kubelet 存储配置文件的位置 输入下面命令查看 kubelet 状态信息:
systemctl status -l kubelet
root@kmaster:/home/unionstrong# systemctl status -l kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: active (running) since 一 2022-10-17 10:06:24 CST; 58min ago
Docs: https://kubernetes.io/docs/home/
Main PID: 23687 (kubelet)
Tasks: 18
Memory: 1.8G
CPU: 27min 5.178s
CGroup: /system.slice/kubelet.service
└─23687 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_co
可以观察到配置文件目录所在位置是 /etc/systemd/system/kubelet.service.d ,配置文件是 10-kubeadm.conf (2) 查看 EnvironmentFile 配置文件所在位置 打开 kubelet 配置,查看 kubelet 配置文件:
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
Note: This dropin only works with kubeadm and kubelet v1.11+
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
可以看到 EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env 和 EnvironmentFile=-/etc/default/kubelet 俩行配置,其中 /var/lib/kubelet/kubeadm-flags.env 是 “kubeadm init” 和 “kubeadm join” 在运行时生成的文件,我们不需要管理该文件。而 /etc/default/kubelet 文件则是供我们用户添加自定义参数的,所以我们需要在这个配置文件中添加我们自定义配置参数。
(3) 编辑 /etc/default/kubelet 配置文件
vim /etc/default/kubelet
KUBELET_EXTRA_ARGS=--eviction-hard=nodefs.available<5% --eviction-hard=imagefs.available<5%
-
• –root-dir=/apps/data/kubelet: 设置 kubelet 数据存储在 /apps/data/kubelet 目录下。
-
• –eviction-hard=nodefs.available<5%: 设置当 kubelet 相关存储可用的存储不足 5% 时开始驱逐 Pod。
-
• –eviction-hard=imagefs.available<5%: 当容器运行时文件系统可用存储空间不足 15% 时开始驱逐 Pod。
-
• 上面的大小限制也可以改成具体的数值,例如 –eviction-hard=imagefs.available<10Gi ,则表示容器运行时存储小于 10Gi 时进行驱逐。
-
• (5) 重启 daemon-reload 和 kubelet
-
• systemctl daemon-reload && systemctl restart kubelet
原文始发于微信公众号(背带裤的云原生):危急存储救援:K8S节点DiskPressure优化,硬盘容量全面解锁!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/219054.html