Taints и Tolerations

Taints и Tolerations используются в Kubernetes как один из способов управления распределением подов на узлы. Taints (ограничения) устанавливаются на узлы кластера, чтобы запретить распределения подов (Pods) на них. Для размещения подов на такие узлы, подам необходимо присвоить соответствующие Tolerations (допуски). Планировщик Kubernetes по умолчанию учитывает Taints и Tolerations при выборе узла для запуска конкретного пода.

Taints и Tolerations могут быть использованы, например, когда требуется выделить узлы кластера под определенные нагрузки. В этом случае потребуется установить на узел Taint и соответствующие Tolerations на поды.

Из графического интерфейса платформы “Штурвал” вы можете управлять Taints на узлах и Tolerations подов.

Taints

На один узел возможно добавить несколько Taints. При этом для размещения подов на таком узле, потребуются Tolerations для каждого ограничения.

Taints состоит из:

  • ключ (key) и его значение (value). Для одного узла доступно добавление одинаковых пар ключ:значение с разными Эффектами.

  • Эффект (effect), определяющего правила ограничений для размещения подов:

    1. NoSchedule - позволяет строго ограничить размещение подов. Ни один под не будет запланирован на узле без соответствующего Toleration (разрешения).
    2. PreferNoSchedule - нестрогое ограничение для размещения подов. Поды без соответствующего Toleration (разрешения) могут быть размещены на узле, однако, предпочтительнее будут поды с Tolerations.
    3. 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 на узел в графическом интерфейсе платформы “Штурвал”

  1. В кластере в разделе Администрирование откройте страницу Управления узлами и нажмите на узел, которому ходите добавить Taint.
Скриншот

taint-node

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

create-taint

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

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, выберите Эффект.

Скриншот

newtoleration newtoleration2

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

createtoleration toleration-add

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

×