Как равномерно распределить поды в зонах доступности?
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 пода.
Такое распределение повышает отказоустойчивость приложения, так как сбой одной зоны доступности не приведет к полной недоступности сервиса.