Kubernetes - запуск redis

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

Вкрат­це:

  • Replica — вклю­ча­ет в себя Redis Master, кото­рый выпол­ня­ет чте­ние-запись, и копи­ру­ет дан­ные на Redis Slaves, кото­рые обслу­жи­ва­ет запро­сы на чте­ние. При этом слей­вы могут заме­нить масте­ра, если он упадёт
  • Cluster — име­ет смысл, если у вас дан­ных боль­ше, чем памя­ти на отдель­ном сер­ве­ре. Кла­стер уме­ет Sharding, и кли­ент, запра­ши­ва­ю­щий опре­де­лён­ный ключ, будет направ­лен на ту ноду, кото­рая этот ключ хранит.

Варианты запуска Redis в Kubernetes

Что надо — это Redis с репликацией.

Как мож­но реализовать:

  • руч­ной сетап —
  • Redis Operator — redis-operator
  • Helm чарт с кла­сте­ром — https://bitnami.com/stack/redis-cluster
  • Helm чарт с обыч­ной репли­ка­ци­ей мастер-слейв — https://bitnami.com/stack/redis

 

Сна­ча­ла доба­вим поль­зо­ва­те­ля gitlab - kubernetes в кото­ром у нас будут хра­нить­ся кон­фи­ги и образа.

захо­дим под рутом и созда­ём ново­го пользователя:

далее надо задать ему пароль

выхо­дим из под рута

авто­ри­зу­ем­ся под нашим пользователем:

ука­зы­ва­ем новый пароль

нас выки­ну­ло, пароль успеш­но задан:

созда­ём новый проект:

и зада­ём SSH ключ

 

гене­рим ключ если нету:

[root@minikub ~]# ssh-keygen

и добав­ля­ем его в гитлаб

[root@minikub ~]# cat /root/.ssh/id_rsa.pub

пере­хо­дим в наш проект:

копи­ру­ем URL

и выка­чи­ва­ем:

[root@minikub ~]# git clone git@192.168.1.190:kubernetes/street-terminal.git

[root@minikub ~]# cd street-terminal/

Созда­ём namespace :

[root@minikub ~]# kubectl create namespace terminal-soft

Добав­ля­ем репо­зи­то­рий и выка­чи­ва­ем helm:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/redis
tar xvfz redis-11.0.6.tgz

выка­чи­ва­ем образа:
[root@minikub redis]# docker pull bitnami/redis:6.0.8-debian-10-r0
[root@minikub redis]# docker pull bitnami/redis-exporter:1.11.1-debian-10-r12

далее пере­те­ги­ру­ем их и доба­вим в наш гитлаб.

[root@minikub redis]# docker tag bitnami/redis:6.0.8-debian-10-r0 192.168.1.190:4567/kubernetes/street-terminal/bitnami/redis:v1

[root@minikub redis]# docker tag bitnami/redis-exporter:1.11.1-debian-10-r12 192.168.1.190:4567/kubernetes/street-terminal/bitnami/redis-exporter:v1

что­бы мож­но было залить образ в gitlab registry  надо доба­вить insecure

[root@minikub street-terminal]# cat /etc/docker/daemon.json
{ "insecure-registries":["192.168.1.190:4567"] }

[root@minikub street-terminal]# systemctl restart docker

после чего можем логи­нить­ся под нашим поль­зо­ва­те­лем kubernetes:

[root@minikub street-terminal]# docker login 192.168.1.190:4567
Username: kubernetes
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

 

и гру­зим наши образа:

[root@minikub street-terminal]# docker push 192.168.1.190:4567/kubernetes/street-terminal/bitnami/redis:v1

[root@minikub street-terminal]# docker push 192.168.1.190:4567/kubernetes/street-terminal/bitnami/redis-exporter:v1

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

 

теперь пере­хо­дим в нашу пап­ку с redis

[root@minikub street-terminal]# cd redis/

Гене­ри­ру­ем пароль с кото­рым будем подключаться:
echo -n "Asergsdg2345KHJ" | base64
Полу­ча­ем результат:
QXNlcmdzZGcyMzQ1S0hK

 

Созда­ём файл с паро­лем доступа
[root@minikub redis]# cat secret-password.yaml

[codesyntax lang="php"]

[/codesyntax]

 

Смот­рим назва­ние стор­эдж класса(у нас пред­ва­ри­тель­но постав­лен nfs-provisoner):

[root@minikub redis]# kubectl get storageclasses.storage.k8s.io

Далее дела­ем бекап

[root@minikub redis]# cp /root/street-terminal/redis/values-production.yaml /root/street-terminal/redis/values-gitlab-production.yaml

Пра­вим в пере­мен­ных сто­редж класс и дис­ко­вый объём:

[root@minikub redis]# cat /root/street-terminal/redis/values-gitlab-production.yaml | grep -iE 'storageClass|size' | grep -v '#'
storageClass: managed-nfs-storage
size: 2Gi
size: 2Gi

В этом же фай­ле пра­вим clusterDomain: cluster.local

[root@minikub redis]# cat values-gitlab-production.yaml | grep clusterDomain
clusterDomain: cluster.local

Если в кла­сте­ре сеть исполь­зу­ет­ся FLANEL то отклю­ча­ем networkPolicy
[root@minikub redis]# cat values-gitlab-production.yaml | grep -A3 networkPolicy
networkPolicy:
## Specifies whether a NetworkPolicy should be created
##
enabled: false

пра­вим име­на обра­зов вот с этого:

[codesyntax lang="php"]

[/codesyntax]

 

на это:

[codesyntax lang="php"]

[/codesyntax]

 

Так же правим
## Use password authentication
usePassword: true
existingSecret: secret-redis-terminal-soft
usePasswordFile: true

[codesyntax lang="php"]

[/codesyntax]

 

пол­но­стью файл выгля­дит сле­ду­ю­щим образом:

[root@minikub redis]# cat /root/street-terminal/redis/values-gitlab-production.yaml 

[codesyntax lang="php"]

[/codesyntax]

 

Теперь мож­но запускать:

[root@minikub redis]# kubectl apply -f secret-password.yaml

 

kubectl apply -f secret-password.yaml
helm install redis-terminal-soft --namespace terminal-soft /root/git/developer-projects/street-terminal/redis/ --values /root/git/developer-projects/street-terminal/redis/values-gitlab-production.yaml

 

Про­ве­ря­ем

 

(на более ста­рых вер­си­ях кубе­ра мож­но исполь­зо­вать команду:
kubectl run client --image=airdock/redis-client -i --tty --rm -n terminal-soft /bin/bash)

мы же запускаем:

[root@minikub redis]# kubectl run --generator=run-pod/v1 -i --tty load-generator --image=airdock/redis-client -i --rm -n terminal-soft /bin/bash

про­ве­ря­ем под­клю­че­ние с невер­ным паролем:

про­ве­ря­ем под­клю­че­ние с вер­ным паролем:

как видим при­шёл ответ PONG зна­чит redis кор­рект­но запустился

 

если не уда­ёт­ся уда­лить под­вис­шие PV мож­но использовать:

kubectl get pv | tail -n+2 | awk '{print $1}' | xargs -I{} kubectl patch pv {} -p '{"metadata":{"finalizers": null}}'

 

теперь мож­но гру­зить наш про­ект в gitlab:

[root@minikub street-terminal]# git config --global user.email "example@test.ru"
[root@minikub street-terminal]# git config --global user.name "testru"
[root@minikub street-terminal]# git add .
[root@minikub street-terminal]# git commit -m "first commit"
[root@minikub street-terminal]# git push -u origin master

как видим про­ект появился: