ADG Оставить заявку
Блог Системное администрирование 5 мин чтения

Zabbix 6.4: включаем нативный HA и автообнаружение Kubernetes у клиентов

Обновляем Zabbix до 6.4 у клиентов в конце года: настраиваем нативный HA-режим сервера мониторинга и Kubernetes discovery для автоматического обнаружения узлов.

Контекст момента

Zabbix 6.4 выпущен с business service monitoring, нативным HA-режимом и интеграцией с Kubernetes, 2023

Zabbix 6.4 вышел в марте 2023-го, но активно обновлять клиентов под нашим управлением начали ближе к концу года - после того как версия отлежалась, набрала патчи и перестала удивлять неожиданными поведением в нестандартных конфигурациях. К декабрю картина достаточно понятная, чтобы написать про два конкретных кейса.

Что вообще привлекло в 6.4

Zabbix 6.4 - не LTS в классическом смысле (LTS у них 6.0), но релиз достаточно зрелый, чтобы ставить в прод. Из заявленного нас интересовали два пункта:

  • Нативный HA-режим - появился ещё в 6.2, в 6.4 доведён до вменяемого состояния. Раньше высокую доступность мониторинга строили через внешние инструменты - Corosync/Pacemaker, keepalived, ручные скрипты переключения. Теперь это встроено.
  • Kubernetes discovery - не просто шаблоны, а нативная интеграция через Zabbix Kubernetes discovery, которая умеет автоматически добавлять узлы кластера при их появлении.

Business service monitoring тоже переработали, но это история для клиентов с SOA-структурой - к нашему типичному окружению относится меньше.

HA: как выглядит на практике

У одного из клиентов Zabbix стоял в конфигурации «один сервер + внешний PostgreSQL». Отказоустойчивости на уровне сервера мониторинга не было - при падении ноды мониторинг просто останавливался до ручного вмешательства. Исторически всех это более-менее устраивало, пока инфраструктура была небольшой. Сейчас хосты под наблюдением выросли, и простой мониторинга даже на час - уже заметная проблема.

Нативный HA в Zabbix 6.4 работает через shared PostgreSQL-базу. Несколько серверных нод подключаются к одной БД, одна из них становится active, остальные - standby. Переключение при падении активной ноды происходит автоматически, без внешнего координатора.

Поднимали на двух нодах. Конфиг минимальный - в zabbix_server.conf добавляется HANodeName и NodeAddress, больше ничего особенного:

HANodeName=zabbix-node1
NodeAddress=192.168.10.11:10051

Для балансировки клиентского трафика (агенты, прокси) перед серверами поставили keepalived с виртуальным IP - сам Zabbix с этим не помогает, VIP надо делать отдельно. Это немного раздражает, потому что создаётся иллюзия «встроенного HA» при том что агентам всё равно нужен единый адрес для подключения. Но в целом схема рабочая и заметно проще, чем Pacemaker с CRM-скриптами.

Переключение между нодами проверяли принудительным выключением активной - standby подхватывала через 30-40 секунд. Для мониторинга это приемлемо: агенты буферизуют метрики локально и доотправляют после восстановления связи.

Kubernetes discovery: автообнаружение узлов

Второй кейс - клиент с Kubernetes-кластером на базе Deckhouse, про который мы писали раньше. До 6.4 мониторинг k8s-узлов у них был полуручным: добавить worker node - зайди, добавь хост в Zabbix, привяжи шаблон. Раздражало, потому что при автоскейлинге это превращается в ручную работу, которую забывают делать.

Zabbix Kubernetes discovery работает через HTTP API кластера. Нужен ServiceAccount с правами на чтение nodes, pods и endpoints:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: zabbix-monitoring
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: zabbix-monitoring-reader
rules:
  - apiGroups: [""]
    resources: ["nodes", "pods", "endpoints", "namespaces"]
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: zabbix-monitoring-reader
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: zabbix-monitoring-reader
subjects:
  - kind: ServiceAccount
    name: zabbix-monitoring
    namespace: kube-system

Токен ServiceAccount передаётся в Zabbix как макрос {$KUBE.API.TOKEN}, хост с API-endpoint кластера добавляется вручную один раз - дальше discovery создаёт прототипы хостов для каждого узла автоматически. При появлении новой ноды в кластере Zabbix обнаруживает её в рамках следующего цикла discovery (по умолчанию час, можно укоротить).

Шаблоны из коробки дают базовые метрики: состояние узлов, статус подов, использование ресурсов. Для детального мониторинга workload'ов этого мало - там нужно либо Prometheus + Grafana, либо кастомные Items через HTTP Agent. Но для «все ли узлы живы и не деградирует ли кластер» - вполне.

Одна неочевидная вещь: discovery в Zabbix создаёт хосты с именами из API кластера. Если у клиента нейминг узлов сделан через UUID или внутренние идентификаторы облачного провайдера - в интерфейсе Zabbix это выглядит неразборчиво. Пришлось настраивать alias через Inventory, чтобы в хостлисте было человеческое имя, а не ip-10-0-3-247.eu-central-1.compute.internal.

Итог декабря

На конец года несколько managed-клиентов переведены на 6.4. HA работает без нареканий - за несколько недель одно плановое переключение при обновлении ОС на активной ноде, прошло штатно. Kubernetes discovery закрыл больную точку с ручным добавлением хостов.

Обновление с 6.0 LTS прошло без сюрпризов на уровне агентов - совместимость сохранена, агенты продолжают работать без переустановки. База данных потребовала стандартного прогона скриптов миграции, ничего нетипичного.

На следующий год у ряда клиентов стоит вопрос про business service monitoring - но это уже отдельная задача со своим моделированием зависимостей. Пока смотрим, насколько новый интерфейс BSM в 6.4 вменяем для реальных сервисных карт.

Если среди клиентов на управляемой инфраструктуре есть желающие попробовать HA или Kubernetes discovery - это уже не эксперимент, конфигурация обкатана.

Контакт

Нужна такая же инженерная работа?

Опишите задачу и контекст. Ответим в течение рабочего дня, при необходимости подпишем NDA.