O guia mostra como implantar o Redis Enterprise nos clusters do Google Kubernetes Engine (GKE).
O Redis é um banco de dados NoSQL na memória de código aberto usado principalmente para armazenamento em cache. Ele tem replicação integrada, scripting Lua, remoção de LRU, transações, persistência no disco e alta disponibilidade.
Além disso, é uma solução de nível empresarial que estende o código aberto do Redis com gerenciamento simplificado, incluindo distribuição de dados replicados geograficamente, escalonamento linear de capacidade de operações, níveis de dados, recursos avançados de segurança e muito mais.
O Redis Enterprise tem preços diferentes para cada opção de implantação, incluindo: Software, Nuvem ou Híbrido e Multicloud.
Este guia é destinado a administradores de plataformas, arquitetos de nuvem e profissionais de operações interessados em implantar o Redis Enterprise no Google Kubernetes Engine (GKE).
Configurar o ambiente
Neste tutorial, você vai usar o Cloud Shell para gerenciar recursos hospedados no
Google Cloud. O Cloud Shell vem pré-instalado com o software necessário
para este tutorial, incluindo
kubectl
, a
gcloud CLI e o Terraform.
Para configurar o ambiente com o Cloud Shell, siga estas etapas:
Inicie uma sessão do Cloud Shell no console do Google Cloud clicando em
Ativar o Cloud Shell no console doGoogle Cloud . Isso inicia uma sessão no painel inferior do console Google Cloud .
Defina as variáveis de ambiente:
export PROJECT_ID=PROJECT_ID export KUBERNETES_CLUSTER_PREFIX=redis export REGION=us-central1
Substitua
PROJECT_ID
: seu Google Cloud pelo 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
Criar a infraestrutura do cluster
Nesta seção, você executará um script do Terraform para criar um cluster do GKE e uma VPC privada e altamente disponível.
O diagrama a seguir mostra um cluster regional padrão particular do GKE implantado em três zonas diferentes:
Para implantar essa infraestrutura, execute os seguintes comandos no 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 solicitado, digite yes
. Pode levar vários minutos para que esse comando seja concluído e o cluster mostre um status pronto.
O Terraform cria os seguintes recursos:
- Uma rede VPC e uma sub-rede particular para os nós do Kubernetes.
- Um roteador para acessar a Internet usando NAT.
- Um cluster particular do GKE na região
us-central1
. - Um pool de nós com escalonamento automático ativado (de um a dois nós por zona, no mínimo um nó por zona)
O resultado será assim:
...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...
Conexão ao cluster
Usando o Cloud Shell, configure kubectl
para se comunicar com o cluster:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${REGION}
Implantar o operador Redis Enterprise no seu cluster
Nesta seção, você implantará o operador Redis Enterprise no seu cluster do Kubernetes.
Crie namespaces para o REC e os aplicativos dele:
kubectl create namespace rec-ns kubectl create namespace application
Rotule os namespaces:
kubectl label namespace rec-ns connection=redis kubectl label namespace application connection=redis
Obtenha a versão mais recente do pacote do operador 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 Redis Enterprise:
kubectl apply -n rec-ns -f https://raw.githubusercontent.com/RedisLabs/redis-enterprise-k8s-docs/$VERSION/bundle.yaml
O resultado será assim:
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
Implantar o cluster do Redis Enterprise
Aplique o manifesto ao cluster:
kubectl apply -n rec-ns -f manifests/01-basic-cluster/rec.yaml
O comando pode levar alguns minutos para ser concluído.
Verifique o status da implantação do REC:
kubectl get rec -n rec-ns
O resultado será assim:
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 estará pronto quando
STATE
forRUNNING
.
Opcional: configurar o controlador de admissão
Se quiser, é possível configurar a infraestrutura para a validação do banco de dados na implantação.
Configure o controlador de admissão e verifique se o Secret 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 no arquivo
webhook.yaml
:sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yaml
Implante 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 do banco de dados em namespaces rotulados.
Verifique o controlador de admissão criando um banco 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 será assim:
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']
Criar namespaces
Por padrão, o operador Redis Enterprise não tem privilégios para executar ações fora do próprio namespace. Para permitir que o operador Redis Enterprise crie endpoints de banco de dados e REDB em outros namespaces, configure o RBAC.
Aplique o papel e a vinculação de papel correspondentes no namespace do aplicativo:
kubectl apply -f manifests/01-basic-cluster/role.yaml -n application kubectl apply -f manifests/01-basic-cluster/role-binding.yaml -n application
Crie um papel de cluster e uma vinculação de papel 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 controle sobre o namespace do aplicativo:
kubectl patch ConfigMap/operator-environment-config --type merge -p '{"data": {"REDB_NAMESPACES_LABEL": "connection=redis"}}' -n rec-ns
Cada namespace rotulado como ConfigMap recebe um patch.
Verifique o status dos recursos na infraestrutura do Redis no namespace
rec-ns
:kubectl get pod,deploy,svc,rec,statefulset,cm,secrets -n rec-ns
O resultado será assim:
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
Implantar bancos de dados Redis Enterprise
Crie bancos de dados Redis Enterprise nos namespaces do aplicativo:
kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n application
Verifique o status de REDB:
kubectl get redb --all-namespaces
O resultado será assim:
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 será assim:
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 será assim:
NAME TYPE DATA AGE redb-app-db Opaque 3 96m
Autenticar usando senhas
É possível se conectar ao REDB usando um pod com redis-cli
no namespace do
aplicativo. O pod cliente usa os secrets disponíveis no namespace do aplicativo (REDB) para estabelecer uma conexão.
Os bancos de dados criados com o recurso personalizado de REDB são compatíveis apenas com a autenticação por senha sem ACL.
Crie o pod cliente:
kubectl apply -n application -f manifests/03-auth/client_pod.yaml
Conecte-se ao pod cliente:
kubectl exec -n application -i -t redis-client -c redis-client -- /bin/sh
Conecte-se ao banco de dados:
redis-cli -h $SERVICE -p $PORT --pass $PASS
Crie uma chave:
SET mykey "Hello World"
O resultado será assim:
OK
Obtenha a chave:
GET mykey
O resultado será assim:
"Hello World"
Saia do shell do pod
exit
Entender como o Prometheus coleta métricas para seu cluster do Redis
No diagrama a seguir, mostramos como funciona a coleta de métricas do Prometheus:
No diagrama, um cluster particular do GKE contém os seguintes componentes:
- Um pod Redis que coleta métricas no caminho
/
e na porta8070
. - Coletores baseados em Prometheus que processam as métricas do pod do Redis.
- Um recurso
PodMonitoring
que envia métricas ao Cloud Monitoring.
O operador Redis Enterprise expõe as métricas do cluster no formato do Prometheus.
Crie a implantação metrics-proxy:
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/metrics-proxy.yaml
Como o operador fornece apenas um endpoint HTTPS com o certificado autoassinado e o recurso
PodMonitoring
não oferece suporte à desativação da verificação de certificado TLS, use o podmetrics-proxy
como um proxy reverso desse endpoint para expor as métricas na porta HTTP.Crie o recurso PodMonitoring para raspar métricas por
labelSelector
:kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/pod-monitoring.yaml
No console do Google Cloud , acesse a página Painel de clusters do GKE.
Acessar o painel de clusters do GKE
O painel mostra uma taxa de ingestão de métricas diferente de zero.
Criar um painel
Para visualizar as métricas, crie um painel.
Crie o painel:
gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.json
O resultado será assim:
Created [f4efbe4e-2605-46b4-9910-54b13d29b3be].
No console Google Cloud , acesse a página Painéis.
Abra o painel do cluster do Redis Enterprise. Pode levar vários minutos para que o painel seja provisionado automaticamente.
Verificar as métricas exportadas
Para verificar as métricas, crie um banco de dados e examine as métricas.
Abra o painel do cluster do Redis Enterprise.
Crie um banco de dados adicional do Redis:
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/c-rdb.yaml
A Contagem de banco de dados no painel será atualizada.
Crie um pod cliente para se conectar ao novo banco de dados:
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/client_pod.yaml
Conecte-se ao pod 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 se os gráficos foram atualizados para mostrar o estado real do banco de dados.
Saia do shell do pod
exit