Implemente o Redis no GKE com o Redis Enterprise

O guia mostra como implementar o Redis Enterprise em clusters do Google Kubernetes Engine (GKE).

O Redis é uma base de dados NoSQL de código aberto na memória usada principalmente para colocação em cache. Tem replicação incorporada, scripting Lua, remoção LRU, transações, persistência no disco e alta disponibilidade.

O Redis Enterprise é uma solução de nível empresarial que expande o Redis de código aberto com gestão simplificada, incluindo distribuição de dados com replicação geográfica, escalabilidade linear do débito de operações, hierarquização de dados, funcionalidades de segurança avançadas e muito mais.

O Redis Enterprise tem preços diferentes para cada opção de implementação, incluindo: Software, Cloud ou Híbrido e multicloud.

Este guia destina-se a administradores de plataformas, arquitetos da nuvem e profissionais de operações interessados na implementação do Redis Enterprise no Google Kubernetes Engine (GKE).

Configure o seu ambiente

Neste tutorial, vai usar o Cloud Shell para gerir recursos alojados no Google Cloud. O Cloud Shell vem pré-instalado com o software de que precisa para este tutorial, incluindo o kubectl, a CLI gcloud e o Terraform.

Para configurar o seu ambiente com o Cloud Shell, siga estes passos:

  1. Inicie uma sessão do Cloud Shell a partir da Google Cloud consola, clicando em Ícone de ativação do Cloud Shell Ativar Cloud Shell na Google Cloud consola. Esta ação inicia uma sessão no painel inferior da Google Cloud consola.

  2. Defina variáveis de ambiente:

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

    Substitua PROJECT_ID: your Google Cloud pelo seu ID do projeto.

  3. Clone o repositório do GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. Mude para o diretório de trabalho:

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

Crie a infraestrutura do cluster

Nesta secção, executa um script do Terraform para criar um cluster do GKE regional privado e de alta disponibilidade, bem como uma VPC.

O diagrama seguinte mostra um cluster GKE padrão regional privado implementado em três zonas diferentes:

Para implementar esta infraestrutura, execute os seguintes comandos a partir do 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}

Quando lhe for pedido, escreva yes. Este comando pode demorar vários minutos a ser concluído e o cluster a apresentar o estado pronto.

O Terraform cria os seguintes recursos:

  • Uma rede VPC e uma sub-rede privada para os nós do Kubernetes
  • Um router para aceder à Internet através de NAT
  • Um cluster do GKE privado na região de us-central1
  • Um conjunto de nós com o dimensionamento automático ativado (um a dois nós por zona, um nó por zona no mínimo)

O resultado é semelhante ao seguinte:

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

Estabeleça ligação ao cluster

Usando a Cloud Shell, configure kubectl para comunicar com o cluster:

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

Implemente o operador do Redis Enterprise no seu cluster

Nesta secção, implementa o operador do Redis Enterprise no seu cluster do Kubernetes.

  1. Crie espaços de nomes para o REC e as respetivas aplicações:

    kubectl create namespace rec-ns
    kubectl create namespace application
    
  2. Etiquete os espaços de nomes:

    kubectl label namespace rec-ns connection=redis
    kubectl label namespace application connection=redis
    
  3. Obtenha a versão mais recente do pacote do operador do 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. Instale o operador do Redis Enterprise:

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

    O resultado é semelhante ao seguinte:

    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
    

Implemente o Redis Enterprise Cluster

  1. Aplique o manifesto ao cluster:

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

    O comando pode demorar vários minutos a ser concluído.

  2. Verifique o estado da implementação do REC:

    kubectl get rec -n rec-ns
    

    O resultado é semelhante ao seguinte:

    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
    

    O cluster está pronto quando STATE é RUNNING.

Opcional: configure o controlador de admissão

Opcionalmente, pode configurar a infraestrutura para a validação da base de dados na implementação.

  1. Configure o controlador de admissão e verifique se o segredo de TLS de admissão está presente:

    kubectl get secret admission-tls -n rec-ns
    
  2. Obtenha o certificado:

    export CERT=$(kubectl get secret admission-tls -n rec-ns -o jsonpath='{.data.cert}')
    
  3. Copie o certificado para o ficheiro webhook.yaml:

    sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
    
  4. Implemente o webhook de validação:

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

    O controlador de admissão valida a sintaxe da base de dados em espaços de nomes etiquetados.

  5. Valide o controlador de admissão criando uma base de dados não funcional:

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

    O resultado é semelhante ao seguinte:

    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']
    

Crie espaços de nomes

