Práctica de producción de Redis-cluster of kubernetes

Práctica de producción de Redis-cluster of kubernetes

Charla de operación y mantenimiento para principiantes de Scofield

Opción 1: personalizar el archivo yaml para instalar el clúster de redis

antecedentes


La implementación de clústeres de Redis en Kubernetes enfrenta desafíos, porque cada instancia de Redis se basa en un archivo de configuración que puede rastrear otras instancias de clúster y sus roles. Para ello, es necesario utilizar una combinación de Kubernetes StatefulSets y PersistentVolumes.
Diagrama esquemático de la arquitectura del clúster de redis:

Práctica de producción de Redis-cluster of kubernetes

Crear archivo yaml StatefulSet



---
apiVersion: v1
kind: ConfigMap
metadata:
  name: redis-cluster
data:
  update.sh: |
    #!/bin/sh
    REDIS_NODES="/data/nodes.conf"
    sed -i -e "/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/${POD_IP}/" ${REDIS_NODES}
    exec "$@"
  redis.conf: |+
    bind 0.0.0.0
    cluster-enabled yes
    cluster-require-full-coverage no
    cluster-node-timeout 30000
    cluster-config-file /data/nodes.conf
    cluster-migration-barrier 1
    appendonly yes
    protected-mode no
---
apiVersion: apps.kruise.io/v1beta1
# apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  serviceName: redis-cluster
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
      - name: redis
        image: redis:6.2.1-alpine
        ports:
        - containerPort: 6379
          name: client
        - containerPort: 16379
          name: gossip
        command: ["/conf/update.sh", "redis-server", "/conf/redis.conf"]
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        volumeMounts:
        - name: conf
          mountPath: /conf
          readOnly: false
        - name: data
          mountPath: /data
          readOnly: false
      volumes:
      - name: conf
        configMap:
          name: redis-cluster
          defaultMode: 0755
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 100Gi
      storageClassName: rbd

Notas:

