2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
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.
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.
Nome del nodo | Ruolo | Etichetta |
---|---|---|
k8s-lavoratore-120-81 | ospite | selettore-di-archiviazione=nodo-a-master |
k8s-lavoratore-120-82 | ospite | selettore-di-archiviazione=nodo-b-master |
k8s-lavoratore-120-83 | ospite | selettore-di-archiviazione=nodo-c-master |
k8s-lavoratore-120-84 | Preparare | selettore-di-archiviazione=nodo-a-slve |
k8s-lavoratore-120-85 | Preparare | selettore-di-archiviazione=nodo-a-slve |
k8s-lavoratore-120-86 | Preparare | selettore-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.
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