Pod 能否容忍一组污点中的一个?
Can a Pod tolerate one of a set of taints
考虑一个集群,其中每个节点都有给定的污点(假设 NodeType
)并且 Pod 可以容忍一组 NodeType
。例如,有节点被污染 NodeType=A
、NodeType=B
和 NodeType=C
.
我希望能够指定一些 Pods 容忍 NodeType=A
或 NodeType=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-0
和 dummy-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 被安排到特定节点。
考虑一个集群,其中每个节点都有给定的污点(假设 NodeType
)并且 Pod 可以容忍一组 NodeType
。例如,有节点被污染 NodeType=A
、NodeType=B
和 NodeType=C
.
我希望能够指定一些 Pods 容忍 NodeType=A
或 NodeType=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-0
和 dummy-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 被安排到特定节点。