为了完成你所需要的,基本上你必须使用taint。假设您有一个 Kubernetes 集群,其中包含一个 Master 和 2 个 Worker 节点:
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
knode01 Ready <none> 8d v1.16.2
knode02 Ready <none> 8d v1.16.2
kubemaster Ready master 8d v1.16.2
例如,我将 knode01 设置为 Prod,将 knode02 设置为 Dev。
$ kubectl taint nodes knode01 key=prod:NoSchedule
$ kubectl taint nodes knode02 key=dev:NoSchedule
要将 pod 运行到这些节点中,我们必须在您的 yaml 文件的规范会话中指定一个容忍度:
apiVersion: v1
kind: Pod
metadata:
name: pod1
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key"
operator: "Equal"
value: "dev"
effect: "NoSchedule"
此 pod (pod1) 将始终在 knode02 中运行,因为它设置为 dev。如果我们想在 prod 上运行它,我们的容忍度应该是这样的:
tolerations:
- key: "key"
operator: "Equal"
value: "prod"
effect: "NoSchedule"
由于我们只有 2 个节点,并且都被指定为仅运行 prod 或 dev,如果我们尝试在不指定 tolerations 的情况下运行 pod,则 pod 将进入挂起状态:
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod0 1/1 Running 0 21m 192.168.25.156 knode01 <none> <none>
pod1 1/1 Running 0 20m 192.168.32.83 knode02 <none> <none>
pod2 1/1 Running 0 18m 192.168.25.157 knode01 <none> <none>
pod3 1/1 Running 0 17m 192.168.32.84 knode02 <none> <none>
shell-demo 0/1 Pending 0 16m <none> <none> <none> <none>
要删除污点:
$ kubectl taint nodes knode02 key:NoSchedule-