Déployer Redis sur GKE à l'aide de Redis Enterprise

Ce guide vous explique comment déployer Redis Enterprise sur des clusters Google Kubernetes Engine (GKE).

Redis est une base de données Open Source en mémoire NoSQL principalement utilisée pour la mise en cache. Elle offre une réplication intégrée, des scripts Lua, l'éviction LRU, des transactions, la persistance sur disque et une haute disponibilité.

Redis Enterprise est une solution de niveau entreprise qui étend la base de données Open Source Redis et offre une gestion simplifiée, y compris la distribution des données géo-répliquées, le scaling linéaire du débit des opérations, la hiérarchisation des données, des fonctionnalités de sécurité avancées, etc.

La tarification de Redis Enterprise diffère pour chaque option de déploiement, y compris les suivantes : Logiciels, Cloud ou hybride et multicloud.

Ce guide est destiné aux administrateurs de plate-forme, aux architectes cloud et aux professionnels des opérations qui souhaitent déployer Redis Enterprise sur Google Kubernetes Engine (GKE).

Configurer votre environnement

Dans ce tutoriel, vous utilisez Cloud Shell pour gérer les ressources hébergées surGoogle Cloud. Les logiciels dont vous avez besoin pour ce tutoriel sont préinstallés sur Cloud Shell, y compris kubectl, la gcloud CLI et Terraform.

Pour configurer votre environnement avec Cloud Shell, procédez comme suit :

  1. Lancez une session Cloud Shell depuis la console Google Cloud en cliquant sur Icône d'activation Cloud Shell Activer Cloud Shell dans la consoleGoogle Cloud . Une session s'ouvre dans le volet inférieur de la console Google Cloud .

  2. Définissez les variables d'environnement :

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

    Remplacez PROJECT_ID: your Google Cloud par votre ID de projet.

  3. Clonez le dépôt GitHub.

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Accédez au répertoire de travail :

    cd kubernetes-engine-samples/databases/redis-enterprise-operator
    

Créer l'infrastructure de votre cluster

Dans cette section, vous allez exécuter un script Terraform pour créer un VPC et un cluster GKE régional, privé, à disponibilité élevée.

Le schéma suivant présente un cluster GKE standard régional privé déployé sur trois zones différentes :

Pour déployer cette infrastructure, exécutez les commandes suivantes à partir de Cloud Shell :

  cd terraform/gke-standard
  export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
  terraform init
  terraform apply -var project_id=${PROJECT_ID}   \
    -var region=${REGION}  \
    -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

Lorsque vous y êtes invité, saisissez yes. L'exécution de cette commande et le passage du cluster à l'état prêt peuvent prendre plusieurs minutes.

Terraform crée les ressources suivantes :

  • Un réseau VPC et un sous-réseau privé pour les nœuds Kubernetes.
  • Un routeur pour accéder à Internet via NAT.
  • Un cluster GKE privé dans la région us-central1.
  • Un pool de nœuds avec autoscaling activé (un à deux nœuds par zone, un nœud par zone au minimum).

Le résultat ressemble à ce qui suit :

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

Se connecter au cluster

Avec Cloud Shell, configurez kubectl pour communiquer avec le cluster :

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

Déployer l'opérateur Redis Enterprise sur votre cluster

