2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
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é.
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.
Nom du nœud | Rôle | Étiquette |
---|---|---|
k8s-travailleur-120-81 | hôte | sélecteur de stockage = nœud-a-maître |
k8s-travailleur-120-82 | hôte | sélecteur de stockage = nœud-b-master |
k8s-travailleur-120-83 | hôte | sélecteur de stockage = nœud-c-master |
k8s-travailleur-120-84 | Préparer | sélecteur de stockage = nœud-a-slve |
k8s-travailleur-120-85 | Préparer | sélecteur de stockage = nœud-a-slve |
k8s-travailleur-120-86 | Préparer | sé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.
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