现象

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 的阈值:

  1. --eviction-hard--eviction-soft 对应旧参数 --image-gc-high-threshold,这两个参数配置镜像 GC 及驱逐的触发阈值。磁盘使用率的阈值默认为 85%
    区别在于 eviction-hard 是立即驱逐,而 eviction-soft 在超过 eviction-soft-grace-period 之后才驱逐。
  2. --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/