Pod 能否容忍一组污点中的一个?

Can a Pod tolerate one of a set of taints

考虑一个集群,其中每个节点都有给定的污点(假设 NodeType)并且 Pod 可以容忍一组 NodeType。例如,有节点被污染 NodeType=ANodeType=BNodeType=C.

我希望能够指定一些 Pods 容忍 NodeType=ANodeType=C,但不能容忍 NodeType=B。其他 Pods(在不同的部署中)会容忍不同的集合。有办法吗?

是的,似乎可以通过在 pod 的规范中使用相同的键添加多个容差来实现。官方给出了一个例子docs.

这是我试过的演示,可以产生所需的结果。

集群有三个节点:

kubectl get nodes
NAME      STATUS   AGE     VERSION
dummy-0   Ready    3m17s   v1.17.14
dummy-1   Ready    26m     v1.17.14
dummy-2   Ready    26m     v1.17.14

我使用 kubectl taint 命令如问题中所述污染了它们:

kubectl taint node dummy-0 NodeType=A:NoSchedule
kubectl taint node dummy-1 NodeType=B:NoSchedule
kubectl taint node dummy-2 NodeType=C:NoSchedule

创建了一个包含三个具有匹配容忍度的副本的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx-nfs
      tolerations:
      - key: "NodeType"
        operator: "Equal"
        value: "A"
        effect: "NoSchedule"
      - key: "NodeType"
        operator: "Equal"
        value: "B"
        effect: "NoSchedule"

kubectl get pods 命令中,我们可以看到 Deployment 的 pods 仅安排在节点 dummy-0dummy-1 上,而不是 [=18] =] 有不同的污点:

kubectl get pod -o wide
NAME                               READY  STATUS  RESTARTS AGE      IP         NODE
nginx-deployment-5fc8f985d8-2pfvm   1/1   Running    0      8s  100.96.2.11   dummy-0
nginx-deployment-5fc8f985d8-hkrcz   1/1   Running    0      8s  100.96.6.10   dummy-1
nginx-deployment-5fc8f985d8-xfxsx   1/1   Running    0      8s  100.96.6.11   dummy-1

此外,重要的是要了解污点和容忍度有助于确保 pods 不会被安排到特定节点。

我们应该使用 node affinities namely affinity and anti-affinity 的概念来确保 pods 被安排到特定节点。