欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > Kubernetes 调度Pod 时遇到的磁盘压力问题node.kubernetes.io/disk-pressure

Kubernetes 调度Pod 时遇到的磁盘压力问题node.kubernetes.io/disk-pressure

2025/2/7 1:33:34 来源:https://blog.csdn.net/happyblreay/article/details/139951573  浏览:    关键词:Kubernetes 调度Pod 时遇到的磁盘压力问题node.kubernetes.io/disk-pressure

原始出错信息:

Warning  FailedScheduling  11s   default-scheduler  0/1 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }. preemption: 0/1 nodes areavailable: 1 Preemption is not helpful for scheduling..

您遇到的警告消息表明 Kubernetes 调度器在尝试调度一个 Pod 时遇到了问题。这里的关键信息是:

0/1 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }.

这表示集群中没有节点可用来调度您的 Pod,因为存在一个节点带有不被 Pod 容忍的污点(Taint)。在这种情况下,该污点是 node.kubernetes.io/disk-pressure,这通常表示该节点上的磁盘资源紧张,即空间不足或者 inode 使用过多等问题,此时 Kubernetes 调度器不会在该节点上调度新的 Pod。

接下来的部分:

preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling..

告诉您,即使考虑抢占(Preemption,一种机制,允许更高优先级的 Pod 通过驱逐(Evict)正在运行的低优先级 Pod 来调度),在这种情况下也无济于事,因为抢占并不会解决 untolerated taint 的问题。

要解决这个问题,您可以从以下几个方向考虑:

  1. 检查磁盘空间:到该节点上检查磁盘资源,确保有足够的空间和 inode。如果磁盘空间不足,尝试清理无用的文件和镜像。

  2. 查看事件和日志:使用 kubectl describe node <node-name> 查看节点事件,确认是否是磁盘压力造成的问题,同时可以查看 kubelet 日志以获取更多信息。

  3. Taints 和 Tolerations:检查您的 Pod 定义是否包含了可以容忍该污点的 toleration。如果您确定 Pod 应该运行在该节点上,您可以为 Pod 添加相应的 toleration:

    tolerations:
    - key: "node.kubernetes.io/disk-pressure"operator: "Exists"effect: "NoSchedule"
    
  4. Kubelet 配置:检查节点上的 kubelet 配置,确认磁盘阈值设置是您预期的。Kubelet 将基于这些值来决定是否给节点添加 disk-pressure 污点。

  5. 临时解决方法:如果需要紧急调度 Pod,且确认节点的磁盘状态良好,可以考虑手动移除节点的该污点(这通常不建议在生产环境中使用,因为它可能会掩盖实际的问题):

    kubectl taint nodes <node-name> node.kubernetes.io/disk-pressure-
    

由于节点污点通常表示集群节点状态的实际问题,建议首先调查和解决根本原因,而不是简单地移除污点。

如何设置磁盘阈值

Kubelet 会根据若干阈值来决定何时在节点上报告磁盘压力。如果磁盘使用量超过这些阈值之一,会在节点上添加相应的污点,以避免在节点上调度新的Pod。

这些阈值可以在 kubelet 启动时通过命令行参数来设置,也可以通过 kubelet 配置文件来设置。下面是一些与磁盘阈值相关的 kubelet 配置选项:

  1. --image-gc-high-threshold:设置 docker 镜像垃圾回收的高阈值百分比。达到该阈值时kubelet将尝试删除不使用的镜像。默认值通常是 85%。

  2. --image-gc-low-threshold:设置 docker 镜像垃圾回收的低阈值百分比。垃圾回收会尝试将镜像使用量降低到该值以下。默认值通常是 80%。

  3. --eviction-hard:这是一组设置硬驱逐阈值的键值对,例如 memory.available<1Gi。对于磁盘,你可以设置 nodefs.available<15%(节点文件系统的可用空间小于 15% 时触发驱逐),nodefs.inodesFree<5%(节点文件系统的可用inode数量小于 5% 时触发驱逐),或者 imagefs.available<15%(如果 docker 使用独立的镜像文件系统时的配置)。

  4. --eviction-soft:这设置软驱逐阈值过渡时长。软驱逐不会立即将Pod从节点驱逐。

  5. --eviction-pressure-transition-period:设置触发硬驱逐条件后,节点状态更新为"UnderPressure"之前的时长。

  6. --eviction-soft-grace-period:设置在开始软性驱逐之前的宽限期。

要配置这些参数,你需要修改kubelet的启动配置,这可能在不同环境下有不同的方法来管理。如果你使用的是 kubeadm 来引导集群,你可以编辑 /var/lib/kubelet/config.yaml 或相应的 systemd unit 文件(通常位于 /etc/systemd/system/kubelet.service.d/ 目录中),然后重启 kubelet:

sudo systemctl daemon-reload
sudo systemctl restart kubelet

或者,在某些环境下,kubelet 的配置可能是通过 --config 参数指向的一个 KubeletConfiguration 文件定义的。在这种情况下,你需要编辑该文件并更新 kubeletConfig 对象。

以下是 kubeletConfig 中设置一些 eviction 相关配置的 YAML 示例:

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
evictionHard:memory.available: "500Mi"nodefs.available: "10%"nodefs.inodesFree: "5%"
evictionSoft:memory.available: "1.5Gi"
evictionPressureTransitionPeriod: "1m0s"

更改完毕后,重启 kubelet 以使配置生效。记得在您的具体环境中查找适当的配置方式,因为这可能会根据 Kubernetes 集群的设置方式而异。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com