Eseguire il deployment di Redis in GKE utilizzando Spotahome


Redis è un database NoSQL in memoria open source utilizzato principalmente per la memorizzazione nella cache. Include replica integrata, scripting Lua, eliminazione LRU, transazioni, persistenza su disco e alta disponibilità.

Questa guida è rivolta agli amministratori di piattaforma, ai Cloud Architect e ai professionisti operativi interessati al deployment di cluster Redis su Google Kubernetes Engine (GKE).

La guida mostra come utilizzare l'operatore Spotify Redis per eseguire il deployment dei cluster Redis.

L'operatore ha una licenza in base alla licenza Apache 2.0.

Spotahome offre i seguenti vantaggi:

  • Gestione dei cluster Redis nativi di Kubernetes
  • Alta disponibilità fornita da Redis Sentinel
  • Integrazione perfetta con Prometheus per l'osservabilità del database
  • Supporto per l'impostazione di configurazioni Redis personalizzate

Obiettivi

  • Pianifica ed esegui il deployment dell'infrastruttura GKE per Redis
  • Deployment e configurazione dell'operatore Spotahome Redis
  • Configura Redis utilizzando l'operatore per garantire disponibilità, sicurezza, osservabilità e prestazioni

Architettura di deployment

In questo tutorial utilizzerai l'operatore Spotahome Redis per eseguire il deployment e configurare un cluster Redis ad alta disponibilità in GKE con un nodo leader e due repliche di lettura, insieme al cluster Sentinel Redis composto da tre repliche.

Redis Sentinel è un sistema ad alta disponibilità e di monitoraggio per Redis open source. Monitora costantemente le istanze Redis, incluso il leader e le repliche associate. In caso di errore del nodo leader, Sentinel può promuovere automaticamente una delle repliche affinché diventi il nuovo leader, garantendo che sia sempre disponibile un nodo leader funzionante per le letture e le scritture dei dati. Quando si verificano eventi significativi in un cluster Redis, ad esempio un errore della variante principale o un evento di failover, Sentinel può inviare notifiche agli amministratori o ad altri sistemi tramite email o altri meccanismi di notifica.

Esegui anche il deployment di un cluster GKE regionale a disponibilità elevata per Redis, con più nodi Kubernetes distribuiti in diverse zone di disponibilità. Questa configurazione aiuta a garantire tolleranza di errore, scalabilità e ridondanza geografica. Consente aggiornamenti e manutenzione in sequenza, fornendo al contempo SLA (accordi sul livello del servizio) per uptime e disponibilità. Per ulteriori informazioni, consulta la sezione Cluster a livello di regione.

Il seguente diagramma mostra come un cluster Redis viene eseguito su più nodi e zone in un cluster GKE:

Nel diagramma, il deployment dello StatefulSet Redis viene eseguito in tre nodi in tre diverse zone. Puoi controllare il modo in cui GKE esegue il deployment dello StatefulSet su nodi e zone impostando regole di affinità e di diffusione della topologia dei pod sulla specifica delle risorse personalizzate RedisFailover.

Se si verifica un errore in una zona, utilizzando la configurazione consigliata, GKE ripianifica i pod su nuovi nodi.

Il seguente diagramma mostra un deployment Sentinel pianificato su tre nodi in tre diverse zone:

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Installa Google Cloud CLI.
  3. Per initialize gcloud CLI, esegui questo comando:

    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. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Abilita le API Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager.

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  7. Installa Google Cloud CLI.
  8. Per initialize gcloud CLI, esegui questo comando:

    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. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  11. Abilita le API Compute Engine, IAM, GKE, Backup for GKE, and Resource Manager.

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  12. Concedi i ruoli al tuo Account Google. Esegui questo comando una volta per ciascuno dei seguenti ruoli IAM: 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
    • Sostituisci PROJECT_ID con l'ID progetto.
    • Sostituisci EMAIL_ADDRESS con il tuo indirizzo email.
    • Sostituisci ROLE con ogni singolo ruolo.

Configura l'ambiente

In questo tutorial utilizzerai Cloud Shell per gestire le risorse ospitate su Google Cloud. Il software necessario per questo tutorial è preinstallato in Cloud Shell, tra cui kubectl, gcloud CLI, Helm e Terraform.

Per configurare il tuo ambiente con Cloud Shell, segui questi passaggi:

  1. Avvia una sessione di Cloud Shell dalla console Google Cloud, facendo clic su Icona di attivazione di Cloud Shell Attiva Cloud Shell nella console Google Cloud. Viene avviata una sessione nel riquadro inferiore della console Google Cloud.

  2. Imposta le variabili di ambiente:

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=redis
    export REGION=us-central1
    

    Sostituisci PROJECT_ID: il tuo Google Cloud con il tuo ID progetto.

  3. Clona il repository GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Passa alla directory di lavoro:

    cd kubernetes-engine-samples/databases/redis-spotahome
    

Crea l'infrastruttura del tuo cluster

In questa sezione eseguirai uno script Terraform per creare un cluster GKE privato a disponibilità elevata a livello di regione. I seguenti passaggi consentono l'accesso pubblico al piano di controllo.

Puoi installare l'operatore utilizzando un cluster Standard o Autopilot.

Standard

Il seguente diagramma mostra un cluster GKE Standard a livello di regione privato di cui è stato eseguito il deployment in tre zone diverse:

Per eseguire il deployment di questa infrastruttura, esegui i comandi seguenti da Cloud Shell:

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}

Quando richiesto, digita yes. Potrebbero essere necessari diversi minuti per il completamento di questo comando e prima che il cluster mostri lo stato Pronto.

Terraform crea le seguenti risorse:

  • Una rete VPC e una subnet privata per i nodi Kubernetes
  • Un router per accedere a Internet tramite NAT
  • Un cluster GKE privato nella regione us-central1
  • Due pool di nodi con scalabilità automatica abilitata (da uno a due nodi per zona, un nodo minimo per zona)
  • Un ServiceAccount con autorizzazioni di logging e monitoraggio
  • Backup per GKE per il ripristino di emergenza
  • Google Cloud Managed Service per Prometheus per il monitoraggio dei cluster

L'output è simile al seguente:

...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...

Autopilot

Il seguente diagramma mostra un cluster GKE Autopilot a livello di regione privato:

Per eseguire il deployment dell'infrastruttura, esegui questi comandi da Cloud Shell:

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}

Quando richiesto, digita yes. Potrebbero essere necessari diversi minuti per il completamento di questo comando e prima che il cluster mostri lo stato Pronto.

Terraform crea le seguenti risorse:

  • Rete VPC e subnet privata per i nodi Kubernetes
  • Un router per accedere a Internet tramite NAT
  • Un cluster GKE privato nella regione us-central1
  • Un ServiceAccount con autorizzazione di logging e monitoraggio
  • Google Cloud Managed Service per Prometheus per il monitoraggio dei cluster

L'output è simile al seguente:

...
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.
...

Connettiti al cluster

Utilizzando Cloud Shell, configura kubectl in modo che comunichi con il cluster:

gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --region ${REGION}

Esegui il deployment dell'operatore Spotahome nel cluster

In questa sezione eseguirai il deployment dell'operatore Spotahome nel tuo cluster Kubernetes utilizzando un grafico Helm, quindi eseguirai il deployment di un cluster Redis.

  1. Aggiungi l'operatore Spotahome Redis nel repository di grafici Helm:

    helm repo add redis-operator https://spotahome.github.io/redis-operator
    
  2. Aggiungi uno spazio dei nomi per l'operatore Spotahome e il cluster Redis:

    kubectl create ns redis
    
  3. Esegui il deployment dell'operatore Spotahome utilizzando lo strumento a riga di comando Helm:

    helm install redis-operator redis-operator/redis-operator --version 3.2.9 -n redis
    
  4. Controlla lo stato del deployment dell'operatore Spotahome utilizzando Helm:

    helm ls -n redis
    

    L'output è simile al seguente:

    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
    

