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, Nuvem ou Híbrido e multinuvem.
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).
Objetivos
- Planeie e implemente a infraestrutura do GKE para o Redis
- Implemente o operador Redis Enterprise
- Implemente um cluster Redis Enterprise
- Crie uma base de dados do Redis Enterprise
- Demonstre a autenticação da base de dados
Vantagens
O Redis Enterprise oferece as seguintes vantagens:
- Uma forma nativa do Kubernetes de gerir o ciclo de vida do Redis Enterprise Cluster (REC) e as bases de dados Redis Enterprise (REDBs)
- Utilização de recursos através da colocação conjunta de várias bases de dados Redis num único pod do Kubernetes
- Redução dos encargos operacionais através do processamento de tarefas de manutenção de rotina, como aplicação de patches e atualizações
- Suporte para imagens de software Redis de registos de contentores privados, como o Artifact Registry, para melhorar a segurança e a disponibilidade dos contentores
- Suporte do serviço gerido Google Cloud para Prometheus para monitorização e observabilidade de bases de dados
- Funcionalidades de segurança melhoradas, como encriptação, controlos de acesso e integração com o RBAC (controlo de acesso baseado em funções) do Kubernetes
- Métodos de autenticação avançados, incluindo LDAP e gestores de credenciais de terceiros, como o Vault
- Capacidade de configurar cópias de segurança agendadas
Arquitetura de implementação
O Redis Enterprise gere os seguintes recursos do Kubernetes:
- O cluster Enterprise e a respetiva configuração num StatefulSet. O cluster é composto por nós Redis (pods) com pacotes Redis instalados. Estes nós têm processos em execução para garantir que o nó faz parte de um cluster. Cada nó fornece um contentor para executar várias instâncias da base de dados (fragmentos). Embora as práticas recomendadas do Kubernetes indiquem que um pod deve representar uma aplicação com um contentor, o Redis Enterprise implementa várias bases de dados Redis num único contentor. Esta abordagem oferece uma melhor utilização dos recursos, desempenho e débito da rede. Cada contentor também tem um proxy de latência zero para encaminhar e gerir o tráfego para processos de base de dados Redis específicos num contentor.
- O recurso personalizado
RedisEnterpriseDatabase(REDBs) que representa as instâncias da base de dados Redis criadas no REC - Serviços Kubernetes que servem instâncias REDB como pontos finais de bases de dados
- Um pod de controlador denominado Service Rigger que cria e elimina pontos finais da base de dados quando uma base de dados é criada ou eliminada
Neste tutorial, vai criar uma implementação de um para muitos implementando um REC num espaço de nomes dedicado e usando espaços de nomes separados para implementações de aplicações para um melhor isolamento.
O diagrama seguinte descreve os componentes do Redis Enterprise e como estão interligados:
Neste tutorial, configura o Redis Enterprise Cluster para ter elevada disponibilidade. Para isso, o REC requer um número ímpar de nós e um mínimo de três nós. Também define regras de afinidade, anti-afinidade e taints de nós que garantem que cada nó do Redis é colocado num nó diferente do Kubernetes e que os nós do Redis são distribuídos uniformemente pelo cluster do Kubernetes.
A utilização de vários nós e zonas é crucial para alcançar um cluster do GKE de alta disponibilidade pelos seguintes motivos:
- Tolerância a falhas: vários nós distribuem a carga de trabalho pelo cluster, garantindo que, se um nó falhar, os outros nós podem assumir as tarefas, evitando o tempo de inatividade e as interrupções do serviço.
- Escalabilidade: ter vários nós permite o escalonamento horizontal adicionando ou removendo nós conforme necessário, garantindo a alocação ideal de recursos e acomodando o aumento do tráfego ou das exigências de carga de trabalho.
- Alta disponibilidade: a utilização de várias zonas numa região garante a redundância e minimiza o risco de um único ponto de falha. Se uma zona de disponibilidade inteira sofrer uma interrupção, o cluster pode continuar a ser executado noutras zonas, mantendo a disponibilidade do serviço.
- Redundância geográfica: ao abranger nós em várias regiões, os dados e os serviços do cluster são distribuídos geograficamente, o que oferece resiliência contra desastres naturais, falhas de energia ou outras interrupções locais que possam afetar uma única zona.
- Atualizações contínuas e manutenção: ao usar vários nós, pode fazer atualizações contínuas e manutenção em nós individuais sem afetar a disponibilidade geral do cluster. Isto garante um serviço contínuo enquanto lhe permite fazer as atualizações necessárias e aplicar patches de forma integrada.
- Contratos de nível de serviço (SLAs): Google Cloud oferece SLAs para implementações em várias zonas, garantindo um nível mínimo de tempo de atividade e disponibilidade.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização prevista,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, IAM, GKE, and Resource Manager APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable compute.googleapis.com
iam.googleapis.com container.googleapis.com cloudresourcemanager.googleapis.com -
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith 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_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Compute Engine, IAM, GKE, and Resource Manager APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable compute.googleapis.com
iam.googleapis.com container.googleapis.com cloudresourcemanager.googleapis.com -
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/compute.securityAdmin, roles/compute.viewer, roles/container.clusterAdmin, roles/container.admin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUsergcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
Replace the following:
PROJECT_ID: Your project ID.USER_IDENTIFIER: The identifier for your user account. For example,myemail@example.com.ROLE: The IAM role that you grant to your user account.
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-central1Substitua
PROJECT_ID: seu Google Cloud pelo seu ID do projeto.Clone o repositório do GitHub:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesAltere para o diretório de trabalho:
cd kubernetes-engine-samples/databases/redis-enterprise-operator- 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)
Crie espaços de nomes para o REC e as respetivas aplicações:
kubectl create namespace rec-ns kubectl create namespace applicationEtiquete os espaços de nomes:
kubectl label namespace rec-ns connection=redis kubectl label namespace application connection=redisObtenha 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.yamlO 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 createdAplique o manifesto ao cluster:
kubectl apply -n rec-ns -f manifests/01-basic-cluster/rec.yamlO comando pode demorar vários minutos a ser concluído.
Verifique o estado da implementação do REC:
kubectl get rec -n rec-nsO 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 4m7sO cluster está pronto quando
STATEéRUNNING.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-nsObtenha 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.yamlImplemente o webhook de validação:
sed -i -e 's/CRT/'$CERT'/g' manifests/01-basic-cluster/webhook.yamlO 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 EOFO 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']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 applicationCrie 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.yamlEdite 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-nsCada 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-nsO 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 172mCrie bases de dados Redis Enterprise nos espaços de nomes das aplicações:
kubectl apply -f manifests/01-basic-cluster/a-rdb.yaml -n applicationVerifique o estado do REDB:
kubectl get redb --all-namespacesO 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 15sVerifique se os serviços de cada REDB estão em execução:
kubectl get svc --all-namespacesO 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 72mVerifique se o Secret foi criado:
kubectl get secrets -n applicationO resultado é semelhante ao seguinte:
NAME TYPE DATA AGE redb-app-db Opaque 3 96mCrie o pod do cliente:
kubectl apply -n application -f manifests/03-auth/client_pod.yamlLigue-se ao pod do cliente:
kubectl exec -n application -i -t redis-client -c redis-client -- /bin/shAssocie à base de dados:
redis-cli -h $SERVICE -p $PORT --pass $PASSCrie uma chave:
SET mykey "Hello World"O resultado é semelhante ao seguinte:
OKObtenha a chave:
GET mykeyO resultado é semelhante ao seguinte:
"Hello World"Saia da shell do Pod
exit- Um pod do Redis que recolhe métricas no caminho
/e na porta8070 - Recolhedores baseados no Prometheus que processam as métricas do pod do Redis
- Um recurso
PodMonitoringque envia métricas para o Cloud Monitoring Crie a implementação metrics-proxy:
kubectl apply -n rec-ns -f manifests/02-prometheus-metrics/metrics-proxy.yamlUma vez que o operador só fornece um ponto final HTTPS com o certificado autoassinado e o recurso
PodMonitoringnão suporta a desativação da validação do certificado TLS, usa o podmetrics-proxycomo 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.yamlNa 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 o painel de controlo:
gcloud --project "${PROJECT_ID}" monitoring dashboards create --config-from-file monitoring/dashboard.jsonO 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.
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.yamlA 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.yamlEstabeleça ligação ao pod do cliente e prepare as variáveis:
kubectl exec -it redis-client-c -n rec-ns -- /bin/bashUse a ferramenta
redis-clipara 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"; \ doneAtualize 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
exitDefina variáveis de ambiente.
export PROJECT_ID=${PROJECT_ID} export KUBERNETES_CLUSTER_PREFIX=redis export REGION=us-central1Execute o comando
terraform destroy:export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token) cd terraform/gke-standard terraform destroy -var project_id=${PROJECT_ID} \ -var region=${REGION} \ -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}Quando lhe for pedido, escreva
yes.Encontre todos os discos não anexados:
export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,zone)")Elimine os discos:
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 doneElimine o repositório do GitHub:
rm -r ~/kubernetes-engine-samples/- Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.
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:
Crie a infraestrutura do cluster
Nesta secção, executa um script do Terraform para criar um cluster do GKE regional privado de alta disponibilidade e 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:
O resultado é semelhante ao seguinte:
...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.
...
Estabeleça ligação ao cluster
Usando o Cloud Shell, configure kubectl para comunicar com o cluster:
gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --location ${REGION}
Implemente o operador Redis Enterprise no seu cluster
Nesta secção, implementa o operador do Redis Enterprise no seu cluster do Kubernetes.
Implemente o Redis Enterprise Cluster
Opcional: configure o controlador de admissão
Opcionalmente, pode configurar a infraestrutura para a validação da base de dados na implementação.
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.
Implemente bases de dados Redis Enterprise
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.
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:
O operador Redis Enterprise expõe as métricas do cluster no formato Prometheus.
Crie um painel de controlo
Pode ver as métricas criando um painel de controlo.
Valide as métricas exportadas
Para validar as métricas, crie uma nova base de dados e examine as métricas.
Limpar
Elimine o projeto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID