kubernetes - run redis (Replica)

Thank you for reading this post, don't forget to subscribe!

 

Dashboard

чест­но спиз­же­но отсюда:
http://devmind.ru/k8s/razvorachivaem-ha-cluster-redis-in-kubernetes

Зада­ча: раз­вер­нуть отка­зо­устой­чи­вый экзем­пляр redis. У redis есть 2 варианта:

Replica - схе­ма master-slave. В мастер мож­но писать/читать, со слей­ва мож­но толь­ко читать. На всех нодах оди­на­ко­вые дан­ные. При паде­нии масте­ра, любой слейв смо­жет стать мастером.

Cluster- Тут все серьез­но. Кла­стер уме­ет Sharding. Годить­ся для очень боль­ших проектов.

Соби­рать будем по схе­ме Replica. За осно­ву берем гото­вый helm от Bitnami и кор­рек­ти­ру­ем настрой­ки под нас.

helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/redis
tar -xvf redis-12.8.3.tgz
cd redis/
vim values.yaml

Sentinel нам необ­хо­дим для авто­ма­ти­че­ско­го пере­клю­че­ния slave в master, при паде­нии послед­не­го. 3 ноды это мини­мум ,кото­рый нужен для кво­ру­ма sentinel.

узнать имя кла­сте­ра мож­но командой:

kubectl config view

у меня оно оста­лось по умолчанию:

ста­вим:

helm install redis-cluster redis/ -f redis/values.yaml -n redis

Дожи­да­ем­ся запус­ка подов, проверям:

В прин­ци­пе на этом все, если ваши при­ло­же­ния уме­ют рабо­тать с несколь­ки­ми нода­ми redis и опре­де­лять масте­ра. Обра­щать­ся ваши при­ло­же­ния уже могут по headless адре­сам нод

мы сде­ла­ем еди­ную точ­ку входа:

Узнать кто явля­ет­ся масте­ром, мож­но у самих нод, захо­дим в контейнер:

[root@kub-master-1 ~]# kubectl exec -ti redis-cluster-node-1 -n redis bash

и теперь опра­ши­ва­ем наши поды:

I have no name!@redis-cluster-node-1:/$ redis-cli -h redis-cluster-node-0.redis-cluster-headless -a myredispassword info Replication

как видим поды 0 и 1 явля­ют­ся слей­ва­ми теперь сде­ла­ем запрос к под 2

I have no name!@redis-cluster-node-1:/$ redis-cli -h redis-cluster-node-2.redis-cluster-headless -a myredispassword info Replication

как видим он явля­ет­ся мастером.

Для даль­ней­шей рабо­ты, за осно­ву возь­мем haproxy, кото­рый будет опра­ши­вать каж­дую из нод на пред­мет ее ста­ту­са и пере­клю­чать запро­сы на масте­ра. Кон­фиг само­го haproxy:

[root@kub-master-1 ~]# cat redis/haproxy.cfg

в этом кон­фи­ге не забы­ва­ем ука­зы­вать аутен­ти­фи­ка­ци­он­ные дан­ные а имен­но myredispassword

Зали­ва­ем его на кластер:

[root@kub-master-1 ~]# kubectl create configmap redis-haproxy-config --from-file=redis/haproxy.cfg -n redis

[root@kub-master-1 ~]# cat redis/deployment-hapr.yaml

[root@kub-master-1 ~]# cat redis/service-hapr.yaml

при­ме­ня­ем:

[root@kub-master-1 ~]# kubectl apply -f redis/deployment-hapr.yaml -f redis/service-hapr.yaml

про­ве­ря­ем:

 

если нужен будет доступ из вне кла­сте­ра то откры­ва­ем порт наружу:

[root@kub-master-1 ~]# cat redis/configmap.yaml

В нём порт в нача­ле 6379 дол­жен быть про­ки­нут наружу,
redis - это наш неймспей
redis-haproxy-balancer - это наш сервис
6379 - это порт на кото­ром слу­ша­ет сервис

при­ме­ним его:

[root@kub-master-1 ~]# kubectl apply -f redis/configmap.yaml

Пра­вим сер­вис ingress
kubectl edit service -n ingress-nginx ingress-nginx

