Как добиться отказоустойчивости в Alertmanager?

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

Ответ

Чтобы сделать Alertmanager устойчивым к сбоям, я настраиваю его в режиме высокой доступности (HA). Основная идея — запустить несколько экземпляров, которые образуют кластер и совместно управляют уведомлениями.

1. Кластеризация Alertmanager: Запускаю минимум 3 экземпляра Alertmanager (например, в виде Deployment в Kubernetes). Они соединяются друг с другом через gossip-протокол, используя флаг --cluster.peer.

# Пример аргументов запуска в контейнере
args:
  - '--config.file=/etc/alertmanager/config.yml'
  - '--storage.path=/alertmanager'
  - '--cluster.advertise-address=$(POD_IP):9094'
  - '--cluster.peer=alertmanager-0.alertmanager:9094'
  - '--cluster.peer=alertmanager-1.alertmanager:9094'

Все экземпляры получают одни и те же алерты от Prometheus. Кластер сам выбирает лидера, который отвечает за отправку уведомлений, остальные реплики находятся в режиме ожидания.

2. Конфигурация Prometheus для работы с HA-кластером: В конфиге Prometheus указываю все экземпляры Alertmanager. Prometheus будет отправлять алерты на каждый из них.

# prometheus.yml
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 'alertmanager-0:9093'
          - 'alertmanager-1:9093'
          - 'alertmanager-2:9093'

3. Надежная доставка уведомлений: В конфигурации получателей настраиваю таймауты и политики повторов, чтобы временные сбои внешних систем (Slack, PagerDuty, email) не приводили к потере алертов.

receivers:
- name: 'team-slack'
  slack_configs:
  - api_url: 'https://hooks.slack.com/services/...'
    channel: '#alerts'
    http_config:
      timeout: 10s
    send_resolved: true
    retry: 3

4. Сохранение состояния: Использую PersistentVolume для хранения данных кластера (silences, notification log). Это гарантирует, что при перезапуске экземпляра не будет потеряно состояние алертов и тишины (silences).

5. Мониторинг самого Alertmanager: Настроил сбор метрик Alertmanager (например, alertmanager_notifications_failed_total, alertmanager_alerts) в Prometheus и создал алерты на его недоступность или рост ошибок отправки.