Чтобы выполнить то, что вам нужно, в основном вы должны использовать taint . Предположим, у вас есть кластер Kubernetes с одним главным и двумя рабочими узлами:
$ 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, если мы пытаемся запустить модуль безс указанием допусков модуль перейдет в состояние ожидания:
$ 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-