Compartir tecnología

[Instalación de K8s redis] Instale el clúster redis sentinel en el entorno k8s sin pvc

2024-07-11

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Introducción

La creación de servicios con estado en un clúster k8s es relativamente problemática. El método principal actual para crear redis es utilizar ceph y nas de almacenamiento compartido para lograr un almacenamiento persistente de datos. Algunos se implementan mediante el uso de afinidad de nodo y ruta de host. almacenamiento. Este artículo utilizará múltiples copias ponderadas de la afinidad de ruta de host para construir un clúster de Redis basado en el entorno existente y las diferentes necesidades para lograr la persistencia de los datos y la alta disponibilidad del servicio de Redis.

1. Condiciones y descripción del entorno:

K8s versión k8s-1.29.4, el entorno está construido en una sala de computadoras de telecomunicaciones, con seis nodos trabajadores, cada nodo tiene un disco SSD que no es del sistema montado en la ruta /data/. No hay almacenamiento compartido como ceph o nas. No se utiliza ningún operador. En la actualidad, redis-operator básicamente utiliza almacenamiento compartido.

2. Descripción de requisitos:

  • Cree un clúster centinela de Redis.
  • Alta disponibilidad: si un nodo k8s muere o se reinicia el pod, el uso no se verá afectado.
  • Alto rendimiento: lea y escriba discos locales para lograr IO de alto rendimiento. Si los recursos y el rendimiento del hardware del almacenamiento compartido no son suficientes, IO será un cuello de botella en el rendimiento.
  • Seguridad de los datos: después de una conmutación o un fallo de nodo, los datos deben ser lo más completos posible
  • Instalación sencilla, fácil gestión y mantenimiento.

3. Principios e instrucciones de implementación.

    1. Cree un clúster centinela de Redis, con un maestro, dos esclavos y tres procesos centinela.
    1. Redis utiliza tres conjuntos de estado independientes y una copia para compilar, mientras que el proceso centinela utiliza una implementación y tres copias para compilar.
    1. El proceso de Redis utiliza la afinidad y el peso de los nodos para implementar los nodos primarios y de respaldo.
    1. Redis utiliza el servicio sin cabeza y Sentinel utiliza el servicio.
    1. Para un grupo de dos esclavos y activos y de respaldo según el peso, se deben planificar los nombres de las etiquetas de seis nodos.

Nota: El redis creado por esta solución solo se puede usar dentro del clúster k8s y no se puede proporcionar para su uso fuera del clúster a través de LoadBlancer o NodePort, porque la IP del redis principal elegido en Sentinel es la IP del pod. Se produce el cambio, no se puede determinar cuál es el redis principal.

4. Pasos detallados

4.1.Planificación de etiquetas de nodos
Nombre del nodoRoleEtiqueta
trabajador k8s-120-81anfitriónselector-de-almacenamiento=nodo-a-maestro
trabajador k8s-120-82anfitriónselector de almacenamiento=nodo-b-master
trabajador k8s-120-83anfitriónselector de almacenamiento=nodo-c-master
trabajador k8s-120-84Prepararselector-de-almacenamiento=nodo-a-slve
trabajador k8s-120-85Prepararselector-de-almacenamiento=nodo-a-slve
trabajador k8s-120-86Prepararselector-de-almacenamiento=nodo-a-slve

Nota: La división de roles aquí se refiere a: Dado que Redis tiene un maestro y dos esclavos, cada pod de Redis recae en tres nodos maestros. Cuando el nodo maestro falla, se cambia al nodo de respaldo. Por ejemplo: el nombre es defaultapp- El. El pod de redis-a-0 cae en el nodo etiquetado Storage-selector=node-a-master de forma predeterminada. Cuando el nodo falla, se comparará según el peso del nodo etiquetado Storage-selector=node-a-slve. . en el nodo.

4.2. Crear configuración del mapa de configuración

La configuración contiene cuatro archivos y la descripción de la distribución es la siguiente:
sentinel.conf: archivo de configuración de Sentinel De forma predeterminada, el primer conjunto de estado se utiliza como redis principal y la configuración: resolve-hostnames admite nombres de host.
redis-master.conf: archivo de configuración principal de redis, la memoria está configurada en 256 M, el puerto de configuración es 6379, la contraseña de configuración es redis # 123 y la ruta de almacenamiento es /data/redis.
redis.conf: desde el archivo de configuración de redis, configure la memoria a 256 M, configure el puerto a 6380, configure la contraseña: redis#123, la ruta de almacenamiento es /data/redis-2 y configure los datos que se sincronizarán desde el Redis principal.
run.sh: la función principal es determinar la función para ejecutar diferentes archivos de configuración, crear un directorio basado en el nombre del host y luego conectarse suavemente al directorio de almacenamiento. Este paso es principalmente para almacenar los datos de Redis de cada servicio en su propio directorio. Al crear un nuevo Redis, no causará conflictos de directorio en el nodo.

apiVersion: v1
kind: ConfigMap
metadata:
  name: defaultapp-redis-config
  namespace: default-ns
  labels:
    appname: default-app
    app: defaultapp-redis-config
data:
  sentinel.conf: |
    sentinel monitor mymaster defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379 2
    sentinel auth-pass mymaster redis#123
    sentinel down-after-milliseconds mymaster 30000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 180000
    SENTINEL resolve-hostnames yes
    SENTINEL announce-hostnames yes
  redis-master.conf: |
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 10 60 100
    dir /data/redis
    masterauth redis#123
  redis.conf: |
    maxmemory 256mb
    requirepass redis#123
    save 3600 1 300 10 60 100
    dir /data/redis
    replicaof defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379
    masterauth redis#123
  run.sh: |
    #!/bin/sh
    role=$1
    hname=$(hostname)
    if [ $role == "master" ];then
        echo "run redis master"
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        redis-server /etc/redis/redis-master.conf
    elif [ $role == "sentinel" ];then
        echo "run redis sentinel"
        mkdir -p /etc/redis
        cp /home/redis/sentinel.conf /etc/redis/
        redis-sentinel /etc/redis/sentinel.conf
    else
        echo "run redis slave"
        [ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname
        [ -d /data ] || mkdir /data
        ln -s /home/redis/$hname /data/redis
        redis-server /etc/redis/redis.conf
    fi