Работа с Tolerations
Теперь, когда мы понимаем, как работают taints, давайте рассмотрим tolerations - механизм, который позволяет планировать поды на узлах с соответствующими taints.
Понимание Tolerations
Tolerations указываются в спецификациях подов и позволяют планировать поды на узлах с соответствующими taints. Toleration состоит из:
key: Соответствует ключу taint
operator: Либо Equal (соответствует ключу и значению), либо Exists (соответствует только ключу)
value: Значение для сопоставления (при использовании оператора Equal)
effect: Эффект для сопоставления или пустой для сопоставления всех эффектов
tolerationSeconds: Необязательная продолжительность, в течение которой под может оставаться на узле с соответствующим taint NoExecute
Создание пода с Tolerations
Давайте создадим под, который допускает наш taint control-plane. Сначала создадим YAML-файл для нашего пода:
nano ~/project/toleration-pod.yaml
Теперь добавьте следующее содержимое в файл:
apiVersion: v1
kind: Pod
metadata:
name: toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
Эта спецификация пода включает в себя toleration, которая соответствует taint control-plane на нашем узле. Сохраните и выйдите из файла (в nano нажмите Ctrl+O, Enter, затем Ctrl+X).
Теперь давайте создадим под:
kubectl apply -f ~/project/toleration-pod.yaml
Вы должны увидеть вывод, подобный:
pod/toleration-pod created
Давайте проверим, был ли под запланирован на нашем узле:
kubectl get pods -o wide
Пример вывода:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
toleration-pod 1/1 Running 0 12s 10.244.0.5 minikube <none> <none>
Под работает на нашем узле minikube, потому что у него есть toleration, соответствующая taint control-plane.
Тестирование с подом без Tolerations
Для сравнения давайте создадим под без tolerations:
nano ~/project/no-toleration-pod.yaml
Добавьте следующее содержимое:
apiVersion: v1
kind: Pod
metadata:
name: no-toleration-pod
spec:
containers:
- name: nginx
image: nginx:latest
Сохраните и выйдите из файла, затем создайте под:
kubectl apply -f ~/project/no-toleration-pod.yaml
Теперь давайте проверим статус пода:
kubectl get pods -o wide
Вы можете заметить, что под остается в состоянии Pending:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
no-toleration-pod 0/1 Pending 0 12s <none> <none> <none> <none>
toleration-pod 1/1 Running 0 2m 10.244.0.5 minikube <none> <none>
Давайте проверим, почему под находится в состоянии Pending:
kubectl describe pod no-toleration-pod
В разделе событий вы должны увидеть что-то вроде:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 45s default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling.
Это подтверждает, что под не может быть запланирован, потому что он не допускает taint control-plane.
Очистка
Давайте очистим поды, которые мы создали:
kubectl delete pod toleration-pod no-toleration-pod
Вы должны увидеть:
pod "toleration-pod" deleted
pod "no-toleration-pod" deleted
Поздравляем! Теперь вы понимаете, как taints и tolerations работают вместе, чтобы контролировать планирование подов в Kubernetes.