Redis mit Spotahome auf GKE bereitstellen


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

Lernziele

  • 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. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

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.

Hinweise

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Installieren Sie die Google Cloud CLI.
  3. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  4. 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.

  5. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  6. Aktivieren Sie die 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
  7. Installieren Sie die Google Cloud CLI.
  8. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  9. 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.

  10. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  11. Aktivieren Sie die 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
  12. Gewähren Sie Ihrem Google-Konto Rollen. Führen Sie den folgenden Befehl für jede der folgenden IAM-Rollen einmal aus: 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:EMAIL_ADDRESS" --role=ROLE
    • Ersetzen Sie PROJECT_ID durch Ihre Projekt-ID.
    • Ersetzen Sie EMAIL_ADDRESS durch Ihre E-Mail-Adresse.
    • Ersetzen Sie ROLE durch jede einzelne Rolle.

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:

  1. Starten Sie eine Cloud Shell-Sitzung über die Google Cloud Console. Klicken Sie dazu in der Google Cloud Console auf Symbol für die Cloud Shell-Aktivierung Cloud Shell aktivieren. Dadurch wird im unteren Bereich der Google Cloud Console eine Sitzung gestartet.

  2. 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.

  3. Klonen Sie das GitHub-Repository:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 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.

  1. Fügen Sie das Spotahome Redis-Operator Helm-Diagramm-Repository hinzu:

    helm repo add redis-operator https://spotahome.github.io/redis-operator
    
  2. Fügen Sie einen Namespace für den Spotahome-Operator und den Redis-Cluster hinzu:

    kubectl create ns redis
    
  3. Stellen Sie den Spotahome-Operator mit dem Helm-Befehlszeilentool bereit:

    helm install redis-operator redis-operator/redis-operator --version 3.2.9 -n redis
    
  4. 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 und topologySpreadConstraints, 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

  1. 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.

  2. 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.

  3. 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
    
  4. 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.

  1. 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 Secret my-user aus dem Vault.

  2. 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
    
  3. 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
    
  4. 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"
    
  5. 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 Port 9121 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.

  1. Erstellen Sie die Ressource PodMonitoring, um Messwerte nach labelSelector zu extrahieren:

    kubectl apply -n redis -f manifests/03-prometheus-metrics/pod-monitoring.yaml
    
  2. Rufen Sie in der Google Cloud Console die GKE-Seite Cluster auf.

    Zum GKE-Cluster-Dashboard

    Im Dashboard wird die Datenaufnahmerate ungleich null angezeigt.

  3. Rufen Sie in der Google Cloud Console die Seite Dashboards auf.

    Dashboards aufrufen

  4. Ö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.

  5. Stellen Sie eine Verbindung zum Client-Pod her und bereiten Sie Variablen vor:

    kubectl exec -it redis-client -n redis -- /bin/bash
    
  6. 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
    
  7. 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.

  8. Beenden Sie die Pod-Shell

    exit
    

Bereinigen

Projekt löschen

    Google Cloud-Projekt löschen:

    gcloud projects delete PROJECT_ID

Einzelne Ressourcen löschen

  1. Umgebungsvariablen festlegen

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=redis
    export REGION=us-central1
    
  2. 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 durch gke-autopilot oder gke-standard.

    Geben Sie bei Aufforderung yes ein.

  3. 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)")
    
  4. 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