文章目录
一、问题背景
当前kubernetes环境为单节点kubernetes,master节点或worker节点为同一主机,查询该节点上所有业务系统pod发现都处于pending状态,无法正常工作。且kube-flannel-ds-amd64-864q5这个pod处于Evicted(驱逐)状态。
如下图所示:
二、问题分析
2.1、查看问题pod日志信息
kubectl describe pods kube-flannel-ds-amd64-864q5 -n kube-system
如下图所示:
说明:根据pod日志报错信息表示改节点资源不足,disk是磁盘的意思。
2.2、查看节点磁盘容量信息
说明:上述日志信息表示磁盘容量不足,df -h查看当前节点磁盘容量使用信息。如下图所示:
当前磁盘使用率为88%,并没有达到100%,是不是很奇怪为什么k8s会报错提示磁盘资源不足呢?请继续往下看!
2.3、查看系统日志信息
说明:查看系统日志信息,捕捉与disk有关的关键信息。
grep -i disk /var/log/messages | head -10
如下图所示:
说明:上述途中红色标记部分大概的意思是:镜像文件系统的磁盘占用率为88%,超过了高阈值(85%)。 尝试将80476641689字节释放到低阈值(80%)。也就是说node节点低于15%的时候,该节点上讲会执行eviction(驱逐)操作,由于磁盘已经达到了88%,在怎么驱逐也无法正常启动就会一直重启,Pod状态也是pending中。同时你会发现被驱逐pod的镜像也会在磁盘资源不足时删除
使用如下命令可发现,fannel的镜像被删除
docker images | grep flannel
三、解决方案
3.1、方案一
1、清理磁盘空间,将磁盘使用率降到80%以下
2、重启kubelet服务
systemctl daemon-reload
systemctl restart kubelet
3、由于之前flannel镜像被删除,需要重新导入镜像
docker load -i flannel-v0.12.0-amd64.tar.gz
kubectl apply -f kube-flannel.yml
4、查看所有pod状态,如下所示则表示正常
3.2、方案二
1、修改配置文件前查看系统日志
2、修改配置文件增加传参数,添加此配置项–eviction-hard=nodefs.available<5%
#1、备份原先配置文件
cp /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf.bak
#2、修改配置文件,在Environment中增加--eviction-hard=nodefs.available<5%
vim /usr/lib/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 --eviction-hard=nodefs.available<5%"
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/sysconfig/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
#3、重启kubelet服务
systemctl daemon-reload
systemctl restart kubelet
3、修改配置文件后查看系统日志
说明:最新日志,已经是0.05 也就是剩余5%,才会出现驱逐的情况。
4、清理磁盘空间,降低磁盘空间使用率
5、kubelet 将驱逐信号映射到节点条件
总结:整理不易,如果对你有帮助,可否点赞关注一下?
更多详细内容请参考:企业级K8s集群运维实战