Condivisione della tecnologia

[Installazione Redis K8s] Installa il cluster Sentinel Redis nell'ambiente K8s senza PVC

2024-07-11

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

introduzione

La creazione di servizi con stato in un cluster k8 è relativamente problematica. L'attuale approccio tradizionale alla creazione di redis consiste nell'utilizzare ceph e nas di archiviazione condivisi per ottenere l'archiviazione persistente dei dati. Alcuni sono implementati utilizzando l'affinità del nodo e il percorso host. Attualmente, gli operatori utilizzano fondamentalmente la condivisione magazzinaggio. Questo articolo utilizzerà più copie ponderate dell'affinità del percorso host per creare un cluster Redis basato sull'ambiente esistente e sulle diverse esigenze per ottenere la persistenza dei dati e l'elevata disponibilità del servizio Redis.

1. Condizioni e descrizione dell'ambiente:

K8s versione k8s-1.29.4, l'ambiente è costruito in una sala computer per telecomunicazioni, con sei nodi di lavoro ciascun nodo ha un disco SSD non di sistema montato sul percorso /data/ Lo spazio di archiviazione condiviso come ceph o nas non lo è utilizzato. Al momento, redis-operator utilizza fondamentalmente l'archiviazione condivisa.

2. Descrizione dei requisiti:

  • Costruisci un cluster sentinella Redis.
  • Alta disponibilità: se un nodo k8s muore o il pod viene riavviato, l'utilizzo non sarà influenzato.
  • Prestazioni elevate: lettura e scrittura di dischi locali per ottenere prestazioni di I/O elevate. Se le risorse e le prestazioni hardware dello storage condiviso non sono sufficienti, le operazioni di I/O rappresenteranno un collo di bottiglia delle prestazioni.
  • Sicurezza dei dati: dopo uno switchover o un guasto del nodo, i dati devono essere il più completi possibile
  • Installazione semplice, facile gestione e manutenzione

3. Principi e istruzioni attuative

    1. Costruisci un cluster sentinella redis, con un master, due slave e tre processi sentinella.
    1. Redis utilizza tre statefulset indipendenti e una copia per la creazione, mentre il processo sentinella utilizza una distribuzione e tre copie per la creazione.
    1. Il processo Redis utilizza l'affinità e il peso del nodo per implementare i nodi primari e di backup.
    1. Redis utilizza il servizio headless e Sentinel utilizza il servizio service.
    1. Per un gruppo di due slave e attivi e di backup in base al peso, è necessario pianificare i nomi delle etichette di sei nodi.

Nota: i Redis creati da questa soluzione possono essere utilizzati solo all'interno del cluster k8s e non possono essere forniti per l'uso all'esterno del cluster tramite LoadBlancer o NodePort, perché l'IP dei Redis principali scelti in Sentinel è l'IP del pod Quando a si verifica il passaggio, non è possibile determinare quale sia il redis principale.

4. Passaggi dettagliati

4.1.Etichette dei nodi di pianificazione
Nome del nodoRuoloEtichetta
k8s-lavoratore-120-81ospiteselettore-di-archiviazione=nodo-a-master
k8s-lavoratore-120-82ospiteselettore-di-archiviazione=nodo-b-master
k8s-lavoratore-120-83ospiteselettore-di-archiviazione=nodo-c-master
k8s-lavoratore-120-84Preparareselettore-di-archiviazione=nodo-a-slve
k8s-lavoratore-120-85Preparareselettore-di-archiviazione=nodo-a-slve
k8s-lavoratore-120-86Preparareselettore-di-archiviazione=nodo-a-slve

Nota: la divisione dei ruoli qui si riferisce a: poiché Redis ha un master e due slave, ciascun pod Redis ricade su tre nodi master Quando il nodo master fallisce, viene commutato sul nodo di backup. Ad esempio: il nome è defaultapp- The Il pod di redis-a-0 cade sul nodo etichettato storage-selector=node-a-master per impostazione predefinita. Quando il nodo fallisce, verrà abbinato in base al peso sul nodo etichettato storage-selector=node-a-slve. sul nodo.

4.2 Creare la configurazione della mappa di configurazione

La configurazione contiene quattro file e la descrizione della distribuzione è la seguente:
sentinel.conf: file di configurazione Sentinel per impostazione predefinita, il primo statefulset viene utilizzato come redis principale e la configurazione: risolvere-hostnames supporta i nomi host.
redis-master.conf: file di configurazione redis principale, la memoria è configurata su 256 M, la porta di configurazione è 6379, la password di configurazione è redis#123 e il percorso di archiviazione è /data/redis.
redis.conf: dal file di configurazione redis, configurare la memoria su 256M, configurare la porta su 6380, configurare la password: redis#123, il percorso di archiviazione è /data/redis-2 e configurare i dati da sincronizzare dal redis principale.
run.sh: la funzione principale è determinare il ruolo per eseguire diversi file di configurazione, creare una directory in base al nome host e quindi connettersi dolcemente alla directory di archiviazione. Questo passaggio consiste principalmente nell'archiviare i dati Redis di ciascun servizio nella propria directory. Quando si crea un nuovo Redis, non causerà conflitti di directory sul 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