2024-07-11
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
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.
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.
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.
Knotenname | Rolle | Etikett |
---|---|---|
k8s-Arbeiter-120-81 | Gastgeber | Speicherselektor=Knoten-A-Master |
k8s-Arbeiter-120-82 | Gastgeber | Speicherselektor=Knoten-B-Master |
k8s-Arbeiter-120-83 | Gastgeber | Speicherselektor=Knoten-C-Master |
k8s-Arbeiter-120-84 | Vorbereiten | Speicherselektor=Knoten-a-Slave |
k8s-Arbeiter-120-85 | Vorbereiten | Speicherselektor=Knoten-a-Slave |
k8s-Arbeiter-120-86 | Vorbereiten | Speicherselektor=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.
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