Как в Kubernetes запустить Deployment с двумя репликами, чтобы они разместились на разных рабочих узлах?

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

Ответ

Для распределения реплик Deployment по разным узлам используется Pod Anti-Affinity. Это стандартный механизм Kubernetes, в отличие от Docker Swarm, упомянутого в исходном ответе.

Полный пример манифеста:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ha
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      affinity:
        # Анти-сродство (Anti-Affinity) для подов
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - nginx
              topologyKey: "kubernetes.io/hostname"
      containers:
        - name: nginx
          image: nginx:stable-alpine
          ports:
            - containerPort: 80

Пояснение: Правило podAntiAffinity запрещает планировщику Kubernetes размещать поды с меткой app: nginx на одном и том же узле (значение topologyKey "kubernetes.io/hostname" уникально для каждого узла).

Проверка размещения: После применения манифеста выполните:

kubectl get pods -l app=nginx -o wide

В выводе колонка NODE должна показывать разные имена узлов для каждой реплики.

Важное условие: В кластере должно быть как минимум два рабочих узла, готовых принять эти поды (с учетом taints, tolerations и ресурсов). Если узлов недостаточно, одна из реплик останется в состоянии Pending.