Что управляет перемещением подов (pods) между узлами (nodes) в Kubernetes?

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

Ответ

Первоначальное размещение пода на узле управляется компонентом kube-scheduler. Он отвечает за автоматический выбор подходящего узла для каждого нового пода, учитывая:

  • Ресурсные требования и ограничения (requests/limits для CPU, памяти).
  • Политики размещения: affinity/anti-affinity (притяжение/отталкивание подов друг от друга или от узлов), taints и tolerations ("загрязнения" узлов).
  • Топологию распределения (например, распределение по зонам доступности).

Пример правила nodeAffinity для размещения на узлах с SSD:

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - ssd

Перемещение уже работающих подов (эвакуация) — это отдельный процесс, которым напрямую управляет не scheduler, а администратор или система. Основные инструменты:

  • kubectl drain <node-name>: Безопасно удаляет все поды с узла, перенаправляя их на другие узлы (для контроллеров с репликами, например, Deployment).
  • kubectl cordon <node-name>: Помечает узел как недоступный для планирования новых подов.
  • kubectl delete pod <pod-name>: Принадлежащий ReplicaSet или Deployment под будет автоматически пересоздан на другом узле.
  • Cluster Autoscaler: Может инициировать перемещение подов при масштабировании кластера вниз.
  • DaemonSet: Поды, управляемые DaemonSet, будут автоматически перезапущены на новом узле, если старый узел выходит из строя.