原始出错信息:
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 的问题。
要解决这个问题,您可以从以下几个方向考虑:
-
检查磁盘空间:到该节点上检查磁盘资源,确保有足够的空间和 inode。如果磁盘空间不足,尝试清理无用的文件和镜像。
-
查看事件和日志:使用
kubectl describe node <node-name>
查看节点事件,确认是否是磁盘压力造成的问题,同时可以查看 kubelet 日志以获取更多信息。 -
Taints 和 Tolerations:检查您的 Pod 定义是否包含了可以容忍该污点的 toleration。如果您确定 Pod 应该运行在该节点上,您可以为 Pod 添加相应的 toleration:
tolerations: - key: "node.kubernetes.io/disk-pressure"operator: "Exists"effect: "NoSchedule"
-
Kubelet 配置:检查节点上的 kubelet 配置,确认磁盘阈值设置是您预期的。Kubelet 将基于这些值来决定是否给节点添加 disk-pressure 污点。
-
临时解决方法:如果需要紧急调度 Pod,且确认节点的磁盘状态良好,可以考虑手动移除节点的该污点(这通常不建议在生产环境中使用,因为它可能会掩盖实际的问题):
kubectl taint nodes <node-name> node.kubernetes.io/disk-pressure-
由于节点污点通常表示集群节点状态的实际问题,建议首先调查和解决根本原因,而不是简单地移除污点。
如何设置磁盘阈值
Kubelet 会根据若干阈值来决定何时在节点上报告磁盘压力。如果磁盘使用量超过这些阈值之一,会在节点上添加相应的污点,以避免在节点上调度新的Pod。
这些阈值可以在 kubelet 启动时通过命令行参数来设置,也可以通过 kubelet 配置文件来设置。下面是一些与磁盘阈值相关的 kubelet 配置选项:
-
--image-gc-high-threshold
:设置 docker 镜像垃圾回收的高阈值百分比。达到该阈值时kubelet将尝试删除不使用的镜像。默认值通常是 85%。 -
--image-gc-low-threshold
:设置 docker 镜像垃圾回收的低阈值百分比。垃圾回收会尝试将镜像使用量降低到该值以下。默认值通常是 80%。 -
--eviction-hard
:这是一组设置硬驱逐阈值的键值对,例如memory.available<1Gi
。对于磁盘,你可以设置nodefs.available<15%
(节点文件系统的可用空间小于 15% 时触发驱逐),nodefs.inodesFree<5%
(节点文件系统的可用inode数量小于 5% 时触发驱逐),或者imagefs.available<15%
(如果 docker 使用独立的镜像文件系统时的配置)。 -
--eviction-soft
:这设置软驱逐阈值过渡时长。软驱逐不会立即将Pod从节点驱逐。 -
--eviction-pressure-transition-period
:设置触发硬驱逐条件后,节点状态更新为"UnderPressure"之前的时长。 -
--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 集群的设置方式而异。