Partage de technologie

[Installation K8s Redis] Installer le cluster Redis Sentinel dans l'environnement K8s sans PVC

2024-07-11

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

Introduction

La création de services avec état dans un cluster K8s est relativement difficile. L'approche actuelle de création de Redis consiste à utiliser un stockage partagé Ceph et NAS pour obtenir un stockage persistant des données. Certains sont implémentés en utilisant l'affinité de nœud et le chemin d'hôte. stockage. Cet article utilisera plusieurs copies pondérées de l'affinité du chemin d'hôte pour créer un cluster Redis basé sur l'environnement existant et différents besoins afin d'obtenir la persistance des données et la haute disponibilité du service Redis.

1. Conditions et description de l’environnement :

Version K8s k8s-1.29.4, l'environnement est construit dans une salle informatique de télécommunications, avec six nœuds de travail. Chaque nœud dispose d'un disque SSD non système monté sur le chemin /data/, tel que ceph ou nas. utilisé. Aucun opérateur n'est utilisé à l'heure actuelle, l'opérateur redis utilise essentiellement le stockage partagé.

2. Description des exigences :

  • Créez un cluster sentinelle Redis.
  • Haute disponibilité : si un nœud k8s meurt ou si le pod est redémarré, l'utilisation ne sera pas affectée.
  • Hautes performances : lisez et écrivez des disques locaux pour obtenir des E/S hautes performances. Si les ressources et les performances matérielles du stockage partagé ne sont pas suffisantes, les E/S constitueront un goulot d'étranglement des performances.
  • Sécurité des données : Après un basculement ou une panne de nœud, les données doivent être les plus complètes possibles
  • Installation simple, gestion et maintenance faciles

3. Principes et instructions de mise en œuvre

    1. Créez un cluster sentinelle Redis, avec un maître, deux esclaves et trois processus sentinelles.
    1. Redis utilise trois statefulsets indépendants et une copie pour créer, tandis que le processus sentinelle utilise un déploiement et trois copies pour créer.
    1. Le processus Redis utilise l'affinité et le poids des nœuds pour implémenter les nœuds principaux et de sauvegarde.
    1. Redis utilise le service sans tête de service et Sentinel utilise le service de service.
    1. Pour un groupe de deux esclaves et actifs et de secours en fonction du poids, les noms d'étiquettes de six nœuds sont à prévoir.

Remarque : le redis construit par cette solution ne peut être utilisé qu'au sein du cluster k8s et ne peut pas être fourni pour une utilisation en dehors du cluster via LoadBlancer ou NodePort, car l'adresse IP du redis principal élu dans Sentinel est l'adresse IP du pod lors d'un commutateur. se produit, il est impossible de déterminer quel est le principal redis.

4. Étapes détaillées

4.1.Étiquettes des nœuds de planification
Nom du nœudRôleÉtiquette
k8s-travailleur-120-81hôtesélecteur de stockage = nœud-a-maître
k8s-travailleur-120-82hôtesélecteur de stockage = nœud-b-master
k8s-travailleur-120-83hôtesélecteur de stockage = nœud-c-master
k8s-travailleur-120-84Préparersélecteur de stockage = nœud-a-slve
k8s-travailleur-120-85Préparersélecteur de stockage = nœud-a-slve
k8s-travailleur-120-86Préparersélecteur de stockage = nœud-a-slve

Remarque : La division des rôles fait référence ici : étant donné que Redis a un maître et deux esclaves, chaque pod Redis tombe sur trois nœuds maîtres. Lorsque le nœud maître tombe en panne, il est basculé vers le nœud de sauvegarde. Par exemple : le nom est defaultapp- Le. Le pod de redis-a-0 tombe par défaut sur le nœud étiqueté storage-selector=node-a-master. Lorsque le nœud échoue, il sera mis en correspondance en fonction du poids sur le nœud étiqueté storage-selector=node-a-slve. .sur le nœud.

4.2. Créer une configuration de carte de configuration

La configuration contient quatre fichiers et la description de la distribution est la suivante :
sentinel.conf : fichier de configuration Sentinel Par défaut, le premier statefulset est utilisé comme redis principal et la configuration : solve-hostnames prend en charge les noms d'hôte.
redis-master.conf : fichier de configuration redis principal, la mémoire est configurée à 256 Mo, le port de configuration est 6379, le mot de passe de configuration est redis#123 et le chemin de stockage est /data/redis.
redis.conf : Depuis le fichier de configuration redis, configurez la mémoire sur 256 Mo, configurez le port sur 6380, configurez le mot de passe : redis#123, le chemin de stockage est /data/redis-2, et configurez les données à synchroniser depuis le redis principal.
run.sh : La fonction principale est de déterminer le rôle pour exécuter différents fichiers de configuration, de créer un répertoire basé sur le nom d'hôte, puis de se connecter en douceur au répertoire de stockage. Cette étape consiste principalement à stocker les données redis de chaque service dans son propre répertoire. Lors de la création d'un nouveau redis, cela ne provoquera pas de conflits de répertoires sur le nœud.

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