Ответ
В наших кластерах используется многоуровневая система балансировки, сочетающая Cloud Load Balancer, Ingress Controller и Service Mesh.
Архитектура балансировки:
-
Уровень 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: 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: 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 для автоматического масштабирования под нагрузкой