Dans cette section, vous allez déployer l'opérateur Redis Enterprise sur votre cluster Kubernetes.

  1. Créez des espaces de noms pour le REC et ses applications :

    kubectl create namespace rec-ns
    kubectl create namespace application
    
  2. Ajoutez un libellé aux espaces de noms :

    kubectl label namespace rec-ns connection=redis
    kubectl label namespace application connection=redis
    
  3. Obtenez la dernière version du bundle d'opérateurs Redis Enterprise :

    VERSION=`curl --silent https://api.github.com/repos/RedisLabs/redis-enterprise-k8s-docs/releases/latest | grep tag_name | awk -F'"' '{print $4}'`
    
  4. Installez l'opérateur Redis Enterprise :

    kubectl apply -n rec-ns -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/$VERSION/bundle.yaml
    

    Le résultat ressemble à ce qui suit :

    role.rbac.authorization.k8s.io/redis-enterprise-operator created
    rolebinding.rbac.authorization.k8s.io/redis-enterprise-operator created
    serviceaccount/redis-enterprise-operator created
    service/admission created
    customresourcedefinition.apiextensions.k8s.io/redisenterpriseclusters.app.redislabs.com created
    customresourcedefinition.apiextensions.k8s.io/redisenterprisedatabases.app.redislabs.com created
    customresourcedefinition.apiextensions.k8s.io/redisenterpriseremoteclusters.app.redislabs.com created
    customresourcedefinition.apiextensions.k8s.io/redisenterpriseactiveactivedatabases.app.redislabs.com created
    deployment.apps/redis-enterprise-operator created
    

Déployer un cluster Redis Enterprise

  1. Appliquez le fichier manifeste à votre cluster :

    kubectl apply -n rec-ns -f manifests/01-basic-cluster/rec.yaml
    

    Cette commande peut prendre plusieurs minutes.

  2. Vérifiez l'état du déploiement de REC :

    kubectl get rec -n rec-ns
    

    Le résultat ressemble à ce qui suit :

    NAME      NODES   VERSION    STATE     SPEC STATUS   LICENSE STATE   SHARDS LIMIT   LICENSE EXPIRATION DATE   AGE
    gke-rec   3       7.2.4-52   Running   Valid         Valid           4              2023-09-29T20:15:32Z      4m7s
    

    Le cluster est prêt lorsque la valeur STATE est définie sur RUNNING.

Facultatif : Configurer le contrôleur d'admission

Vous pouvez éventuellement configurer l'infrastructure pour la validation de la base de données lors du déploiement.

  1. Configurez le contrôleur d'admission et vérifiez si le secret TLS d'admission est présent :

    kubectl get secret admission-tls -n rec-ns
    
  2. Obtenez le certificat :

    export CERT=$(kubectl get secret admission-tls -n rec-ns -o jsonpath='{.data.cert}')
    
  3. Copiez le certificat dans le fichier webhook.yaml :

    sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
    
  4. Déployez le webhook de validation :

    sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
    

    Le contrôleur d'admission valide la syntaxe de la base de données dans les espaces de noms libellés.

  5. Vérifiez le contrôleur d'admission en créant une base de données non fonctionnelle :

    kubectl apply -n rec-ns -f - << EOF
    apiVersion: app.redislabs.com/v1alpha1
    kind: RedisEnterpriseDatabase
    metadata:
      name: redis-enterprise-database
    spec:
      evictionPolicy: illegal
    EOF
    

    Le résultat ressemble à ce qui suit :

    Error from server: error when creating "STDIN": admission webhook "redisenterprise.admission.redislabs" denied the request: 'illegal' is an invalid value for 'eviction_policy'. Possible values are ['volatile-lru', 'volatile-ttl', 'volatile-random', 'allkeys-lru', 'allkeys-random', 'noeviction', 'volatile-lfu', 'allkeys-lfu']
    

Créer des espaces de noms