Por predefinição, o operador Redis Enterprise não tem privilégios para realizar ações fora do seu próprio espaço de nomes. Para permitir que o operador do Redis Enterprise crie pontos finais de REDB e de base de dados noutros espaços de nomes, tem de configurar o RBAC.

  1. Aplique a função e a associação de funções correspondentes no espaço de nomes da aplicação:

    kubectl apply -f manifests/01-basic-cluster/role.yaml -n application
    kubectl apply -f manifests/01-basic-cluster/role-binding.yaml -n application
    
  2. Crie uma função de cluster e uma associação de funções de cluster no namespace 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. Edite o REC ConfigMap para adicionar controlo sobre o espaço de nomes da aplicação:

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

    Cada espaço de nomes etiquetado como ConfigMap é corrigido.

  4. Verifique o estado dos recursos na sua infraestrutura Redis no espaço de nomes rec-ns:

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

    O resultado é semelhante ao seguinte:

    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
    

Implemente bases de dados Redis Enterprise

  1. Crie bases de dados Redis Enterprise nos espaços de nomes das aplicações:

    kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n application
    
  2. Verifique o estado do REDB:

    kubectl get redb --all-namespaces
    

    O resultado é semelhante ao seguinte:

    NAMESPACE       NAME       VERSION   PORT    CLUSTER   SHARDS   STATUS   SPEC STATUS   AGE
    application   app-db   7.2.0     12999   gke-rec   1        active   Valid         15s
    
  3. Verifique se os serviços de cada REDB estão em execução:

    kubectl get svc --all-namespaces
    

    O resultado é semelhante ao seguinte:

    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. Verifique se o Secret foi criado:

    kubectl get secrets -n application
    

    O resultado é semelhante ao seguinte:

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

Autentique com palavras-passe

Pode estabelecer ligação ao REDB através de um pod com redis-cli no espaço de nomes da aplicação. O pod do cliente usa os segredos disponíveis no espaço de nomes da aplicação (REDB) para estabelecer uma ligação.

As bases de dados criadas com o recurso personalizado REDB só suportam a autenticação por palavra-passe sem ACL.

  1. Crie o pod do cliente:

    kubectl apply -n application -f manifests/03-auth/client_pod.yaml
    
  2. Ligue-se ao pod do cliente:

    kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
    
  3. Associe à base de dados:

    redis-cli -h $SERVICE -p $PORT --pass $PASS
    
  4. Crie uma chave:

    SET mykey "Hello World"
    

    O resultado é semelhante ao seguinte:

    OK
    
  5. Obtenha a chave:

    GET mykey
    

    O resultado é semelhante ao seguinte:

    "Hello World"
    
  6. Saia da shell do Pod

    exit
    

Compreenda como o Prometheus recolhe métricas para o seu cluster Redis

O diagrama seguinte mostra como funciona a recolha de métricas do Prometheus:

No diagrama, um cluster privado do GKE contém:

  • Um pod do Redis que recolhe métricas no caminho / e na porta 8070
  • Coletores baseados no Prometheus que processam as métricas do pod do Redis
  • Um recurso PodMonitoring que envia métricas para o Cloud Monitoring

O operador Redis Enterprise expõe as métricas do cluster no formato Prometheus.

  1. Crie a implementação metrics-proxy:

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

    Uma vez que o operador apenas fornece um ponto final HTTPS com o certificado autoassinado e o recurso PodMonitoring não suporta a desativação da validação do certificado TLS, usa o pod metrics-proxy como um proxy inverso para este ponto final para expor as métricas na porta HTTP.

  2. Crie o recurso PodMonitoring para extrair métricas por labelSelector:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
    
  3. Na Google Cloud consola, aceda à página Painel de controlo de clusters do GKE.

    Aceda ao painel de controlo de clusters do GKE

    O painel de controlo mostra a taxa de carregamento de métricas diferente de zero.

Crie um painel de controlo

Pode ver as métricas criando um painel de controlo.

  1. Crie o painel de controlo:

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

    O resultado é semelhante ao seguinte:

    Created [f4efbe4e-2605-46b4-9910-54b13d29b3be].
    
  2. Na Google Cloud consola, aceda à página Painéis de controlo.

    Aceder a Painéis de controlo

  3. Abra o painel de controlo do Redis Enterprise Cluster. O aprovisionamento automático do painel de controlo pode demorar vários minutos.

Valide as métricas exportadas

Para validar as métricas, crie uma nova base de dados e examine as métricas.

  1. Abra o painel de controlo do Redis Enterprise Cluster.

  2. Crie uma base de dados Redis adicional:

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

    A quantidade de bases de dados no painel de controlo deve ser atualizada.

  3. Crie um pod de cliente para estabelecer ligação à nova base de dados:

    kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/client_pod.yaml
    
  4. Estabeleça ligação ao pod do cliente e prepare as variáveis:

    kubectl exec -it redis-client-c -n rec-ns -- /bin/bash
    
  5. Use a ferramenta redis-cli para criar novas chaves:

    for i in {1..50}; do \
      redis-cli -h $SERVICE -p $PORT -a $PASS \
      --no-auth-warning SET mykey-$i "myvalue-$i"; \
    done
    
  6. Atualize a página e observe que os gráficos foram atualizados para mostrar o estado real da base de dados.

  7. Saia da shell do Pod

    exit