А имен­но добав­ля­ем новый порт 6379

После это­го пра­вим deployment ingress в нашем слу­чае это daemonsets
kubectl edit daemonsets.apps -n ingress-nginx ingress-nginx-controller

Добав­ля­ем наш порт:

про­ве­рим что на вор­кер ноде (на кото­рой у нас ingress) дан­ный порт доступен:

 

Теперь при обра­ще­нии к внеш­не­му адреу 192.168.1.205:6379 нам все­гда будет отве­чать мастер-сер­вер redis:

Вре­мен­но оста­нав­ли­ва­ем теку­ще­го мастера:

redis-cli -h 192.168.1.205 -a myredispassword DEBUG sleep 300

и про­ве­рим что у нас теперь под­клю­чён­ных слей­вов - 1.

Через несколь­ко секунд нам уже отве­ча­ет дру­гой под, и сооб­ща­ет что в кла­сте­ре оста­лось лишь двое.

 

для более нагляд­ной про­вер­ке мы можем уда­лить мастер под и про­ве­рить что наш кла­стер будет досту­пен, про­ве­рим что 0 под явля­ет­ся мастером:

уда­лим его и про­ве­рим непо­сред­ствен­но по айпишнику:

[root@kub-master-1 ~]# kubectl delete pod -n redis redis-cluster-node-0

как видим всё отработало:

и после того как под под­нял­ся, его роль в кла­сте­ре ста­ла слейвом:

 

====================================================================================================

Dashboard + пароль в секретах.

 

kubectl create ns redis

helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/redis
tar -xvf redis-12.8.3.tgz

cd redis/

echo -n "password-for-redis-cluster-Asergsdg2345KHJ" | base64
cGFzc3dvcmQtZm9yLXJlZGlzLWNsdXN0ZXItQXNlcmdzZGcyMzQ1S0hK

cat secret-password.yaml

kubectl apply -f secret-password.yaml

vim values.yaml

 

В сле­ду­ю­щем фай­ле в стро­ке tcp-check send AUTH\ myredispassword\r\n нам надо ука­зать наш пароль от redis

[root@prod-vsrv-kubemaster1 redis]# cat haproxy.cfg

[root@prod-vsrv-kubemaster1 redis]# cat deployment-haproxy-redis.yaml

[root@prod-vsrv-kubemaster1 redis]# cat service-haproxy-redis.yaml

 

Всё, мож­но запускать

cd ../
helm install redis-cluster redis/ -f redis/values.yaml -n redis

[root@prod-vsrv-kubemaster1 redis]# kubectl create configmap redis-haproxy-config --from-file=redis/haproxy.cfg -n redis
[root@prod-vsrv-kubemaster1 redis]# kubectl apply -f redis/deployment-haproxy-redis.yaml -f redis/service-haproxy-redis.yaml

Посмот­реть пароль мож­но командой:
kubectl get secret --namespace redis redis-password -o jsonpath="{.data.redis-password}" | base64 --decode

Под­клю­чать­ся к сер­ви­су мож­но командой:

redis-cli -h redis-cluster -p 6379 -a $REDIS_PASSWORD # Read only operations
redis-cli -h redis-cluster -p 26379 -a $REDIS_PASSWORD # Sentinel access

Под­клю­чать­ся из вне мож­но командой:

redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD

Про­ки­ды­ва­ем порт наружу:
[root@prod-vsrv-kubemaster1 redis]# cat /root/ConfigMap.yml

 

Доступ изнут­ри будет выгля­деть вот так:

redis-cluster-headless.redis.svc.test.local:6379

 

теперь поста­вим дашборд

git clone https://github.com/joeferner/redis-commander.git

нас инте­ре­су­ет:

https://github.com/joeferner/redis-commander/tree/master/k8s/helm-chart

пра­вим файл:

redis-commander/values.yaml

ука­зы­ва­ем пара­мет­ры под­клю­че­ния пароль и хост:

настра­и­ва­ем базо­вую авторизацию:

хост ingress

ну и всё уста­нав­ли­ва­ем его:
helm upgrade --install redis-web -n redis --values redis-commander/values.yaml redis-commander/