具有容忍度的 Pod 被调度到没有污染的节点

mal*_*olm 5 kubernetes

我的 Pod 具有以下设置:

Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/memory-pressure:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 60s
                 role_va
Run Code Online (Sandbox Code Playgroud)

pod 被调度到这个节点:

Labels:             balancer=true
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    cpu_avx2=true
                    cpu_avx512f=true
                    kubernetes.io/hostname=p20b-sr3-r5-k8s-node4
                    master=true
                    worker=true
Annotations:        node.alpha.kubernetes.io/ttl=0
                    volumes.kubernetes.io/controller-managed-attach-detach=true
Taints:             <none>
Run Code Online (Sandbox Code Playgroud)

请帮助我理解为什么。如果我没有记错的话,具有“role_va”容忍度的 Pod 必须调度到具有此污点的节点。在我的例子中,节点没有这种污点,但 pod 被调度到这个节点中。为什么?

ACl*_*mer 6

正如 Malgorzata 所说,Taints 和 Tolerations 仅对接受某种 pod 的节点有用。例如,具有“蓝色”污点的节点只能接受具有“蓝色”容忍度的 Pod。然而,这并不意味着具有“蓝色”容忍度的 Pod 只会出现在具有“蓝色”污点的节点中。Kube-Scheduler 可以选择任何其他没有污点的节点(因此不偏好 pod 类型)。

以下是实现您的要求的两种可能的方法。

  1. 应用具有污点的节点和具有该容忍度的 pod。并且还声明 pod 的节点关联性,这是 pod 在特定节点上获取调度的偏好。这两个配置结合在一起将确保您的 Pod 能够在特定节点上进行调度。并且节点只会拥有具有特定容忍度的 Pod。

  2. 如果您有三个节点,请在其中一个节点上应用“蓝色”污点,并在其余节点上应用“红色”污点。这将迫使具有“蓝色”容忍度的 pod 只有一种选择,以进入具有“蓝色”污点的节点。因为其他节点有“红色”污点,而 pod 没有“红色”容忍度。


Mal*_*ata 3

您的问题的答案包含在Kubernetes 文档中的污点和容忍定义中:Taints and Tolerations

\n\n
\n

Kubernetes 处理多个污点和容忍度的方式就像一个过滤器:从所有节点\xe2\x80\x99s 污点开始,然后忽略 pod 具有匹配容忍度的污点;其余未被忽略的污点对 pod 具有指定的影响

\n
\n\n

这意味着,如果节点没有污点,它将接受每个 Pod,无论其中定义了什么容忍度。

\n