Esegui il deployment di Redis

La configurazione di base per l'istanza del cluster Redis include i seguenti componenti:

  • Tre repliche dei nodi Redis: una leader e due repliche di lettura.
  • Tre repliche di nodi Sentinel che formano un quorum.
  • Allocazione delle risorse della CPU di una richiesta e due limiti di CPU, con richieste e limiti di memoria di 4 GB per Redis, 100 m/500 m di CPU e 500 MB per Sentinel.
  • Le tolleranze, nodeAffinities e topologySpreadConstraints configurate per ogni carico di lavoro, garantendo una distribuzione adeguata tra i nodi Kubernetes utilizzando i rispettivi pool di nodi e le diverse zone di disponibilità.

Questa configurazione rappresenta la configurazione minima richiesta per creare un cluster Redis pronto per la produzione.

Crea un cluster Redis di base

  1. Crea un secret con credenziali utente:

    export PASSWORD=$(openssl rand -base64 12)
    kubectl create secret generic my-user -n redis \
        --from-literal=password="$PASSWORD"
    

    L'operatore non dispone di una funzionalità per generare le credenziali e la password del database deve essere pregenerata.

  2. Crea un nuovo cluster Redis utilizzando la configurazione di base:

    kubectl apply -n redis -f manifests/01-basic-cluster/my-cluster.yaml
    

    Questo comando crea una risorsa RedisFailover personalizzata dell'operatore Spotahome che specifica i limiti e la CPU, le richieste di memoria e le incompatibilità e le affinità per distribuire le repliche dei pod di cui è stato eseguito il provisioning tra i nodi Kubernetes.

  3. Attendi qualche minuto mentre Kubernetes avvia i carichi di lavoro richiesti:

    kubectl wait pods -l redisfailovers.databases.spotahome.com/name=my-cluster --for condition=Ready --timeout=300s -n redis
    
  4. Verifica che i carichi di lavoro Redis siano stati creati:

    kubectl get pod,svc,statefulset,deploy,pdb -n redis
    

    L'output è simile al seguente:

    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
    

L'operatore crea le seguenti risorse:

  • Un deployment StatefulSet e Sentinel Redis
  • Tre repliche pod per Redis
  • Tre repliche pod per Sentinel
  • Due PodDisruptionBudgets, garantendo un minimo di due repliche disponibili per la coerenza del cluster
  • Il servizio rfr-my-cluster, che espone le metriche Redis
  • Il servizio redis-my-cluster, che ha come target il nodo leader del cluster Redis
  • Il servizio rfs-my-cluster, che consente ai client di connettersi al cluster tramite Sentinel. Il supporto di Sentinel è richiesto per le librerie client.

Condividi credenziali Redis

Puoi condividere le credenziali Redis con i client utilizzando il metodo di autenticazione precedente dell'operatore Spotahome

Devi utilizzare una password del database utilizzando l'impostazione requirepass. Questa password viene quindi utilizzata da tutti i client. Per gestire utenti aggiuntivi, utilizza i comandi dell'interfaccia a riga di comando di Redis.

apiVersion: databases.spotahome.com/v1
kind: RedisFailover
metadata:
  name: my-cluster
spec:
  ...
  auth:
    secretPath: my-user

La condivisione delle credenziali Redis con i client utilizzando questo metodo presenta le seguenti limitazioni:

  • Spotahome non fornisce risorse personalizzate per la gestione degli utenti. Puoi archiviare le credenziali nei secret, a cui viene fatto riferimento nelle specifiche di auth.
  • Non esiste un metodo per proteggere le connessioni con la crittografia TLS utilizzando la risorsa personalizzata.
  • L'aggiornamento in tempo reale delle credenziali non è supportato.

