Назад к вопросам
Middle
69
questionbank

Как равномерно распределить поды в зонах доступности?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Использовать topologySpreadConstraints в манифесте пода или развертывания.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 9
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: my-app:latest
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone # Ключ, определяющий область распространения (зона доступности)
        whenUnsatisfiable: DoNotSchedule # Если распределение невозможно, под не будет планироваться
        labelSelector:
          matchLabels:
            app: my-app # Сonstrain применяется к подам с этим лейблом

maxSkew определяет максимальное количество подов, которым разрешено превышать среднее количество подов в любом домене топологии (зоне доступности). В данном случае maxSkew: 1 означает, что разница в количестве подов между любой парой зон доступности не превысит 1.

topologyKey: topology.kubernetes.io/zone указывает, что распределение должно быть выполнено на основе меток зон доступности узлов.

whenUnsatisfiable: DoNotSchedule означает, что если планировщик не может удовлетворить ограничение topologySpreadConstraints, под не будет запланирован. Другой вариант - ScheduleAnyway, который попытается запланировать под, но может нарушить ограничение.

labelSelector определяет набор подов, к которым применяется это ограничение.

Для равномерного распределения подов по трем зонам (например, us-east-1a, us-east-1b, us-east-1c) с 9 репликами, каждый Zone получит по 3 пода.

Такое распределение повышает отказоустойчивость приложения, так как сбой одной зоны доступности не приведет к полной недоступности сервиса.