Par défaut, l'opérateur Redis Enterprise ne dispose d'aucun droit permettant d'effectuer des actions en dehors de son propre espace de noms. Pour autoriser l'opérateur Redis Enterprise à créer des points de terminaison REDB et de base de données dans d'autres espaces de noms, vous devez configurer RBAC.

  1. Appliquez le rôle et la liaison de rôle correspondants dans l'espace de noms de l'application :

    kubectl apply -f manifests/01-basic-cluster/role.yaml -n application
    kubectl apply -f manifests/01-basic-cluster/role-binding.yaml -n application
    
  2. Créez un rôle de cluster et une liaison de rôle de cluster dans l'espace de noms rec-ns :

    kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role.yaml
    kubectl apply -n rec-ns -f manifests/01-basic-cluster/cluster_role_binding.yaml
    
  3. Modifiez le fichier ConfigMap REC pour ajouter un contrôle sur l'espace de noms de l'application :

    kubectl patch ConfigMap/operator-environment-config --type merge -p '{"data": {"REDB_NAMESPACES_LABEL": "connection=redis"}}' -n rec-ns
    

    Chaque espace de noms étiqueté en tant que ConfigMap est corrigé.

  4. Vérifiez l'état des ressources de votre infrastructure Redis dans l'espace de noms rec-ns :

    kubectl get pod,deploy,svc,rec,statefulset,cm,secrets -n rec-ns
    

    Le résultat ressemble à ce qui suit :

    NAME                                             READY   STATUS    RESTARTS        AGE
    pod/gke-rec-0                                    2/2     Running   0               172m
    pod/gke-rec-1                                    2/2     Running   0               171m
    pod/gke-rec-2                                    2/2     Running   0               168m
    pod/gke-rec-services-rigger-5f885f59dc-gc79g     1/1     Running   0               172m
    pod/redis-enterprise-operator-6668ccd8dc-kx29z   2/2     Running   2 (5m58s ago)   5h
    
    NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/gke-rec-services-rigger     1/1     1            1           172m
    deployment.apps/redis-enterprise-operator   1/1     1            1           5h
    
    NAME                   TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
    service/admission      ClusterIP   10.52.11.13   <none>        443/TCP             5h
    service/gke-rec        ClusterIP   10.52.5.44    <none>        9443/TCP,8001/TCP   172m
    service/gke-rec-prom   ClusterIP   None          <none>        8070/TCP            172m
    service/gke-rec-ui     ClusterIP   10.52.3.29    <none>        8443/TCP            172m
    
    NAME                                               NODES   VERSION    STATE     SPEC STATUS   LICENSE STATE   SHARDS LIMIT   LICENSE EXPIRATION DATE   AGE
    redisenterprisecluster.app.redislabs.com/gke-rec   3       7.2.4-52   Running   Valid         Valid           4              2023-10-05T11:07:20Z      172m
    
    NAME                       READY   AGE
    statefulset.apps/gke-rec   3/3     172m
    
    NAME                                    DATA   AGE
    configmap/gke-rec-bulletin-board        1      172m
    configmap/gke-rec-health-check          5      172m
    configmap/kube-root-ca.crt              1      5h2m
    configmap/operator-environment-config   1      5h
    
    NAME                   TYPE     DATA   AGE
    secret/admission-tls   Opaque   2      5h
    secret/gke-rec         Opaque   2      172m
    

Déployer des bases de données Redis Enterprise

  1. Créez des bases de données Redis Enterprise dans les espaces de noms de l'application :

    kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n application
    
  2. Vérifiez l'état REDB :

    kubectl get redb --all-namespaces
    

    Le résultat ressemble à ce qui suit :

    NAMESPACE       NAME       VERSION   PORT    CLUSTER   SHARDS   STATUS   SPEC STATUS   AGE
    application   app-db   7.2.0     12999   gke-rec   1        active   Valid         15s
    
  3. Vérifiez que les services de chaque REDB sont en cours d'exécution :

    kubectl get svc --all-namespaces
    

    Le résultat ressemble à ce qui suit :

    NAMESPACE      NAME      TYPE          CLUSTER-IP   EXTERNAL-IP                           PORT(S)    AGE
    application  app-db  ExternalName  <none>       redis-12999.rec-ns.svc.cluster.local  12999/TCP  72m
    
  4. Vérifiez que le secret a été créé :

    kubectl get secrets -n application
    

    Le résultat ressemble à ce qui suit :

    NAME            TYPE     DATA   AGE
    redb-app-db   Opaque   3      96m
    

