现象
k8s集群在 执行kubectl get po --all-namespaces
命令后发现某个pod一直处于pending状态
执行 kubectl describe po <pod名> -n <pod所在命名空间>
后找到pending原因
如下
nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) didn't match pod affinity/anti-affinity
查找污点原因
执行kubectl get no -o yaml | grep taint -A 5
命令可以查看污点存在的原因,一般是内存或者磁盘资源不够导致,我的节点是因为磁盘空间不足导致的.新增磁盘空间后恢复正常. 节点磁盘压力 DiskPressure 会导致 Pod 被驱逐,也会触发容器镜像的 GC, 磁盘使用率的阈值默认为 85%. 处于DiskPressure的node,调度器就不会再将任何pod调度上去。否则一旦磁盘空间用满,node上的容器可能会严重崩溃.
其他方法移除污点
除了增加磁盘或者修改DiskPressure阈值外,还可以通过kubectl taint node
的相关命令移除 污点
- 查看taint
kubectl describe <node名>
例如:kubectl describe node node1
- 删除taint
kubectl taint node node1 key1:NoSchedule- # 这里的key可以不用指定value kubectl taint node node1 key1:NoExecute- # kubectl taint node node1 key1- 删除指定key所有的effect kubectl taint node node1 key2:NoSchedule-
容器镜像GC、Pod驱逐以及节点压力
节点压力 DiskPressure 会导致 Pod 被驱逐,会触发容器镜像的 GC。
根据官方文档 配置资源不足时的处理方式,Kubelet 提供如下用于配置容器 GC 及 Evicetion 的阈值:
--eviction-hard
和--eviction-soft
对应旧参数--image-gc-high-threshold
,这两个参数配置镜像 GC 及驱逐的触发阈值。磁盘使用率的阈值默认为 85%
区别在于eviction-hard
是立即驱逐,而eviction-soft
在超过eviction-soft-grace-period
之后才驱逐。--eviction-minimum-reclaim
对应旧参数--image-gc-low-threshold
. 这是进行资源回收(镜像GC、Pod驱逐等)后期望达到的磁盘使用率百分比。磁盘使用率的阈值默认值为 80%。
问:能否为 ImageGC 设置一个比 DiskPressure 更低的阈值?因为我们希望能自动进行镜像 GC,但是不想立即触发 Pod 驱逐。
答:这应该可以通过设置 eviction-soft
和长一点的 eviction-soft-grace-period
来实现。
另外 --eviction-minimum-reclaim
也可以设小一点,清理得更干净。示例如下
--eviction-soft=memory.available<1Gi,nodefs.available<2Gi,imagefs.available<200Gi
--eviction-soft-grace-period=3m
--eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=1Gi,imagefs.available=2Gi
参考
https://wwwblogs/kirito-c/p/11923824.html
https://kubernetes.io/zh/docs/tasks/administer-cluster/out-of-resource/
https://blog.csdn/cd_yourheart/article/details/108766912
更多推荐
pod 一直pending nodes are available: 1 node(s) had taint {node-role.kubernetes.io/
发布评论