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