Задумался я тут о том, что пора превратить нашу Grafana в Grafana HA (это не ha-ha-ha classic, а Grafana High Abailability)
Кажется, что все достаточно просто, Grafana живет в k8s, проставишь в чарте
replicas: 3и дело к стороне
И сразу же начинают всплывать определенные нюансы
Основной нюанс заключается в том что наша Grafana иногда отправляет алерты которые настраивали команды разработки и если просто увеличить количество реплик с ооооочень большой вероятностью мы получим х3 алертов, что не очень весело
Отправил читать документацию, HA режим для алертов доступен и может работать как с "отдельно стоящим" Redis, так и с самой Grafana
Вариант когда инстансы Grafana синхронизируются между собой, показался более привлекательным, так как нет необходимости в доп компоненте
Конфиг для Grafana выглядит следующий образом
grafana.ini:
unified_alerting:
enabled: true
ha_listen_address: "${POD_IP}:9094"
ha_peers: "grafana-alerting.grafana:9094"
ha_advertise_address: "${POD_IP}:9094"
ha_peer_timeout: 15s
ha_reconnect_timeout: 2m
Так же нам нужен сервис, что бы Grafana`ы могли найти друг друга
apiVersion: v1
kind: Service
metadata:
name: grafana-alerting
namespace: grafana
labels:
app.kubernetes.io/name: grafana-alerting
app.kubernetes.io/part-of: grafana
spec:
type: ClusterIP
clusterIP: 'None'
ports:
- port: 9094
selector:
app.kubernetes.io/name: grafana
Благодаря этому мы получаем Grafana HA, что добавляет нам "выживаемости" в случае внештатных ситуаций с инфрой
Ну и напоследок, как сказать Grafana, что бы она расползалась по разным нодам и зонам кластера
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- grafana
topologyKey: topology.kubernetes.io/zone
- weight: 99
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- grafana
topologyKey: topology.kubernetes.io/hostname
PS - для Grafana у нас поднят отдельно стоящий кластер PG