Можно ли в Kubernetes сделать так, чтобы Pod всегда запускался на определенной Node?

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

Ответ

Да, в Kubernetes есть несколько механизмов для привязки Pod к узлам (Node), но их использование требует обоснования.

Важно: Жёсткая привязка противоречит идеологии оркестрации (гибкость, отказоустойчивость). Её применяют для узлов со специализированным железом (GPU, SSD) или лицензионным ПО.

Способы, от простого к сложному:

  1. nodeSelector (Простой выбор по меткам):

    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
    spec:
      nodeSelector:
        accelerator: nvidia-tesla-p100 # Pod будет запланирован только на Node с этой меткой
      containers:
      - name: cuda-container
        image: nvidia/cuda

    Предварительно на нужную Node наносится метка: kubectl label nodes <node-name> accelerator=nvidia-tesla-p100.

  2. nodeAffinity (Гибкие правила сродства): Позволяет задавать мягкие (preferredDuringSchedulingIgnoredDuringExecution) и жёсткие (requiredDuringSchedulingIgnoredDuringExecution) правила.

    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: topology.kubernetes.io/zone
                operator: In
                values:
                - us-east-1a # Обязательно разместить в зоне доступности us-east-1a
  3. nodeName (Прямое указание, обходит планировщик):

    spec:
      nodeName: ip-10-0-0-101.ec2.internal

    Используйте только в крайних случаях! Если указанная Node не существует или не готова, Pod останется в статусе Pending.

  4. Pod Affinity/Anti-Affinity (Привязка Pod относительно других Pod): Можно заставить Pod запускаться на том же узле (podAffinity) или, наоборот, на другом узле (podAntiAffinity), что и другой Pod. Полезно для обеспечения высокой доступности.

Рекомендация: В production-среде предпочтительнее использовать nodeAffinity с мягкими правилами или nodeSelector в сочетании с tolerations для работы с tainted nodes, чем жёсткий nodeName.