Задача – запустить Redis в Kubernetes.
Используем Master-Slave репликацию и Sentinel для мониторинга и failover.
См. Redis: репликация, часть 2 — Master-Slave репликация, и Redis Sentinel.
Содержание
Redis cluster vs Redis replication
См. Redis: репликация, часть 1 — обзор. Replication vs Sharding. Sentinel vs Cluster. Топология Redis и Choose between Redis Helm Chart and Redis Cluster Helm Chart.
Вкратце:
- Replica – включает в себя Redis Master, который выполняет чтение-запись, и копирует данные на Redis Slaves, которые обслуживает запросы на чтение. При этом слейвы могут заменить мастера, если он упадёт
- Cluster – имеет смысл, если у вас данных больше, чем памяти на отдельном сервере. Кластер умеет Sharding, и клиент, запрашивающий определённый ключ, будет направлен на ту ноду, которая этот ключ хранит.
Варианты запуска Redis в Kubernetes
Что надо – это Redis с репликацией.
Как можно реализовать:
- ручной сетап – см. How to Create a Primary-Replica Redis Cluster in Kubernetes
- Redis Operator – redis-operator
- Helm чарт с кластером – https://bitnami.com/stack/redis-cluster
- Helm чарт с обычной репликацией мастер-слейв – https://bitnami.com/stack/redis
Что нам упрощает жизнь, так это то, что нам не нужна персистентность данных – наш Redis будет использоваться толкьо для хранения кеша, который при рестарте можно терять, а значит – не будет лишней головной боли с Kubernetes PersistentVolume.
Helm chart deploy
Сначала запустим все сервисы, посмотрим на них, потом перейдём к доступным опциям.
Добавляем репоизторий Bitnami:
Деплоим Redis:
Получаем пароль, который был сгенерирован во время установки чарта:
Запускаем port-forward
, что бы подключиться к поду с Redis master:
Подключаемся:
“It works!” (с)
Проверяем сеть:
NodePort
, а нам требуется LoadBalancer
.
Кроме того – нам требуется Redis Sentinel, а по дефолту он:
sentinel.enabled |
Enable sentinel containers | false |
Окей, переходим к опциям – включим Sentinel и LoadBalancer.
Redis Options
Что нам потребуется из опций:
- global.redis.password
- metrics:
- metrics.enabled
- metrics.serviceMonitor.enabled
- metrics.serviceMonitor.namespace
- Persiste:
- master.persistence.enabled
- slave.persistence.enabled
- Service
- master.service.type
- master.service.annotations
- slave.service.type
- slave.service.annotations
- Sentinel
- sentinel.enabled
- sentinel.service.type – need for LBso clients can ask for Master/Slaves
- sentinel.service.annotations
Создаём файл с параметрами ~/Temp/redis-opts.yaml
:
global: redis: password: "blablacar" metrics: enabled: true serviceMonitor: enabled: true namespace: "monitoring" master: persistence: enabled: false service: type: LoadBalancer annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internal slave: persistence: enabled: false service: type: LoadBalancer annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internal sentinel: enabled: true service: type: LoadBalancer annotations: kubernetes.io/ingress.class: alb alb.ingress.kubernetes.io/scheme: internal
Обновляем деплоймет, через -f
указываем файл с параметрами:
Проверим пароль:
Лоад-балансеры:
Коннект:
Работает.
Но почему LoadBalancer публичный, если указывали тип internal?
А потому что аннотация alb.ingress.kubernetes.io/scheme: internal
– для ALB Ingress Controller, а мы создаём простой Kubernetes Service с типом LoadBalancer
, который создаёт AWS Classic Load Balancer.
Читаем доку https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer, обновим аннотации: вместо “alb.ingress.kubernetes.io/scheme: internal
” – указываем “service.beta.kubernetes.io/aws-load-balancer-internal: "true"
“:
... master: service: type: LoadBalancer annotations: service.beta.kubernetes.io/aws-load-balancer-internal: "true" slave: service: type: LoadBalancer annotations: service.beta.kubernetes.io/aws-load-balancer-internal: "true" sentinel: enabled: true service: type: LoadBalancer annotations: service.beta.kubernetes.io/aws-load-balancer-internal: "true"
Обновляекм, проверяем:
Проверим запись данных – должен пойти через Master-инстанс:
Чтение данных:
Статус репликации:
И статус Sentinel:
Хотя вообще, запись на Мастер должна выполняться через получения адреса Мастера у одного из Сентинелов:
См. документацию тут>>>.
Готово.