Taints и Tolerations
Taints и Tolerations используются в Kubernetes как один из способов управления распределением подов на узлы. Taints (ограничения) устанавливаются на узлы кластера, чтобы запретить распределения подов (Pods) на них. Для размещения подов на такие узлы, подам необходимо присвоить соответствующие Tolerations (допуски). Планировщик Kubernetes по умолчанию учитывает Taints и Tolerations при выборе узла для запуска конкретного пода.
Taints и Tolerations могут быть использованы, например, когда требуется выделить узлы кластера под определенные нагрузки. В этом случае потребуется установить на узел Taint и соответствующие Tolerations на поды.
Из графического интерфейса платформы “Штурвал” вы можете управлять Taints на узлах и Tolerations подов.
Taints
На один узел возможно добавить несколько Taints. При этом для размещения подов на таком узле, потребуются Tolerations для каждого ограничения.
Taints состоит из:
-
ключ (key) и его значение (value). Для одного узла доступно добавление одинаковых пар ключ:значение с разными Эффектами.
-
Эффект (effect), определяющего правила ограничений для размещения подов:
- NoSchedule - позволяет строго ограничить размещение подов. Ни один под не будет запланирован на узле без соответствующего Toleration (разрешения).
- PreferNoSchedule - нестрогое ограничение для размещения подов. Поды без соответствующего Toleration (разрешения) могут быть размещены на узле, однако, предпочтительнее будут поды с Tolerations.
- NoExecute - позволяет вытеснять уже работающие поды на узле. Когда применяется Taint c Эффектом NoExecute, то:
- Поды без соответствующего Toleration немедленно вытесняются.
- Поды с соответствующим Toleration остаются на узле.
- Поды с соответствующим Toleration и заданным периодом разрешения (tolerationSeconds) остаются на узле в течении указанного времени, после чего вытесняются. По умолчанию tolerationSeconds равен 5 минутам.
Taints, устанавливаемые автоматически на узел при выполнении определенных условий
| Taint | Описание | Эффект |
|---|---|---|
| node.kubernetes.io/not-ready | Узел не готов. Соответствует значению NodeCondition.Ready: False | NoExecute |
| node.kubernetes.io/unreachable | Узел недоступен. Соответствует значению NodeCondition.Ready: Unknown | NoExecute |
| node.kubernetes.io/memory-pressure | На узле недостаточно памяти | NoSchedule |
| node.kubernetes.io/disk-pressure | На узле достигнут лимит дискового пространства | NoSchedule |
| node.kubernetes.io/pid-pressure | На узле достигнут лимит процессов (PID) | NoSchedule |
| node.kubernetes.io/network-unavailable | Сеть узла недоступна | NoSchedule |
| node.kubernetes.io/unschedulable | Узел не подлежит планированию | NoSchedule |
| node.cloudprovider.kubernetes.io/uninitialized | Непригодный к использованию. Устанавливается при запуске с облачным провайдером до инициализации узла cloud-controller-manager | NoSchedule |
Пример установки Taints на узел в графическом интерфейсе платформы “Штурвал”
- В кластере в разделе Администрирование откройте страницу Управления узлами и нажмите на узел, которому ходите добавить Taint.
Скриншот

- На странице узла перейдите на вкладку Taint и нажмите +. Задайте Ключ и выберите Эффект. При необходимости укажите значение и нажмите Добавить.
Скриншот

- Когда все необходимые Taints добавлены, нажмите Сохранить.
Скриншот

Когда на узле несколько Taints с разными Эффектами
- Если у пода есть Tolerations ко всем Taint-ам, кроме Taint-а с эффектом NoSchedule, то под не будет запланирован на этот узел.
- Если у пода нет Toleration, соответствующего только Taint-у с эффектом PreferNoSchedule (к остальным Taints есть Tolerations), то возможно под будет размещен на узле.
- Если у пода нет Toleration, соответствующего Taint-у с эффектом NoExecute (к остальным Taints есть Tolerations), то такой под будет вытеснен с узла (если уже запущен на узле) и не будет запланирован на узле (если еще не запущен).
Tolerations
Чтобы снять ограничение на размещение пода на узле с Taint, укажите в Tolerations:
- Ключ Taint узла (key). Если необходимо, чтобы Toleration распространялся на любые ключи Taints узлов, то ключ должен быть пустым, должен быть установлен оператор Exists и указан соответствующий Эффект Taint узла;
- Значение Taint узла (value). Если значение не будет указано, Toleration распространяется на любые значения Taints узла;
- Оператор: Exists (существование), Equal (равенство). Exists указывается, когда необходимо соответствие по ключу Taint узла. Если требуется, чтобы значение соответствовало значению Taint узлов, должно быть установлен Equal.
- Эффект Taint узла: NoSchedule, PreferNoSchedule NoExecute. Отсутствие Эффекта соответствует выбору всех эффектов с указанным ключом.
Пример Tolerations пода
tolerations:
- key: "key1"
operator: "Exists"
effect: "NoSchedule"
- key: "key2"
operator: "Equal"
value: "value2"
effect: "NoSchedule"
При необходимости вытеснения подов с узла добавляется Taint c Эффектом NoExecute. Например, этот эффект по умолчанию добавляется при недоступности узла. В этом случае по умолчанию в течение 5 минут удаляются все поды с узла.
Возможно увеличить этот период, чтобы сохранить поды на узле до его восстановления. Для этого в Tolerations добавляется tolerationSeconds.
Пример Toleration c установленным периодом размещения подов до вытеснения с узла
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoExecute"
tolerationSeconds: 6000
Пример установки Tolerations поду в графическом интерфейсе платформы “Штурвал”
В неймспейсе кластера в разделе Нагрузки перейдите на страницу нагрузки, например, Deployment, нажмите Добавить Deployment. В блоке Шаблон пода найдите Tolerations и нажмите +. Задайте ключ и значение taint, которому должен соответствовать Toleration, выберите Эффект.
Скриншот

Скриншот добавления Tolerations в ранее созданный Deployment

При создании любого вида нагрузки есть возможность добавить Tolerations.