Redis ist eine im Arbeitsspeicher ausgeführte Open-Source-NoSQL-Datenbank, die hauptsächlich für das Caching verwendet wird. Es hat integrierte Replikation, Lua-Scripting, LRU-Bereinigung, Transaktionen, Persistenz auf dem Laufwerk und Hochverfügbarkeit.
Diese Anleitung richtet sich an Plattformadministratoren, Cloud-Architekten und Betriebsexperten, die daran interessiert sind, Redis-Cluster in Google Kubernetes Engine (GKE) bereitzustellen.
In dieser Anleitung erfahren Sie, wie Sie mit dem Spotahome Redis-Operator Redis-Cluster bereitstellen.
Der Operator ist unter Apache License 2.0 lizenziert.
Spotahome bietet folgende Vorteile:
- Eine Kubernetes-native Redis-Clusterverwaltung
- Hochverfügbarkeit von Redis Sentinel
- Nahtlose Prometheus-Integration für Beobachtbarkeit von Datenbanken
- Unterstützung für das Festlegen benutzerdefinierter Redis-Konfigurationen
Ziele
- GKE-Infrastruktur für Redis planen und bereitstellen
- Spotahome Redis-Operator bereitstellen und konfigurieren
- Redis mit dem Operator konfigurieren, um Verfügbarkeit, Sicherheit, Beobachtbarkeit und Leistung zu gewährleisten
Bereitstellungsarchitektur
In dieser Anleitung verwenden Sie den Spotahome Redis-Operator, um einen hochverfügbaren Redis-Cluster mit einem Leader-Knoten und zwei Lesereplikaten zusammen mit dem Redis Sentinel-Cluster bereitzustellen und zu konfigurieren, der aus drei Replikaten besteht.
Redis Sentinel ist ein Hochverfügbarkeits- und Monitoring-System für Open-Source-Redis-Datenbanken. Redis-Instanzen werden kontinuierlich überwacht, einschließlich des Leaders und der zugehörigen Replikate. Wenn der Leader-Knoten ausfällt, kann Sentinel eines der Replikate automatisch zum neuen Leader hochstufen, wodurch immer ein funktionierender Leader-Knoten für Datenlese- und -schreibvorgänge verfügbar ist. Wenn in einem Redis-Cluster signifikante Ereignisse auftreten, z. B. ein Leader-Fehler oder ein Failover-Ereignis, können Administratoren oder andere Systeme mit Sentinel über E-Mail oder andere Benachrichtigungsmechanismen informiert werden.
Außerdem stellen Sie einen hochverfügbaren regionalen GKE-Cluster für Redis bereit, wobei mehrere Kubernetes-Knoten über mehrere Verfügbarkeitszonen verteilt sind. Diese Konfiguration sorgt für Fehlertoleranz, Skalierbarkeit und geografische Redundanz. Damit können Rolling Updates und Wartungen durchgeführt werden, während SLAs für Verfügbarkeit und Verfügbarkeit bereitgestellt werden. Weitere Informationen finden Sie unter Regionale Cluster.
Das folgende Diagramm zeigt, wie ein Redis-Cluster auf mehreren Knoten und Zonen in einem GKE-Cluster ausgeführt wird:
Im Diagramm wird das Redis-StatefulSet auf drei Knoten in drei verschiedenen Zonen bereitgestellt. Sie steuern, wie GKE das StatefulSet für Knoten und Zonen bereitstellt. Dazu legen Sie die Regeln für Pod-Affinität und Topologieverteilung in den benutzerdefinierten RedisFailover
-Ressourcenspezifikation fest.
Wenn eine Zone gemäß der empfohlenen Konfiguration ausfällt, verschiebt GKE die Pods auf neue Knoten.
Das folgende Diagramm zeigt ein Sentinel-Deployment, das für drei Knoten in drei verschiedenen Zonen geplant wird:
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweis
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager APIs:
gcloud services enable compute.googleapis.com
iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager APIs:
gcloud services enable compute.googleapis.com
iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com -
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/storage.objectViewer, roles/container.admin, roles/iam.serviceAccountAdmin, roles/compute.admin, roles/gkebackup.admin, roles/monitoring.viewer
gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Umgebung einrichten
In dieser Anleitung verwenden Sie Cloud Shell zum Verwalten von Ressourcen, die in Google Cloud gehostet werden. Die Software, die Sie für diese Anleitung benötigen, ist in Cloud Shell vorinstalliert, einschließlich kubectl
, gcloud CLI, Helm und Terraform.
So richten Sie Ihre Umgebung mit Cloud Shell ein:
Starten Sie eine Cloud Shell-Sitzung über die Google Cloud Console. Klicken Sie dazu in der Google Cloud Console auf Cloud Shell aktivieren. Dadurch wird im unteren Bereich der Google Cloud Console eine Sitzung gestartet.
Legen Sie Umgebungsvariablen fest:
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=redis export REGION=us-central1
Ersetzen Sie
PROJECT_ID
: Ihre Google Cloud mit Ihrer Projekt-ID.Klonen Sie das GitHub-Repository:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Wechseln Sie in das Arbeitsverzeichnis:
cd kubernetes-engine-samples/databases/redis-spotahome
Clusterinfrastruktur erstellen
In diesem Abschnitt führen Sie ein Terraform-Skript aus, um einen privaten, hochverfügbaren regionalen GKE-Cluster zu erstellen. Die folgenden Schritte ermöglichen einen öffentlichen Zugriff auf die Steuerungsebene.
Sie können den Operator mit einem Standard- oder Autopilot-Cluster installieren.
Standard
Das folgende Diagramm zeigt einen privaten regionalen Standard-GKE-Cluster, der in drei verschiedenen Zonen bereitgestellt wird:
Führen Sie die folgenden Befehle in der Cloud Shell aus, um diese Infrastruktur bereitzustellen:
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=terraform/gke-standard init
terraform -chdir=terraform/gke-standard apply -var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
Geben Sie bei Aufforderung yes
ein. Es kann einige Minuten dauern, bis dieser Befehl abgeschlossen ist und der Cluster den Status „Bereit“ anzeigt.
Terraform erstellt die folgenden Ressourcen:
- Ein VPC-Netzwerk und ein privates Subnetz für die Kubernetes-Knoten
- Ein Router für den Zugriff auf das Internet über NAT
- Ein privater GKE-Cluster in der Region
us-central1
- Zwei Knotenpools mit aktiviertem Autoscaling (ein bis zwei Knoten pro Zone, mindestens ein Knoten pro Zone)
- Ein
ServiceAccount
mit Logging- und Monitoring-Berechtigungen - Backup for GKE zur Notfallwiederherstellung
- Google Cloud Managed Service for Prometheus für das Clustermonitoring
Die Ausgabe sieht in etwa so aus:
...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...
Autopilot
Das folgende Diagramm zeigt einen privaten regionalen Autopilot-GKE-Cluster:
Führen Sie die folgenden Befehle in der Cloud Shell aus, um die Infrastruktur bereitzustellen:
export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=terraform/gke-autopilot init
terraform -chdir=terraform/gke-autopilot apply -var project_id=${PROJECT_ID} \
-var region=${REGION} \
-var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
Geben Sie bei Aufforderung yes
ein. Es kann einige Minuten dauern, bis dieser Befehl abgeschlossen ist und der Cluster den Status „Bereit“ anzeigt.
Terraform erstellt die folgenden Ressourcen:
- VPC-Netzwerk und privates Subnetz für die Kubernetes-Knoten
- Ein Router für den Zugriff auf das Internet über NAT
- Ein privater GKE-Cluster in der Region
us-central1
- Ein
ServiceAccount
mit Logging- und Monitoring-Berechtigung - Google Cloud Managed Service for Prometheus für das Clustermonitoring
Die Ausgabe sieht in etwa so aus:
...
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
...
Mit dem Cluster verbinden
Konfigurieren Sie in Cloud Shell kubectl
für die Kommunikation mit dem Cluster:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --region ${REGION}
Spotahome-Operator in Ihrem Cluster bereitstellen
In diesem Abschnitt stellen Sie den Spotahome-Operator mithilfe eines Helm-Diagramms in Ihrem Kubernetes-Cluster bereit und stellen dann einen Redis-Cluster bereit.
Fügen Sie das Spotahome Redis-Operator Helm-Diagramm-Repository hinzu:
helm repo add redis-operator https://spotahome.github.io/redis-operator
Fügen Sie einen Namespace für den Spotahome-Operator und den Redis-Cluster hinzu:
kubectl create ns redis
Stellen Sie den Spotahome-Operator mit dem Helm-Befehlszeilentool bereit:
helm install redis-operator redis-operator/redis-operator --version 3.2.9 -n redis
Prüfen Sie den Bereitstellungsstatus des Spotahome-Operators mit Helm:
helm ls -n redis
Die Ausgabe sieht in etwa so aus:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION redis-operator redis 1 2023-09-12 13:21:48.179503 +0200 CEST deployed redis-operator-3.2.9 1.2.4
Redis bereitstellen
Die grundlegende Konfiguration für die Redis-Clusterinstanz umfasst die folgenden Komponenten:
- Drei Replikate von Redis-Knoten: ein Leader und zwei Lesereplikate.
- Drei Replikate von Sentinel-Knoten, die ein Quorum bilden.
- CPU-Ressourcenzuweisung einer CPU-Anfrage und zwei CPU-Limits mit 4 GB Arbeitsspeicheranfragen und Limits für Redis sowie 100 m/500 m CPU und 500 MB für Sentinel.
- Toleranzen,
nodeAffinities
undtopologySpreadConstraints
, die für jede Arbeitslast konfiguriert sind und eine ordnungsgemäße Verteilung auf Kubernetes-Knoten mithilfe ihrer jeweiligen Knotenpools und verschiedenen Verfügbarkeitszonen gewährleisten.
Diese Konfiguration stellt die minimale Einrichtung dar, die zum Erstellen eines produktionsfertigen Redis-Clusters erforderlich ist.
Einfachen Redis-Cluster erstellen
Erstellen Sie ein Secret mit Nutzeranmeldedaten:
export PASSWORD=$(openssl rand -base64 12) kubectl create secret generic my-user -n redis \ --from-literal=password="$PASSWORD"
Der Operator hat kein Feature zum Generieren von Anmeldedaten und das Datenbankpasswort sollte vorab generiert werden.
Erstellen Sie mithilfe der grundlegenden Konfiguration einen neuen Redis-Cluster:
kubectl apply -n redis -f manifests/01-basic-cluster/my-cluster.yaml
Mit diesem Befehl wird eine benutzerdefinierte
RedisFailover
-Ressource des Spotahome-Operators erstellt, der die CPU, Arbeitsspeicheranfragen und Limits angibt, und Markierungen und Affinitäten für die Verteilung der bereitgestellten Pod-Replikate auf Kubernetes-Knoten festlegt.Warten Sie einige Minuten, während Kubernetes die erforderlichen Arbeitslasten startet:
kubectl wait pods -l redisfailovers.databases.spotahome.com/name=my-cluster --for condition=Ready --timeout=300s -n redis
Prüfen Sie, ob die Redis-Arbeitslasten erstellt wurden:
kubectl get pod,svc,statefulset,deploy,pdb -n redis
Die Ausgabe sieht in etwa so aus:
NAME READY STATUS RESTARTS AGE pod/redis-operator-5dc65cb7cc-krlcs 1/1 Running 0 49m pod/rfr-my-cluster-0 2/2 Running 0 60s pod/rfr-my-cluster-1 2/2 Running 0 60s pod/rfr-my-cluster-2 2/2 Running 0 60s pod/rfs-my-cluster-8475dfd96c-h5zvw 1/1 Running 0 60s pod/rfs-my-cluster-8475dfd96c-rmh6f 1/1 Running 0 60s pod/rfs-my-cluster-8475dfd96c-shzxh 1/1 Running 0 60s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/redis-my-cluster ClusterIP 10.52.14.87 <none> 6389/TCP 55s service/redis-operator ClusterIP 10.52.13.217 <none> 9710/TCP 49m service/rfr-my-cluster ClusterIP None <none> 9121/TCP 61s service/rfs-my-cluster ClusterIP 10.52.15.197 <none> 26379/TCP 61s NAME READY AGE statefulset.apps/rfr-my-cluster 3/3 61s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/redis-operator 1/1 1 1 50m deployment.apps/rfs-my-cluster 3/3 3 3 62s NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE poddisruptionbudget.policy/rfr-my-cluster 2 N/A 1 64s poddisruptionbudget.policy/rfs-my-cluster 2 N/A 1 63s
Der Operator erstellt die folgenden Ressourcen:
- Ein Redis-StatefulSet und ein Sentinel-Deployment
- Drei Pod-Replikate für Redis
- Drei Pod-Replikate für Sentinel
- Zwei
PodDisruptionBudgets
, wobei mindestens zwei verfügbare Replikate für die Clusterkonsistenz bereitgestellt werden - Den
rfr-my-cluster
-Dienst, der Redis-Messwerte bereitstellt - Den
redis-my-cluster
-Dienst, der auf den Redis-Cluster-Leader-Knoten abzielt - Der
rfs-my-cluster
-Dienst, mit dem Clients über die Sentinels eine Verbindung zum Cluster herstellen können. Für Clientbibliotheken ist Sentinel-Unterstützung erforderlich.
Redis-Anmeldedaten teilen
Sie können Redis-Anmeldedaten mithilfe der Spotahome-Operator-Legacy-Authentifizierungsmethode für Clients freigeben.
Sie müssen ein Datenbankpasswort mit der Einstellung requirepass
verwenden. Dieses Passwort wird dann von allen Clients verwendet. Verwenden Sie zum Verwalten zusätzlicher Nutzer Redis-Befehlszeilenbefehle.
apiVersion: databases.spotahome.com/v1
kind: RedisFailover
metadata:
name: my-cluster
spec:
...
auth:
secretPath: my-user
Die Freigabe von Redis-Anmeldedaten für Clients mithilfe dieser Methode unterliegt den folgenden Einschränkungen:
- Spotahome bietet keine benutzerdefinierten Ressourcen für die Nutzerverwaltung. Sie können Anmeldedaten in Secrets speichern und in den
auth
-Spezifikationen darauf verweisen. - Es gibt keine Methode, um die Verbindungen mit der TLS-Verschlüsselung mithilfe der benutzerdefinierten Ressource zu sichern.
- Die Live-Aktualisierung von Anmeldedaten wird nicht unterstützt.
Mit Redis verbinden
Sie können einen Redis-Client bereitstellen und sich mit einem in einem Kubernetes-Secret gespeicherten Passwort authentifizieren.
Führen Sie den Client-Pod aus, um mit Ihrem Redis-Cluster zu interagieren:
kubectl apply -n redis -f manifests/02-auth/client-pod.yaml
Die Umgebungsvariable
PASS
übernimmt das Secretmy-user
aus dem Vault.Warten Sie, bis der Pod bereit ist, und stellen Sie dann eine Verbindung her:
kubectl wait pod redis-client --for=condition=Ready --timeout=300s -n redis kubectl exec -it redis-client -n redis -- /bin/bash
Prüfen Sie, ob die Verbindung funktioniert:
redis-cli -h redis-my-cluster -a $PASS --no-auth-warning SET my-key "testvalue"
Die Ausgabe sieht in etwa so aus:
OK
Rufen Sie den Wert
my-key
ab:redis-cli -h redis-my-cluster -a $PASS --no-auth-warning GET my-key
Die Ausgabe sieht in etwa so aus:
"testvalue"
Beenden Sie die Pod-Shell
exit
Informationen zum Erfassen von Messwerten für den Redis-Cluster durch Prometheus
Das folgende Diagramm zeigt, wie die Erfassung von Prometheus-Messwerten funktioniert:
Im Diagramm enthält ein privater GKE-Cluster Folgendes:
- Einen Redis-Pod, der Messwerte für den Pfad
/
und den Port9121
erfasst. - Prometheus-basierte Collectors, die die Messwerte aus dem Redis-Pod verarbeiten.
- Eine PodMonitoring-Ressource, die Messwerte an Cloud Monitoring sendet.
Google Cloud Managed Service for Prometheus unterstützt die Messwerterfassung im Prometheus-Format. Cloud Monitoring verwendet ein integriertes Dashboard für Redis-Messwerte.
Der Spotahome-Operator stellt Clustermesswerte im Prometheus-Format bereit und verwendet dabei redis_exporter als Sidecar.
Erstellen Sie die Ressource PodMonitoring, um Messwerte nach labelSelector zu extrahieren:
kubectl apply -n redis -f manifests/03-prometheus-metrics/pod-monitoring.yaml
Rufen Sie in der Google Cloud Console die GKE-Seite Cluster auf.
Im Dashboard wird die Datenaufnahmerate ungleich null angezeigt.
Rufen Sie in der Google Cloud Console die Seite Dashboards auf.
Öffnen Sie das Redis-Prometheus-Übersichts-Dashboard. Im Dashboard wird die Anzahl der Verbindungen und Schlüssel angezeigt. Es kann einige Minuten dauern, bis das Dashboard automatisch bereitgestellt wird.
Stellen Sie eine Verbindung zum Client-Pod her und bereiten Sie Variablen vor:
kubectl exec -it redis-client -n redis -- /bin/bash
Verwenden Sie das
redis-cli
-Tool, um neue Schlüssel zu erstellen.for i in {1..50}; do \ redis-cli -h redis-my-cluster -a $PASS \ --no-auth-warning SET mykey-$i "myvalue-$i"; \ done
Aktualisieren Sie die Seite und achten Sie darauf, dass die Grafiken für die Befehle pro Sekunde und die Schlüssel aktualisiert wurden, um den tatsächlichen Datenbankstatus anzuzeigen.
Beenden Sie die Pod-Shell
exit
Bereinigen
Projekt löschen
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Einzelne Ressourcen löschen
Umgebungsvariablen festlegen
export PROJECT_ID=${PROJECT_ID} export KUBERNETES_CLUSTER_PREFIX=redis export REGION=us-central1
Führen Sie den Befehl
terraform destroy
aus:export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token) terraform -chdir=terraform/FOLDER destroy -var project_id=${PROJECT_ID} \ -var region=${REGION} \ -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
Ersetzen Sie
FOLDER
durchgke-autopilot
odergke-standard
.Geben Sie bei Aufforderung
yes
ein.Alle nicht angehängten Laufwerke suchen:
export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,zone)")
Laufwerke löschen:
for i in $disk_list; do disk_name=$(echo $i| cut -d'|' -f1) disk_zone=$(echo $i| cut -d'|' -f2|sed 's|.*/||') echo "Deleting $disk_name" gcloud compute disks delete $disk_name --zone $disk_zone --quiet done
Nächste Schritte
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center