Приведи пример настройки балансировщика нагрузки

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

Ответ

В DevOps я работаю с балансировщиками на разных уровнях. Приведу пример настройки Ingress-контроллера в Kubernetes (на примере Nginx Ingress) и конфигурации HAProxy для внутреннего трафика.

1. Балансировка на уровне Kubernetes (Nginx Ingress): Это стандартный подход для маршрутизации HTTP/HTTPS трафика к сервисам внутри кластера.

# ingress-resource.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/load-balance: "least_conn" # Алгоритм балансировки
spec:
  ingressClassName: nginx
  rules:
  - host: app.mycompany.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8080
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80

2. Балансировка TCP-трафика с HAProxy (например, для баз данных): Для внутренней балансировки, не проходящей через Ingress, часто используется HAProxy.

# /etc/haproxy/haproxy.cfg (фрагмент)
frontend db_frontend
    bind *:5432
    mode tcp
    option tcplog
    default_backend db_backend

backend db_backend
    mode tcp
    balance leastconn # Алгоритм "наименьшее количество соединений"
    option tcp-check
    server db1 10.0.1.10:5432 check maxconn 20
    server db2 10.0.1.11:5432 check maxconn 20 backup
    server db3 10.0.1.12:5432 check maxconn 20

listen stats
    bind *:1936
    mode http
    stats enable
    stats uri /
    stats hide-version
    stats auth admin:StrongPassword

Ключевые моменты из практики:

  • Health Checks: Критически важны. В Kubernetes они задаются в readinessProbe и livenessProbe пода. В HAproxy — директива check.
  • Алгоритмы: Выбор зависит от типа нагрузки. roundrobin — по умолчанию, leastconn — для длительных соединений (БД, WebSocket).
  • Мониторинг: Всегда настраиваю сбор метрик (например, haproxy_exporter для Prometheus) по rate, latency и количеству активных бэкендов.