我经常发现自己尝试启动一个新的 Pod,却收到一条错误消息,指出没有可用的节点。就像是:
0/9 nodes are available: 1 node(s) had no available volume zone, 8 node(s) didn't match node selector.
当我收到这些消息时,我总是不知所措。我应该如何调试它?
小智 4
首先我的建议是看一下Kubernetes Scheduler Component:
\n\n\n\n\n主控上的组件,用于监视未分配节点的新创建的 Pod,并选择一个节点供它们运行。[-]\n 调度决策时考虑的因素包括个人和集体资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据局部性、工作负载间干扰和截止日期。
\n\n调度程序会监视新创建的未分配节点的 Pod。对于调度程序发现的每个 Pod,调度程序负责找到该 Pod 运行的最佳节点\n 对于每个新创建的 pod 或其他未调度的 pod,kube-scheduler 会选择一个最佳节点供它们运行。然而,Pod 中的每个容器对资源都有不同的要求,每个 Pod 也有不同的要求。因此,需要根据具体的调度需求对现有节点进行过滤。
\n
根据文档:
\n\n\n\n\n在集群中,满足Pod调度要求的节点称为可行节点。如果没有合适的节点,则 Pod 将保持未调度状态,直到调度程序能够放置它。
\n
kube-scheduler 通过两步操作为 pod 选择节点。基于默认策略的标准 kube-scheduler标准 kube-scheduler :
\n\n查看这两项政策,您可以找到更多决策制定的信息。例如:
\n\nfor scoring at the stage CalculateAntiAffinityPriorityMap This policy helps implement pod anti-affinity.\nRun Code Online (Sandbox Code Playgroud)\n\n您可以在下面找到基于影响Kubernetes 调度程序决策的快速回顾
\n\n根据k8s 文档:
\n\n1 . NodeName是节点选择约束的最简单形式,但由于其局限性,通常不使用它。\n使用 nodeName 选择节点的一些限制是:
\n\n2 . 亲和力/反亲和力功能极大地扩展了您可以表达的约束类型。主要增强功能是:\n- 语言更具表现力(不仅仅是 \xe2\x80\x9cAND 精确匹配 \xe2\x80\x9d)\n- 您可以指示规则为 \xe2\x80\x9csoft\xe2 \x80\x9d/\xe2\x80\x9cpreference\xe2\x80\x9d 而不是硬性要求,因此如果调度程序可以 \xe2\x80\x99t 满足它,则 pod 仍会被调度\n-你可以约束节点(或其他拓扑域)上运行的其他 pod 上的标签,而不是节点本身的标签,这允许关于哪些 pod 可以和不能共置的规则
\n\n亲和性特征包括两种类型的亲和性,节点亲和性和pod间亲和性/反亲和性。节点亲和力类似于现有的nodeSelector(但具有上面列出的前两个优点),
\n\n\n\n\n目前有两种类型的 Pod 亲和性和反亲和性,称为requiredDuringSchedulingIgnoredDuringExecution和PreferredDuringSchedulingIgnoredDuringExecution,分别表示 \xe2\x80\x9chard\xe2\x80\x9d 与 \xe2\x80\x9csoft\xe2\x80\x9d 要求。
\n
希望这有帮助。
\n\n其他资源:
\n\n\n| 归档时间: |
|
| 查看次数: |
10323 次 |
| 最近记录: |