Разворачивал ли отказоустойчивые конфигурации?

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

Ответ

Да, проектировал и разворачивал отказоустойчивые (High Availability, HA) конфигурации на разных уровнях стека.

1. Уровень инфраструктуры (Cloud/IaC):

  • Использовал Terraform для развертывания ресурсов в нескольких Availability Zones (AZ) у облачных провайдеров (AWS, GCP).
  • Настраивал Auto Scaling Groups с минимальным размером >1 и политиками распределения по AZ.
  • Для балансировки нагрузки использовал Application/Network Load Balancer (ALB/NLB) с health checks, направляющие трафик только на здоровые инстансы.

2. Уровень платформы (Kubernetes):

  • Распределение подов: Использовал podAntiAffinity, чтобы пода одного приложения не размещались на одной ноде.
  • Probes: Обязательно настраивал livenessProbe и readinessProbe для корректной работы механизмов самовосстановления.
  • Пример Deployment:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: api-ha
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: api
      template:
        metadata:
          labels:
            app: api
        spec:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 100
                podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - api
                  topologyKey: kubernetes.io/hostname
          containers:
          - name: api
            image: my-api:latest
            ports:
            - containerPort: 8080
            livenessProbe:
              httpGet:
                path: /healthz
                port: 8080
              initialDelaySeconds: 30
              periodSeconds: 10
            readinessProbe:
              httpGet:
                path: /ready
                port: 8080
              initialDelaySeconds: 5
              periodSeconds: 5

3. Уровень данных:

  • Для PostgreSQL разворачивал кластеры с Patroni + etcd для автоматического фейловера, или использовал облачные managed-сервисы (AWS RDS Multi-AZ).
  • Для кэша использовал Redis в режиме кластера (Redis Cluster) или Sentinel.

4. Мониторинг и оповещение:

  • Внедрял стек Prometheus + Alertmanager + Grafana. Настраивал алерты на недоступность нод, падение реплик, рост latency и ошибок 5xx.
  • Ключевые метрики: up, kube_pod_status_phase, rate(http_requests_total{status=~"5.."}[5m]).

Результат: Такие конфигурации позволяли системе сохранять работоспособность при отказе одной AZ, падении отдельных нод Kubernetes или инстансов БД, обеспечивая высокий uptime (99.9%+).