Ответ
Для распределения реплик 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.