Как разграничить нагрузку в 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 эффективно распределять нагрузку и поддерживать высокую производительность.