Работали ли вы с Toleration в Kubernetes?

«Работали ли вы с Toleration в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, активно использовал механизм Taints и Tolerations для управления размещением подов на специфичных нодах. Это критически важный инструмент для изоляции workload'ов.

Из моего опыта: Я применял Tolerations для запуска подов на выделенных нодах, например:

  1. Ноды с GPU: Для задач машинного обучения.
  2. Ноды для мониторинга: Запуск Prometheus, Grafana Agent.
  3. Изолированные ноды: Для запуска legacy-приложений с особыми требованиями к безопасности или версиям ОС.

Пример манифеста пода для ноды с GPU:

apiVersion: v1
kind: Pod
metadata:
  name: training-pod
spec:
  containers:
  - name: trainer
    image: nvidia/cuda:11.8-base
    command: ["python", "model_train.py"]
  tolerations:
  # Пода терпит (toleration) ноду с taint `gpu=true:NoSchedule`
  - key: "gpu"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"
  # Для гарантии размещения именно на GPU-ноде также нужен nodeSelector
  nodeSelector:
    accelerator: "nvidia-tesla-v100"

Важный нюанс: Toleration — это «разрешение» поду быть запланированным на «загрязненную» (tainted) ноду, но не предписание. Для гарантии размещения его всегда нужно комбинировать с nodeSelector или nodeAffinity. Также важно различать эффекты NoSchedule (новые поды не планируются) и NoExecute (существующие поды могут быть вытеснены).