Ответ
При наличии нескольких реплик Pod, управляемых одним контроллером (например, Deployment), сервис Kubernetes обеспечивает отказоустойчивость и балансировку нагрузки. Я настраиваю это так:
Как это работает:
- Создание реплик: Deployment создает N идентичных Pods, распределяя их по нодам кластера (с учетом ограничений ресурсов и anti-affinity правил).
- Единая точка входа: Сервис (Service) типа
ClusterIPс селектором, совпадающим с лейблами Pods, создает виртуальный IP-адрес и DNS-имя внутри кластера. - Балансировка:
kube-proxyна каждой ноде настраивает правила iptables или IPVS, которые перенаправляют трафик, отправленный на ClusterIP сервиса, на один из IP-адресов бэкенд-Pods. Алгоритм по умолчанию — random с равномерным распределением.
Пример манифеста Deployment и Service:
# Deployment с 3 репликами
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: app
image: myapp:latest
ports:
- containerPort: 8080
livenessProbe: # Критично для здоровья
httpGet:
path: /health
port: 8080
readinessProbe: # Критично для балансировки
httpGet:
path: /ready
port: 8080
---
# Сервис, балансирующий трафик между Pods
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
Поведение при сбоях:
- Если Pod падает (и его
livenessProbefails), kubelet перезапускает его. - Если Pod становится неготовым (его
readinessProbefails), Service немедленно исключает его из списка эндпоинтов для балансировки. Новые запросы на него не идут. - Контроллер Deployment постоянно следит за желаемым количеством реплик. Если Pod уничтожен и не перезапускается, Deployment создаст новый Pod на другой ноде, чтобы восстановить счетчик, и Service автоматически добавит его в балансировку после успешной
readinessProbe.
Для stateful приложений (например, БД) вместо Deployment используется StatefulSet, который обеспечивает стабильные идентификаторы Pod и томов, но базовый принцип балансировки через Service остается.