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:
Inicie uma sessão do Cloud Shell a partir da Google Cloud consola, clicando em
Ativar Cloud Shell na Google Cloud consola. Esta ação inicia uma sessão no painel inferior da Google Cloud consola.
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.Clone o repositório do GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
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.
Crie espaços de nomes para o REC e as respetivas aplicações:
kubectl create namespace rec-ns kubectl create namespace application
Etiquete os espaços de nomes:
kubectl label namespace rec-ns connection=redis kubectl label namespace application connection=redis
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}'`
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
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.
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.
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
Obtenha o certificado:
export CERT=$(kubectl get secret admission-tls -n rec-ns -o jsonpath='{.data.cert}')
Copie o certificado para o ficheiro
webhook.yaml
:sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
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.
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.
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
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
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.
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
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
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
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
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.
Crie o pod do cliente:
kubectl apply -n application -f manifests/03-auth/client_pod.yaml
Ligue-se ao pod do cliente:
kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
Associe à base de dados:
redis-cli -h $SERVICE -p $PORT --pass $PASS
Crie uma chave:
SET mykey "Hello World"
O resultado é semelhante ao seguinte:
OK
Obtenha a chave:
GET mykey
O resultado é semelhante ao seguinte:
"Hello World"
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 porta8070
- 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.
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 podmetrics-proxy
como um proxy inverso para este ponto final para expor as métricas na porta HTTP.Crie o recurso PodMonitoring para extrair métricas por
labelSelector
:kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
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.
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].
Na Google Cloud consola, aceda à página Painéis de controlo.
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.
Abra o painel de controlo do Redis Enterprise Cluster.
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.
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
Estabeleça ligação ao pod do cliente e prepare as variáveis:
kubectl exec -it redis-client-c -n rec-ns -- /bin/bash
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
Atualize a página e observe que os gráficos foram atualizados para mostrar o estado real da base de dados.
Saia da shell do Pod
exit