我有一个运行 k8s 1.23 的集群和几个工作负载。工作负载分布在 3 个优先级类别中
high 10000000
medium 100000
low 1000
所有 pod 的 priorityClass 设置都正确,但我遇到了一个大故障,一些节点不可用,并且几个具有高优先级的 pod 仍处于待处理状态,而所有低优先级和中优先级的 pod 仍在运行。
我在 kubectl get events 上看不到任何抢占参考。FailedScheduling 中的一个日志显示:
43m Warning FailedScheduling pod/redacted-78455bb4b7-mtq5m 0/13 nodes are available: 1 Too many pods, 1 node(s) had taint {taint.kubernetes.io/zone: redacted}, that the pod didn't tolerate, 2 Insufficient cpu, 2 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 2 node(s) had taint {taint.kubernetes.io/redacted: redacted}, that the pod didn't tolerate, 6 node(s) were unschedulable.
总结一下,故障发生后,我只有两个“可用”的节点(未被污染/不可调度),但一个由于“pod 太多”而被拒绝,另一个由于“CPU 不足”而被拒绝。
- 为什么不驱逐所有低优先级的 pod 以便安排高优先级的 pod 呢?
- 抢占会以某种方式忽略“Pod 过多”和“CPU 不足”节点吗?
答案1
正如您所提到的,以下错误与调度失败发生于kubectl 获取事件使用的命令
错误 1:FailedScheduling
节点有污点 {node-role.kubernetes.io/master: },Pod 无法容忍
污点和容忍度共同作用,确保 pod 不会被安排在不适当的节点上。
检查节点是否有污点
kubectl describe node <nodename> | grep Taints
如果节点上存在任何污点,则会提供类似的输出
node-role.kubernetes.io/master:NoSchedule
如果您想要保留节点上的污点,但仍然想要在该节点上安排特定的 pod,那么请将其包含在您的 pod/deployment.yaml 文件中。
tolerations:
- key: "key"
operator: "Exists"
effect: "NoSchedule"
如果您想从节点中删除污点,请更新以下命令。
kubectl taint node master node-role.kubernetes.io/master:NoSchedule-
确保-
在前面添加无日程
更多信息可以关注官方文档。
错误 2:
CPU 不足
如果 Pod 指定了资源请求(即运行所需的最小 CPU 和/或内存量),Kubernetes 调度程序将尝试查找可以分配资源来满足这些请求的节点。如果不成功,Pod 将保持待处理状态,直到有更多资源可用。
您可以在博客作者艾米莉·张为与以下相关的不同场景提供解决方案调度失败。