S'authentifier à l'aide de mots de passe

Vous pouvez vous connecter à REDB à l'aide d'un pod avec redis-cli dans l'espace de noms de l'application. Le pod client utilise les secrets disponibles dans l'espace de noms de l'application (REDB) pour établir une connexion.

Les bases de données créées avec le REDB de ressource personnalisée ne sont compatibles qu'avec l'authentification par mot de passe sans LCA.

  1. Créez le pod client :

    kubectl apply -n application -f manifests/03-auth/client_pod.yaml
    
  2. Connectez-vous au pod client :

    kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
    
  3. Connectez-vous à la base de données :

    redis-cli -h $SERVICE -p $PORT --pass $PASS
    
  4. Créez une clé :

    SET mykey "Hello World"
    

    Le résultat ressemble à ce qui suit :

    OK
    
  5. Obtenez la clé :

    GET mykey
    

    Le résultat ressemble à ce qui suit :

    "Hello World"
    
  6. Quittez l'interface système du pod.

    exit
    

Comprendre comment Prometheus collecte les métriques pour votre cluster Redis

Le schéma suivant illustre le fonctionnement de la collecte de métriques Prometheus :

Dans le schéma, un cluster privé GKE contient :

  • Un pod Redis qui collecte des métriques sur le chemin / et le port 8070
  • Collecteurs basés sur Prometheus qui traitent les métriques à partir du pod Redis
  • Une ressource PodMonitoring qui envoie des métriques à Cloud Monitoring

L'opérateur Redis Enterprise expose les métriques de cluster au format Prometheus.

  1. Créez le déploiement metrics-proxy :

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/metrics-proxy.yaml
    

    Étant donné que l'opérateur ne fournit qu'un point de terminaison HTTPS avec le certificat autosigné et que la ressource PodMonitoring ne permet pas de désactiver la validation du certificat TLS, utilisez le pod metrics-proxy en sens inverse. Proxy pour ce point de terminaison afin d'exposer les métriques sur le port HTTP.

  2. Créez la ressource PodMonitoring pour récupérer les métriques par labelSelector :

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
    
  3. Dans la console Google Cloud , accédez à la page Tableau de bord des clusters GKE.

    Accéder au tableau de bord des clusters GKE

    Le tableau de bord affiche un taux d'ingestion de métriques différent de zéro.

Créer un tableau de bord

Vous pouvez afficher les métriques en créant un tableau de bord.

  1. Créez le tableau de bord :

    gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
    

    Le résultat ressemble à ce qui suit :

    Created [f4efbe4e-2605-46b4-9910-54b13d29b3be].
    
  2. Dans la console Google Cloud , accédez à la page Tableaux de bord.

    Accéder à la page "Tableaux de bord"

  3. Ouvrez le tableau de bord des clusters Redis Enterprise. Le provisionnement automatique du tableau de bord peut prendre plusieurs minutes.

Vérifier les métriques exportées

Pour vérifier les métriques, créez une base de données et examinez-les.

  1. Ouvrez le tableau de bord des clusters Redis Enterprise.

  2. Créez une base de données Redis supplémentaire :

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/c-rdb.yaml
    

    Le nombre de bases de données dans le tableau de bord devrait être mis à jour.

  3. Créez un pod client pour vous connecter à la nouvelle base de données :

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/client_pod.yaml
    
  4. Connectez-vous au pod client et préparez les variables :

    kubectl exec -it redis-client-c -n rec-ns -- /bin/bash
    
  5. Utilisez l'outil redis-cli pour créer des clés :

    for i in {1..50}; do \
      redis-cli -h $SERVICE -p $PORT -a $PASS \
      --no-auth-warning SET mykey-$i "myvalue-$i"; \
    done
    
  6. Actualisez la page et observez que les graphiques ont été mis à jour pour afficher l'état réel de la base de données.

  7. Quittez l'interface système du pod.

    exit