Очень люблю чарты от Bitnami, хорошо написаны и довольно стабильны. Среди прочего, всегда ставлю Redis из их чарта. Всё бы хорошо, когда тебе нужен просто Redis без всякого там High Availability, но так бывает не всегда.
В чём сложность поднять Redis HA?
Тут дело в том, что драйверы подключения к Redis в сервисах-клиентах должны поддерживать Redis Sentinel. Когда мы поднимаем кластер с Redis, так же поднимается по контейнеру с Sentinel - это своего рода контроллер для кластера, который сделает замену мастера если текущий пропадёт. Очень похоже на Mongo Arbiter. Так вот механизм подключения из-за этого самого Sentinel меняется.
Подключаемся к Sentinel
Запрашиваем адрес мастера
Подключаемся к мастеру
Если мастер недоступен - опять идём к Sentinel
Очень часто приложения такое не поддерживают. Что же делать в таком случае? Я решил что мне поможет, как всегда, инкостыляция.
Ниже представлен фрагмент values.yaml, с которыми я запускаю bitnami/redis используя Helmfile.
Что там происходит?
Среди прочего, я создаю дополнительный sidecar контейнер, который каждые N секунд запрашивает у Sentinel адрес мастера и если он отличается от такового в созданном Service типа ExternalName - обновляет сервис. Таким образом, мы можем просто направить приложения, которые с Sentinel не умеют общаться, на этот сервис и всё будет работать, так как сервис всегда будет указывать на правильный под.
Потребляет такой sidecar контейнер ~65 mCPU и 1 MiB. Можно конечно собрать образ и включить туда redis-cli чтобы подключаться напрямую, но неохота поддерживать и хранить этот образ, обновлять его.