Можно ли разместить несколько контейнеров на нескольких воркер-нодах в Kubernetes?

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

Ответ

Да, это стандартная практика в Kubernetes для распределения нагрузки и повышения отказоустойчивости. Кластер состоит из мастер-ноды (control plane) и воркер-нод, на которых и запускаются поды с контейнерами.

Основные механизмы управления размещением:

  • Ресурсные ограничения (Requests/Limits): Оркестратор использует указанные в манифесте запросы (requests) и лимиты (limits) на CPU и память, чтобы равномерно распределять поды по нодам, избегая перегрузки.
  • Node Selector / Node Affinity: Позволяют привязать под к нодам с определенными метками (например, disk: ssd или gpu: true).
  • Pod Anti-Affinity: Критически важен для отказоустойчивости. Гарантирует, что реплики одного приложения (например, фронтенд) будут размещены на разных физических нодах.

Пример манифеста с использованием Pod Anti-Affinity:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web
            topologyKey: kubernetes.io/hostname # Размещать на разных нодах
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"

Практический опыт: При планировании важно учитывать не только CPU/RAM, но и сетевую близость (зоны доступности) и локализацию данных, если контейнеры используют PersistentVolume.