Connetti a Redis

Puoi eseguire il deployment di un client Redis ed eseguire l'autenticazione utilizzando una password archiviata in un secret Kubernetes.

  1. Esegui il pod client per interagire con il cluster Redis:

    kubectl apply -n redis -f manifests/02-auth/client-pod.yaml
    

    La variabile di ambiente PASS acquisisce il secret my-user dall'insieme di credenziali.

  2. Attendi che il pod sia pronto, quindi connettiti:

    kubectl wait pod redis-client --for=condition=Ready --timeout=300s -n redis
    kubectl exec -it redis-client -n redis -- /bin/bash
    
  3. Verifica che la connessione funzioni:

    redis-cli -h redis-my-cluster -a $PASS --no-auth-warning SET my-key "testvalue"
    

    L'output è simile al seguente:

    OK
    
  4. Ottieni il valore my-key:

    redis-cli -h redis-my-cluster -a $PASS --no-auth-warning GET my-key
    

    L'output è simile al seguente:

    "testvalue"
    
  5. Esci dalla shell del pod

    exit
    

Scopri in che modo Prometheus raccoglie le metriche per il tuo cluster Redis

Il seguente diagramma mostra come funziona la raccolta delle metriche di Prometheus:

Nel diagramma, un cluster privato GKE contiene:

  • Un pod Redis che raccoglie metriche sul percorso / e sulla porta 9121
  • Raccoglitori basati su Prometheus che elaborano le metriche dal pod Redis
  • Una risorsa PodMonitoring che invia metriche a Cloud Monitoring.

Google Cloud Managed Service per Prometheus supporta la raccolta di metriche in formato Prometheus. Cloud Monitoring utilizza una dashboard integrata per le metriche Redis.

L'operatore Spotahome espone le metriche del cluster in formato Prometheus utilizzando redis_exporter come sidecar.

  1. Crea la risorsa PodMonitoring per eseguire lo scraping delle metriche in base a labelSelector:

    kubectl apply -n redis -f manifests/03-prometheus-metrics/pod-monitoring.yaml
    
  2. Nella console Google Cloud, vai alla pagina Dashboard dei cluster GKE.

    Vai alla dashboard dei cluster GKE

    La dashboard mostra un tasso di importazione di metriche diverse da zero.

  3. Nella console Google Cloud, vai alla pagina Dashboard.

    Vai a Dashboard

  4. Apri la dashboard Panoramica di Redis Prometheus. La dashboard mostra la quantità di connessioni e chiavi. Il provisioning automatico della dashboard potrebbe richiedere diversi minuti.

  5. Connettiti al pod del client e prepara le variabili:

    kubectl exec -it redis-client -n redis -- /bin/bash
    
  6. Usa lo strumento redis-cli per creare nuove chiavi:

    for i in {1..50}; do \
      redis-cli -h redis-my-cluster -a $PASS \
      --no-auth-warning SET mykey-$i "myvalue-$i"; \
    done
    
  7. Aggiorna la pagina e osserva che i grafici Comandi al secondo e Chiavi sono stati aggiornati per mostrare lo stato effettivo del database.

  8. Esci dalla shell del pod

    exit
    

Esegui la pulizia

Elimina il progetto

    Elimina un progetto Google Cloud:

    gcloud projects delete PROJECT_ID

Elimina singole risorse

  1. Imposta le variabili di ambiente.

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=redis
    export REGION=us-central1
    
  2. Esegui il comando terraform destroy:

    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}
    

    Sostituisci FOLDER con gke-autopilot o gke-standard.

    Quando richiesto, digita yes.

  3. Trova tutti i dischi scollegati:

    export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,zone)")
    
  4. Elimina i dischi:

    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
    

Passaggi successivi

  • Esplora le architetture di riferimento, i diagrammi e le best practice su Google Cloud. Dai un'occhiata al nostro Cloud Architecture Center.