Как реализована балансировка нагрузки в вашем Kubernetes-кластере?

«Как реализована балансировка нагрузки в вашем Kubernetes-кластере?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В наших кластерах используется многоуровневая система балансировки, сочетающая Cloud Load Balancer, Ingress Controller и Service Mesh.

Архитектура балансировки:

  1. Уровень 1: Cloud Load Balancer (L4)

    # Service типа LoadBalancer для внешнего доступа
    apiVersion: v1
    kind: Service
    metadata:
     name: api-external
     annotations:
       service.beta.kubernetes.io/aws-load-balancer-type: "nlb"  # AWS Network LB
    spec:
     type: LoadBalancer
     selector:
       app: api
     ports:
     - port: 443
       targetPort: 8443
  2. Уровень 2: Ingress Controller (L7) Мы используем NGINX Ingress Controller с кастомными конфигурациями:

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
     name: main-ingress
     annotations:
       nginx.ingress.kubernetes.io/load-balance: "ewma"  # Exponential Weighted Moving Average
       nginx.ingress.kubernetes.io/upstream-hash-by: "$http_x_user_id"  # Sticky sessions
    spec:
     ingressClassName: nginx
     rules:
     - host: api.example.com
       http:
         paths:
         - path: /
           pathType: Prefix
           backend:
             service:
               name: api-internal
               port:
                 number: 80
  3. Уровень 3: Service Mesh (Istio) Для критичных сервисов настраиваем продвинутые стратегии:

    apiVersion: networking.istio.io/v1beta1
    kind: DestinationRule
    metadata:
     name: api-dr
    spec:
     host: api-internal.default.svc.cluster.local
     trafficPolicy:
       loadBalancer:
         consistentHash:
           httpHeaderName: x-user-id
       outlierDetection:
         consecutive5xxErrors: 5
         interval: 30s
         baseEjectionTime: 30s

Мониторинг и health checks:

# Pod с проверками готовности
apiVersion: v1
kind: Pod
metadata:
  name: api-pod
spec:
  containers:
  - name: api
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
      initialDelaySeconds: 30
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /readyz
        port: 8080
      periodSeconds: 5

Важные нюансы:

  • Для stateful-приложений используем headless Services с DNS балансировкой
  • Настраиваем PodDisruptionBudgets для graceful shutdown во время обновлений
  • Используем Horizontal Pod Autoscaler для автоматического масштабирования под нагрузкой