Как разграничить нагрузку в Kubernetes
Эффективное распределение нагрузки в кластере Kubernetes критично для производительности и надежности. Kubernetes предоставляет встроенные средства для балансировки трафика и нагрузки между нодами и подами.
Зачем нужно распределять нагрузку
Равномерная нагрузка повышает:
- Отзывчивость системы
- Эффективность использования ресурсов
- Стабильность кластера
- Экономию затрат
1. Horizontal Pod Autoscaler (HPA)
Автоматически масштабирует поды по CPU/памяти или пользовательским метрикам.
kubectl autoscale deployment myapp --cpu-percent=50 --min=2 --max=10
Не забудьте установить metrics-server
.
2. Affinity и Anti-Affinity
Управляют размещением подов на разных нодах.
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: "kubernetes.io/hostname"
3. Topology Spread Constraints
Равномерное распределение подов по зонам/нодам.
topologySpreadConstraints:
- maxSkew: 1
topologyKey: "topology.kubernetes.io/zone"
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: myapp
4. Балансировка на уровне сервисов
Используйте ClusterIP
, NodePort
или LoadBalancer
.
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
5. Ingress-контроллеры
NGINX, Traefik и другие поддерживают маршрутизацию и балансировку.
6. Cluster Autoscaler
Масштабирует инфраструктуру под нагрузку.
Вывод
Сочетание HPA, правил affinity, spread constraints, балансировки и автоскейлинга позволяет Kubernetes эффективно распределять нагрузку и поддерживать высокую производительность.