Technologieaustausch

[K8s-Installation von Redis] Installieren Sie den Redis-Sentinel-Cluster in einer K8s-Umgebung ohne PVC

2024-07-11

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

Einführung

Der Aufbau zustandsbehafteter Dienste in einem K8S-Cluster ist relativ mühsam. Der aktuelle Mainstream-Ansatz zum Erstellen von Redis besteht darin, gemeinsam genutzten Speicher (Ceph und NAS) zu verwenden, um eine dauerhafte Speicherung von Daten zu erreichen. Derzeit verwenden die Betreiber grundsätzlich Shared Lagerung. In diesem Artikel werden gewichtete Mehrfachkopien der Hostpath-Affinität verwendet, um einen Redis-Cluster basierend auf der vorhandenen Umgebung und unterschiedlichen Anforderungen zu erstellen und Datenpersistenz und hohe Verfügbarkeit des Redis-Dienstes zu erreichen.

1. Bedingungen und Umgebungsbeschreibung:

K8s-Version k8s-1.29.4, die Umgebung ist in einem Telekommunikations-Computerraum aufgebaut, mit sechs Worker-Knoten, die über einen Nicht-System-SSD-Datenträger im /data/-Pfad gemountet sind, wie z. B. Ceph oder NAS Derzeit wird kein Operator verwendet. Der Redis-Operator verwendet grundsätzlich gemeinsam genutzten Speicher.

2. Anforderungsbeschreibung:

  • Erstellen Sie einen Redis-Sentinel-Cluster.
  • Hohe Verfügbarkeit: Wenn ein k8s-Knoten ausfällt oder der Pod neu gestartet wird, hat dies keine Auswirkungen auf die Nutzung.
  • Hohe Leistung: Lesen und schreiben Sie lokale Festplatten, um leistungsstarke E/A zu erreichen. Wenn die Ressourcen und die Hardwareleistung des gemeinsam genutzten Speichers nicht ausreichen, stellt E/A einen Leistungsengpass dar.
  • Datensicherheit: Nach einem Switchover oder Knotenausfall müssen die Daten möglichst vollständig sein
  • Einfache Installation, einfache Verwaltung und Wartung

3. Umsetzungsgrundsätze und -anweisungen

    1. Erstellen Sie einen Redis-Sentinel-Cluster mit einem Master, zwei Slaves und drei Sentinel-Prozessen.
    1. Redis verwendet drei unabhängige Statefulsets und eine Kopie zum Erstellen, während der Sentinel-Prozess eine Bereitstellung und drei Kopien zum Erstellen verwendet.
    1. Der Redis-Prozess verwendet Knotenaffinität und -gewichtung, um Primär- und Backup-Knoten zu implementieren.
    1. Redis verwendet den Service-Headless-Service und Sentinel den Service-Service.
    1. Für eine Gruppe von zwei Slaves und aktiven und Backup-Slaves entsprechend der Gewichtung müssen die Labelnamen von sechs Knoten geplant werden.

Hinweis: Die mit dieser Lösung erstellten Redis können nur innerhalb des k8s-Clusters verwendet werden und können nicht über LoadBlancer oder NodePort zur Verwendung außerhalb des Clusters bereitgestellt werden, da die IP des in Sentinel gewählten Haupt-Redis die IP des Pods ist Wenn ein Wechsel auftritt, kann nicht bestimmt werden, welches der Hauptredis ist.

4. Detaillierte Schritte

4.1. Knotenbeschriftungen planen
KnotennameRolleEtikett
k8s-Arbeiter-120-81GastgeberSpeicherselektor=Knoten-A-Master
k8s-Arbeiter-120-82GastgeberSpeicherselektor=Knoten-B-Master
k8s-Arbeiter-120-83GastgeberSpeicherselektor=Knoten-C-Master
k8s-Arbeiter-120-84VorbereitenSpeicherselektor=Knoten-a-Slave
k8s-Arbeiter-120-85VorbereitenSpeicherselektor=Knoten-a-Slave
k8s-Arbeiter-120-86VorbereitenSpeicherselektor=Knoten-a-Slave

Hinweis: Die Rollenaufteilung bezieht sich hier auf: Da Redis einen Master und zwei Slaves hat, fällt jeder Redis-Pod auf drei Master-Knoten. Wenn der Master-Knoten ausfällt, wird er zum Beispiel auf den Backup-Knoten umgestellt Der Pod von redis-a-0 fällt standardmäßig auf den Knoten mit der Bezeichnung „storage-selector=node-a-master“. Wenn der Knoten ausfällt, wird er basierend auf der Gewichtung auf dem Knoten mit der Bezeichnung „storage-selector=node-a-slve“ abgeglichen . auf dem Knoten.

4.2. Configmap-Konfiguration erstellen

Die Konfiguration enthält vier Dateien und die Verteilungsbeschreibung lautet wie folgt:
sentinel.conf: Sentinel-Konfigurationsdatei. Standardmäßig wird das erste Statefulset als Haupt-Redis verwendet, und die Konfiguration „resolve-hostnames“ unterstützt Hostnamen.
redis-master.conf: Haupt-Redis-Konfigurationsdatei, der Speicher ist auf 256 MB konfiguriert, der Konfigurationsport ist 6379, das Konfigurationskennwort ist redis#123 und der Speicherpfad ist /data/redis.
redis.conf: Konfigurieren Sie in der Redis-Konfigurationsdatei den Speicher auf 256 MB, konfigurieren Sie den Port auf 6380, konfigurieren Sie das Kennwort: redis # 123, den Speicherpfad lautet /data/redis-2 und konfigurieren Sie die zu synchronisierenden Daten Hauptredis.
run.sh: Die Hauptfunktion besteht darin, die Rolle zum Ausführen verschiedener Konfigurationsdateien zu bestimmen, ein Verzeichnis basierend auf dem Hostnamen zu erstellen und dann sanft eine Verbindung zum Speicherverzeichnis herzustellen. Dieser Schritt dient hauptsächlich dazu, die Redis-Daten jedes Dienstes in einem eigenen Verzeichnis zu speichern. Beim Erstellen eines neuen Redis kommt es nicht zu Verzeichniskonflikten auf dem Knoten.

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