clu```
ster-migration-barrera Aquellos nodos maestros que todavía tienen nodos esclavos de barrera de migración después de la asignación activarán la asignación de nodos, en lugar del nodo maestro con nodos esclavos de barrera de migración antes de que la asignación active la asignación de nodos, el valor predeterminado es 1. En el entorno de producción, se recomienda mantener el valor predeterminado
protected-mode sin parámetro para prohibir que la red externa acceda a redis. Si está habilitado, solo puede acceder a Redis a través de la IP de retroceso (127.0.0.1). red accede a redis, se informará una excepción.
apiVersion: apps.kruise.io/v1beta1 El controlador aquí usa el Advanced StatefulSet provisto por kruise. Si kruise no está instalado en el clúster, puede usar apps / v1

### 安装redis-cluster

-----

[root @ qd01-stop-k8s-master001 redis] # kubectl apply -f install-redis.yaml
configmap / redis-cluster created
statefulset.apps.kruise.io/redis-cluster created

[root @ qd01-stop-k8s-master001 redis] # kubectl get po -n op
NAME READY STATUS RESTARTS AGE
redis-cluster-0 1/1 Running 0 3m26s
redis-cluster-1 1/1 Running 0 3m14s
redis-cluster- 2 1/1 En ejecución 0 2m54s
redis-cluster-3 1/1 En ejecución 0 2m23s
redis-cluster-4 1/1 En ejecución 0 2m14s
redis-cluster-5 1/1 En ejecución 0 114s

### 创建redis-cluster service

-----

apiVersion: v1
kind: Service
metadata:
name: redis-cluster
namespace: op
spec:
type: ClusterIP
ports:

  • puerto: 6379
    targetPort: 6379
    nombre: cliente
  • puerto: 16379
    targetPort: 16379
    nombre:
    selector de chismes :
    aplicación: redis-cluster
    [root @ qd01-stop-k8s-master001 redis] # kubectl apply -f redis-svc.yml
    service / redis-cluster created
    [root @ qd01-stop -k8s-master001 redis] # kubectl get svc -n op
    NOMBRE TIPO CLUSTER-IP EXTERNAL-IP PORT (S) AGE
    redis-cluster ClusterIP 10.97.197.224 <ninguno> 6379 / TCP, 16379 / TCP 9s

Después de la prueba se puede conectar
[root @ qd01-stop-k8s-master001 redis] # telnet 10.97.197.224 6379
Intentando 10.97.197.224 ...
Conectado a 10.97.197.224. El
carácter de escape es '^]'.

### 初始化redis-cluster

-----

执行如下命令,获取到pod IP,然后使用redis-cli --cluster创建集群

[root @ qd01-stop-k8s-master001 redis] # kubectl -n op exec -it redis-cluster-0 - redis-cli --cluster create --cluster-replicas 1 $ (kubectl -n op get pods -l app = redis-cluster -o jsonpath = '{range.items [*]} {. status.podIP}: 6379 {end}')

Realizando la asignación de ranuras hash en 6 nodos ...
Master [0] -> Slots 0 - 5460
Master [1] -> Slots 5461 - 10922
Master [2] -> Slots 10923 - 16383
Añadiendo réplicas 100.88.43.67:6379 a 100.64. 147.152: 6379
Adición de réplica 100.113.170.5:6379 a 100.98.174.217:6379
Adición de réplica 100.64.147.153:6379 a 100.80.158.227:6379
M: b47b27a3dbddf3fc1370cbe14ae753f4fce20b04 100.64.147.152:6379
ranuras: [0 a 5460] (5461 slots) maestro
M : 09543217c903350e963fc4fdf4acb73f8a1b7f8b 100.98.174.217:6379
ranuras: [5.461 a 10.922] (5462 slots) maestro
M: 5389ace495b68eeac85370d6783648dff68f2fb6 100.80.158.227:6379
ranuras: [10.923-16.383] (5461 slots) maestro
S: b1f39714c006ae55b12b18e6537303d7a00e1704 100.64.147.153:6379
replica 5389ace495b68eeac85370d6783648dff68f2fb6
S: 0113f4668ec2f3ca2e9470c44bd5faab532b0936 100.88.43.67:6379
repeticiones b47b27a3dbddf3fc1370cbe14ae753f4fce20b04
S: e1e2f18ae66c79f1943390beabb59613abbad38a 100.113.170.5:6379
repeticiones 09543217c903350e963fc4fdf4acb73f8a1b7f8b
¿Puedo establecer la configuración anterior? (tipo 'sí' a aceptar): si
la configuración de nodos actualizada
Asignar una configuración época diferente a cada nodo de
envío de mensajes de la agrupación se reúnen para unirse al clúster
en espera para el clúster para unirse
..
Realizar Comprobar clúster (nodo utilizando 100.64.147.152:6379)
M : b47b27a3dbddf3fc1370cbe14ae753f4fce20b04 100.64.147.152:6379
ranuras: [0-5460] (5461 ranuras) maestro
1 réplicas adicionales (s)
S: 0113f4668ec2f3ca2e9470c44bd5faab532b0936 100.88.43.67:6379
ranuras: (0 ranuras) esclavo
repeticiones b47b27a3dbddf3fc1370cbe14ae753f4fce20b04
M: 09543217c903350e963fc4fdf4acb73f8a1b7f8b 100.98.174.217:6379
ranuras: [5461 a 10922] (5462 slots) maestro
1 réplica adicional (s)
M : 5389ace495b68eeac85370d6783648dff68f2fb6 100.80.158.227:6379
ranuras: [10923-16383] (5461 slots) maestros
1 réplica adicional (s)
S: e1e2f18ae66c79f1943390beabb59613abbad38a 100.113.170.5:6379
ranuras: (0 slots) esclavo
repeticiones 09543217c903350e963fc4fdf4acb73f8a1b7f8b
S: b1f39714c006ae55b12b18e6537303d7a00e1704 100.64.147.153:6379
ranuras: (0 ranuras) esclavo
replica 5389ace495b68eeac85370d6783648dff68f2fb6
[OK] Todos los nodos están de acuerdo con la configuración de las ranuras.
Compruebe si hay ranuras abiertas ...
Compruebe la cobertura de las ranuras ...
[OK] Todas las 16384 ranuras cubiertas.


### 验证集群信息


[root@qd01-stop-k8s-master001 redis]# kubectl -n op  exec -it redis-cluster-0 -- redis-cli cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:178
cluster_stats_messages_pong_sent:181
cluster_stats_messages_sent:359
cluster_stats_messages_ping_received:176
cluster_stats_messages_pong_received:178
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:359

[root@qd01-stop-k8s-master001 redis]# kubectl -n op  exec -it redis-cluster-0 -- redis-cli cluster nodes
0113f4668ec2f3ca2e9470c44bd5faab532b0936 100.88.43.67:6379@16379 slave b47b27a3dbddf3fc1370cbe14ae753f4fce20b04 0 1615348311156 1 connected
09543217c903350e963fc4fdf4acb73f8a1b7f8b 100.98.174.217:6379@16379 master - 0 1615348314162 2 connected 5461-10922
b47b27a3dbddf3fc1370cbe14ae753f4fce20b04 100.64.147.152:6379@16379 myself,master - 0 1615348312000 1 connected 0-5460
5389ace495b68eeac85370d6783648dff68f2fb6 100.80.158.227:6379@16379 master - 0 1615348312000 3 connected 10923-16383
e1e2f18ae66c79f1943390beabb59613abbad38a 100.113.170.5:6379@16379 slave 09543217c903350e963fc4fdf4acb73f8a1b7f8b 0 1615348313160 2 connected
b1f39714c006ae55b12b18e6537303d7a00e1704 100.64.147.153:6379@16379 slave 5389ace495b68eeac85370d6783648dff68f2fb6 0 1615348312158 3 connected

Como puede ver en la salida, el clúster tiene un total de 6 nodos, con tres maestros y tres esclavos.

Solución 2: use kubeDB para instalar redis

Instalar kubeDB


1. Instale KubeDB para
obtener la licencia de AppsCode https://license-issuer.appscode.com/
Descargue los gráficos de KubeDB https://github.com/appscode/charts/tree/master/stable/kubedb-community


[root@qd01-stop-k8s-master001 kubedb-community]# unzip kubedb-community-v0.16.2.tgz
[root@qd01-stop-k8s-master001 kubedb-community]# cd kubedb-community
[root@qd01-stop-k8s-master001 kubedb-community]# ls -al
total 96
drwxr-xr-x 4 root root   158 Mar 10 15:26 .
drwxr-xr-x 3 root root    66 Mar 10 15:24 ..
-rw-r--r-- 1 root root   351 Feb 16 09:55 Chart.yaml
drwxr-xr-x 2 root root    28 Mar 10 15:24 ci
-rw-r--r-- 1 root root   493 Feb 16 09:55 doc.yaml
-rw-r--r-- 1 root root   353 Feb 16 09:55 .helmignore
-rw-r--r-- 1 root root 24422 Feb 16 09:55 README.md
drwxr-xr-x 2 root root  4096 Mar 10 15:24 templates
-rw-r--r-- 1 root root 47437 Feb 16 09:55 values.openapiv3_schema.yaml
-rw-r--r-- 1 root root  5230 Feb 16 09:55 values.yaml

Modifique values.yaml, coloque el archivo de licencia en el directorio kubedb-community
2. Use helm para instalar


[root@qd01-stop-k8s-master001 kubedb-community]# helm install kubedb-community --namespace kube-system --set-file license=./kubedb-community-license.txt -f values.yaml  .
NAME: kubedb-community
LAST DEPLOYED: Wed Mar 10 15:38:59 2021
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To verify that KubeDB has started, run:
  kubectl get deployment --namespace kube-system -l "app.kubernetes.io/name=kubedb-community,app.kubernetes.io/instance=kubedb-community"
Now install/upgrade appscode/kubedb-catalog chart.
To install, run:
  helm install kubedb-catalog appscode/kubedb-catalog --version v0.16.2 --namespace kube-system
To upgrade, run:
  helm upgrade kubedb-catalog appscode/kubedb-catalog --version v0.16.2 --namespace kube-system

执行如下命令查看是否安装完成
[root@qd01-stop-k8s-master001 kubedb-community]# kubectl get deployment --namespace kube-system -l "app.kubernetes.io/name=kubedb-community,app.kubernetes.io/instance=kubedb-community"
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
kubedb-community   1/1     1            1           38s

等待crds注册成功
[root@qd01-stop-k8s-master001 kubedb-community]# kubectl get crds -l app.kubernetes.io/name=kubedb -w
NAME                                       CREATED AT
elasticsearches.kubedb.com                 2021-03-10T07:39:42Z
elasticsearchversions.catalog.kubedb.com   2021-03-10T07:39:45Z
etcds.kubedb.com                           2021-03-10T07:39:42Z
etcdversions.catalog.kubedb.com            2021-03-10T07:39:45Z
memcacheds.kubedb.com                      2021-03-10T07:39:43Z
memcachedversions.catalog.kubedb.com       2021-03-10T07:39:45Z
mongodbs.kubedb.com                        2021-03-10T07:39:43Z
mongodbversions.catalog.kubedb.com         2021-03-10T07:39:45Z
mysqls.kubedb.com                          2021-03-10T07:39:43Z
mysqlversions.catalog.kubedb.com           2021-03-10T07:39:46Z
perconaxtradbs.kubedb.com                  2021-03-10T07:39:43Z
perconaxtradbversions.catalog.kubedb.com   2021-03-10T07:39:46Z
pgbouncers.kubedb.com                      2021-03-10T07:39:44Z
pgbouncerversions.catalog.kubedb.com       2021-03-10T07:39:46Z
postgreses.kubedb.com                      2021-03-10T07:39:44Z
postgresversions.catalog.kubedb.com        2021-03-10T07:39:46Z
proxysqls.kubedb.com                       2021-03-10T07:39:44Z
proxysqlversions.catalog.kubedb.com        2021-03-10T07:39:46Z
redises.kubedb.com                         2021-03-10T07:39:45Z
redisversions.catalog.kubedb.com           2021-03-10T07:39:46Z

3. Instale KubeDB Catalog de la
misma manera, primero descargue https://github.com/appscode/charts/tree/master/stable/kubedb-catalog


[root@qd01-stop-k8s-master001 kubedb-catalog]# tar -zxf kubedb-catalog-v0.16.2.tgz
[root@qd01-stop-k8s-master001 kubedb-catalog]# cd kubedb-catalog
[root@qd01-stop-k8s-master001 kubedb-catalog]# ls -al
total 24
drwxr-xr-x  3 root root  148 Mar 10 15:48 .
drwxr-xr-x  3 root root   28 Mar 10 15:48 ..
-rw-r--r--  1 root root  321 Jan 26 20:08 Chart.yaml
-rw-r--r--  1 root root  467 Jan 26 20:08 doc.yaml
-rw-r--r--  1 root root  353 Jan 26 20:08 .helmignore
-rw-r--r--  1 root root 3195 Jan 26 20:08 README.md
drwxr-xr-x 12 root root  188 Mar 10 15:48 templates
-rw-r--r--  1 root root  744 Jan 26 20:08 values.openapiv3_schema.yaml
-rw-r--r--  1 root root 1070 Jan 26 20:08 values.yaml

[root@qd01-stop-k8s-master001 kubedb-catalog]# helm install kubedb-catalog --namespace kube-system -f values.yaml  .
NAME: kubedb-catalog
LAST DEPLOYED: Wed Mar 10 15:50:50 2021
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None

Instalar redis usando kubedb


1. Primero observe el diagrama oficial del ciclo de vida de redis

Práctica de producción de Redis-cluster of kubernetes

kubedb instala redis para admitir las siguientes funciones


Features    Availability
Clustering    ✓
Instant Backup    ✗
Scheduled Backup    ✗
Persistent Volume    ✓
Initialize using Snapshot    ✗
Initialize using Script    ✗
Custom Configuration    ✓
Using Custom docker image    ✓
Builtin Prometheus Discovery    ✓
Using Prometheus operator    ✓

2. Verifique la versión compatible


[root@qd01-stop-k8s-master001 kubedb-catalog]# kubectl get redisversions
NAME       VERSION   DB_IMAGE                DEPRECATED   AGE
4.0.11     4.0.11    kubedb/redis:4.0.11                  15m
4.0.6-v2   4.0.6     kubedb/redis:4.0.6-v2                15m
5.0.3-v1   5.0.3     kubedb/redis:5.0.3-v1                15m
6.0.6      6.0.6     kubedb/redis:6.0.6                   15m

3. Para editar el archivo de instalación de yaml,
consulte https://github.com/kubedb/docs/blob/v2021.01.26/docs/examples/redis/clustering/demo-1.yaml
aquí para elegir instalar 6.0 .6, my Cluster storageClassName: "rbd", modifíquelo de acuerdo con la situación real.
Si desea personalizar redis.conf, consulte https://github.com/kubedb/docs/blob/v2021.01.26/ docs / examples / redis / custom-config / redis -custom.yaml


apiVersion: kubedb.com/v1alpha2
kind: Redis
metadata:
  name: redis-cluster
  namespace: op
spec:
  version: 6.0.6
  mode: Cluster
  cluster:
    master: 3
    replicas: 1
  storageType: Durable
  storage:
    resources:
      requests:
        storage: 1Gi
    storageClassName: "rbd"
    accessModes:
      - ReadWriteOnce

Realice la instalación


[root@qd01-stop-k8s-master001 kubedb-community]# kubectl apply -f redis-cluster.yaml
redis.kubedb.com/redis-cluster created

安装完成,可以如下查看
[root@qd01-stop-k8s-master001 kubedb-community]# kubectl get rd,po -n op
NAME                             VERSION   STATUS         AGE
redis.kubedb.com/redis-cluster   6.0.6     Provisioning   6m55s

NAME                         READY   STATUS    RESTARTS   AGE
pod/redis-cluster-shard0-0   1/1     Running   0          6m54s
pod/redis-cluster-shard0-1   1/1     Running   0          6m18s
pod/redis-cluster-shard1-0   1/1     Running   0          5m38s
pod/redis-cluster-shard1-1   1/1     Running   0          5m1s
pod/redis-cluster-shard2-0   1/1     Running   0          4m30s
pod/redis-cluster-shard2-1   1/1     Running   0          4m8s

[root@qd01-stop-k8s-master001 redis]# kubectl get svc -n op
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
redis-cluster        ClusterIP   10.97.197.224   <none>        6379/TCP   5h16m
redis-cluster-pods   ClusterIP   None            <none>        6379/TCP   17m

4. Verifique el clúster


[root@qd01-stop-k8s-master001 kubedb-community]# kubectl get pods -n  op  -o jsonpath='{range.items[*]}{.metadata.name} ---------- {.status.podIP}:6379{"\t\n"}{end}' | grep redis
redis-cluster-shard0-0 ---------- 100.64.147.156:6379
redis-cluster-shard0-1 ---------- 100.98.174.218:6379
redis-cluster-shard1-0 ---------- 100.126.252.204:6379
redis-cluster-shard1-1 ---------- 100.113.170.6:6379
redis-cluster-shard2-0 ---------- 100.107.55.69:6379
redis-cluster-shard2-1 ---------- 100.78.230.4:6379

[root@qd01-stop-k8s-master001 redis]# kubectl -n op  exec -it redis-cluster-shard0-0  -- redis-cli cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:3
cluster_my_epoch:1
cluster_stats_messages_ping_sent:864
cluster_stats_messages_pong_sent:882
cluster_stats_messages_sent:1746
cluster_stats_messages_ping_received:879
cluster_stats_messages_pong_received:864
cluster_stats_messages_meet_received:3
cluster_stats_messages_received:1746

[root@qd01-stop-k8s-master001 redis]# kubectl -n op  exec -it redis-cluster-shard0-0  -- redis-cli cluster nodes
1895cb4b9c31b848666c61000e502f55a29a8255 100.64.147.155:6379@16379 master - 0 1615365162008 2 connected 5461-10922
30bdbf2ca37001774498a9b935afbc1cd2ce389c 100.126.252.203:6379@16379 slave 2c06092fafa99e0158e39e6237a04fed25be3550 0 1615365163000 1 connected
9b2cfbd5c1b417121d410141b6da9512ad29ce3c 100.78.230.3:6379@16379 slave e83446c368839c5fdccf5f70e3b1004eb67cb651 0 1615365163512 3 connected
2c06092fafa99e0158e39e6237a04fed25be3550 100.82.197.130:6379@16379 myself,master - 0 1615365162000 1 connected 0-5460
1379d2b20f26ab13d53068d276ec5d988b7a0273 100.64.122.197:6379@16379 slave 1895cb4b9c31b848666c61000e502f55a29a8255 0 1615365163000 2 connected
e83446c368839c5fdccf5f70e3b1004eb67cb651 100.107.55.68:6379@16379 master - 0 1615365164014 3 connected 10923-16383

PD: el artículo se sincronizará con dev.kubeops.net

A continuación se muestra el código QR de mi cuenta oficial, bienvenido a prestar atención.

Supongo que te gusta

Origin blog.51cto.com/15060545/2656503
Recomendado
Clasificación