Criar uma implantação de vários clusters para o Spanner Omni no Kubernetes

Este documento descreve como configurar uma implantação do Spanner Omni em vários clusters do Kubernetes. É possível implantar o Spanner Omni com ou sem criptografia TLS. Se você usar a criptografia, o Spanner Omni usará o Transport Layer Security (TLS) 1.3 para criptografar e autenticar a comunicação na implantação e com os clientes.

Uma implantação sem criptografia TLS tem os seguintes riscos de segurança:

  • Qualquer pessoa pode acessar a implantação se puder acessar o endereço IP dela.
  • Não há criptografia de rede entre o cliente e o servidor ou entre os pods.

Devido a esses riscos, evite uma implantação que não esteja configurada com criptografia TLS para ambientes de produção.

A versão de visualização do Spanner Omni não oferece suporte à criptografia TLS e para de gravar dados 90 dias após você criar uma implantação. Para acesso antecipado à edição com recursos completos, entre em contato com o Google.

Antes de começar

Para se preparar para a implantação, atenda a estes requisitos:

  • Crie vários clusters do Kubernetes em cada local para sua implantação. Os clusters podem ser zonais se você implantar em apenas uma zona nesse cluster. O Spanner Omni oferece suporte à configuração de gráficos do Helm para ambientes do Google Kubernetes Engine (GKE) e do Amazon Elastic Kubernetes Service (Amazon EKS). Outros ambientes podem exigir configurações personalizadas.

  • Tenha acesso à imagem do contêiner hospedada no Artifact Registry.

  • Instale e configure a kubectl ferramenta de linha de comando e o Helm.

  • Se você configurar o ambiente do Kubernetes em máquinas da plataforma de virtualização vSphere, desative a virtualização do Time Stamp Counter (TSC) adicionando monitor_control.virtual_rdtsc = FALSE ao arquivo de configuração .vmx da máquina virtual. Isso ajuda o TrueTime a funcionar corretamente.

  • Configure a rede de clusters do Kubernetes para que os pods em um cluster possam se conectar a pods em outro cluster. Por padrão, o Spanner Omni usa as portas TCP 15000 a 15025 para comunicação interna. Para ativar a comunicação entre pods nesses clusters, abra essas portas para tráfego.

  • Configure o DNS do cluster para resolver o nome do host de um pod, como spanner-a-0.pod.spanner-ns-r1, para o endereço IP dele. O Spanner Omni exige a resolução do nome do host para conexões TCP entre pods em clusters diferentes.

Preparar a configuração do gráfico do Helm

Crie uma configuração do Helm. Para mais informações, consulte Criar uma configuração do Helm.

O número de servidores raiz por zona precisa ser um número ímpar entre um e nove, inclusive, para garantir o quórum de consistência. Se o número de servidores for par, as implantações poderão falhar. Ao configurar as zonas, designe servidores como servidores raiz. Recomendamos que você use um para desenvolvimento ou teste e três para zonas de produção de alta disponibilidade.

Como essa é uma implantação de vários clusters, verifique se o arquivo YAML de configuração do Helm inclui o seguinte:

# This is required for a multi-cluster deployment setup.

deployment:
  multiCluster: true

Exemplo de configuração de gráfico do Helm para implantação de vários clusters

A seguir, apresentamos um exemplo de gráfico do Helm configurado para uma implantação de vários clusters do Spanner Omni. Essa configuração cria uma implantação em três Google Cloud regiões: us-west1, us-west2, e us-west3. A implantação é distribuída em cinco zonas, com cada zona representando uma réplica. As réplicas em us-west1 e us-west2 são de leitura/gravação, enquanto a réplica única em us-west3 é uma réplica de testemunha.

# The platform of the deployment
global:
  platform: gke

# This is required for a multi-cluster deployment setup.
deployment:
  multiCluster: true

# Locations and zones where clusters are created for the deployment
locations:
  - name: us-west1
    namespace: spanner-ns-usw1
    zones:
      - name: "us-west1-a"
        shortName: "a"
      - name: "us-west1-b"
        shortName: "b"
  - name: us-west2
    namespace: spanner-ns-usw2
    zones:
      - name: "us-west2-a"
        shortName: "a"
      - name: "us-west2-b"
        shortName: "b"
  - name: us-west3
    namespace: spanner-ns-usw3
    zones:
      - name: "us-west3-a"
        shortName: "a"
        replicaType: WITNESS

# Remaining configuration like storage, resources, isn't included in this sample.

Configurar o kubectl para se conectar a vários clusters

Antes de continuar, crie clusters com contextos kubectl. Por exemplo, no arquivo YAML de configuração do Helm, é possível nomear os contextos com base no local, como ctx-usw1, ctx-usw2 e ctx-usw3.

Configurar a criptografia TLS

Se você estiver configurando uma implantação sem criptografia, pule para Instalar um gráfico do Helm para cada cluster.

Para configurar a criptografia TLS em uma implantação de vários clusters, é necessário criar uma autoridade certificadora (AC) e gerar certificados para cada cluster. Para mais informações, consulte Adicionar criptografia TLS à implantação do Kubernetes.

Gerar os certificados

Crie a AC e os certificados para o servidor e a API. Os certificados do servidor e da API precisam incluir os hosts de todos os clusters.

Criar o certificado do servidor do Spanner Omni

Os servidores do Spanner Omni usam certificados de servidor para criptografar a comunicação entre servidores.

Para criar o certificado do servidor, execute o seguinte. Substitua SERVER_LIST por uma lista separada por vírgulas de FQDNs de pods do servidor do Spanner Omni ou use curingas.

SERVER_NAMES=*.pod.spanner-ns-usw1,*.pod.spanner-ns-usw2,*.pod.spanner-ns-usw3
Spanner Omni CLI certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Criar o certificado da API

Os certificados de API criptografam a comunicação de sistemas que interagem com a implantação.

Para criar o certificado da API, execute o seguinte. Substitua OMNI_ENDPOINT pelos endpoints de serviço de cada cluster.

OMNI_ENDPOINT=spanner.spanner-ns-usw1,spanner.spanner-ns-usw2,spanner.spanner-ns-usw3
Spanner Omni CLI certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

Enviar os certificados para cada cluster do Kubernetes

Para cada cluster, crie o namespace e um secret genérico que contenha os certificados.

# Repeat for each context (for example, ctx-usw1, ctx-usw2, ctx-usw3)
# Replace NAMESPACE with the appropriate namespace for each region

kubectl create namespace <var>NAMESPACE</var> --context <var>CONTEXT</var>
kubectl create secret generic tls-certs \
  --from-file=ca.crt="certs/ca.crt" \
  --from-file=ca-api.crt="certs/ca-api.crt" \
  --from-file=server.crt="certs/server.crt" \
  --from-file=server.key="certs/server.key" \
  --from-file=api.crt="certs/api.crt" \
  --from-file=api.key="certs/api.key" \
  -n <var>NAMESPACE</var> \
  --context <var>CONTEXT</var>

Instalar um gráfico do Helm para cada cluster

Crie uma configuração do Helm. Para mais informações, consulte Criar uma configuração do Helm.

Para uma implantação de vários clusters, aplique a configuração do gráfico do Helm do arquivo de configuração do Helm a cada cluster do Kubernetes. Em cada comando, direcione um local específico e o namespace dele para vinculá-lo à implantação do Spanner Omni. Aplique a configuração a cada local na mesma ordem listada no arquivo de configuração do Helm. Quando você aplica a configuração ao local final, o sistema cria um job de inicialização da implantação nesse cluster.

Antes de instalar o Helm para cada cluster, crie o namespace de monitoramento no cluster em que você planeja hospedar a pilha de observabilidade:

kubectl create namespace monitoring --context ctx-usw1

Exemplos de comandos de instalação de gráficos do Helm

Os comandos a seguir instalam um gráfico do Helm em clusters. Em cada comando, PATH_TO_HELM_CONFIG_FILE é o caminho para o arquivo YAML de configuração do gráfico do Helm que você criou para sua implantação.

Instalar um gráfico em us-west1 com o monitoramento ativado

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
  -f PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw1 \
  --set currentLocation=us-west1 \
  --set monitoring.enabled=true \
  --create-namespace \
  --kube-context ctx-usw1

Instalar um gráfico em us-west2 sem monitoramento

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
  -f  PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw2 \
  --set currentLocation=us-west2 \
  --create-namespace \
  --kube-context ctx-usw2

Instalar um gráfico em us-west3 sem monitoramento

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.1.0 \
  -f  PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw3 \
  --set currentLocation=us-west3 \
  --create-namespace \
  --kube-context ctx-usw3

Acompanhar o progresso da implantação

Depois de aplicar a configuração do gráfico do Helm, um job de inicialização é iniciado em cada cluster do Kubernetes. Depois que o job de inicialização for iniciado no último cluster, execute o comando a seguir para acompanhar o processo de implantação:

kubectl logs -n spanner-ns-usw3 -l app.kubernetes.io/component=bootstrap -f

Se os registros indicarem que a implantação não consegue alcançar todos os servidores, verifique se o serviço DNS em cada cluster está configurado corretamente.

Configurar o serviço DNS do cluster

Se você estiver usando um DNS externo com o cluster do Kubernetes e ele gerenciar entradas de DNS para serviços sem periféricos, pule esta etapa.

O Spanner usa o nome do host do pod para toda a comunicação interna. Configure o DNS para que os pods possam resolver nomes de host mesmo quando executados em clusters diferentes do Kubernetes. Para fazer isso, exponha o serviço kube-dns em cada cluster para que outros clusters possam acessá-lo executando o script dns-setup.sh.

Esse script implanta um serviço de balanceador de carga em cada cluster para o aplicativo kube-dns e atualiza a configuração de DNS para apontar para os serviços de balanceador de carga. Embora dns-setup.sh configure kube-dns e CoreDNS no GKE e no Amazon EKS, talvez seja necessário configurá-lo para seu ambiente.

Para configurar o serviço DNS do cluster:

  1. Se ainda não tiver feito isso, faça o download do script dns-setup.sh do bucket do Cloud Storage spanner-omni.

    Acessar o bucket do Spanner Omni

  2. Execute o script dns-setup.sh:

    dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTS
    
    • Substitua CSV_NAME_SPACE_LIST por uma lista separada por vírgulas dos seus namespaces.

    • Substitua CONTEXTS por uma lista dos seus contextos.

    A seguir, apresentamos um exemplo de uso do script dns-setup.sh:

    dns-setup.sh -n spanner-ns-usw1,spanner-ns-usw2,spanner-ns-usw3 ctx-usw1 ctx-usw2 ctx-usw3
    

Depois de executar o script, verifique os registros do job de implantação. As mensagens indicam que a implantação está em andamento e uma mensagem Deployment created successfully aparece.

Atualizar o certificado da API

Se você estiver configurando a implantação sem criptografia TLS, acesse Interagir com o Spanner Omni.

Para implementar a criptografia TLS, é necessário atualizar o certificado da API com os endereços IP externo ou nomes DNS dos balanceadores de carga de cada cluster. Isso garante que os clientes possam se conectar à implantação por canais seguros.

  1. Receba os detalhes do serviço de cada cluster:

    kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1
    kubectl get service spanner -n spanner-ns-usw2 --context ctx-usw2
    kubectl get service spanner -n spanner-ns-usw3 --context ctx-usw3
    
  2. Atualize o certificado da API com os endereços IP externo:

    # Replace <var>EXTERNAL_IP_USW1</var>, <var>EXTERNAL_IP_USW2</var>, and <var>EXTERNAL_IP_USW3</var>
    # with the actual external IP addresses or DNS names.
    
    OMNI_ENDPOINT=<var>EXTERNAL_IP_USW1</var>,<var>EXTERNAL_IP_USW2</var>,<var>EXTERNAL_IP_USW3</var>,spanner.spanner-ns.svc
    Spanner Omni CLI certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output_directory certs --overwrite
    
  3. Atualize os secrets em cada cluster do Kubernetes com o novo certificado da API:

    # Repeat for each context
    kubectl patch secret tls-certs -n spanner-ns-usw1 --context ctx-usw1 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
    kubectl patch secret tls-certs -n spanner-ns-usw2 --context ctx-usw2 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
    kubectl patch secret tls-certs -n spanner-ns-usw3 --context ctx-usw3 -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"
    

Interagir com o Spanner Omni

Cada cluster em uma configuração de vários clusters tem um serviço de balanceador de carga. É possível usar qualquer um dos endereços IP externo do serviço para interagir com o Spanner Omni. Para gravações e leituras fortes, use o endereço que atua como a região líder. Para solicitações de leitura desatualizada, use a região mais próxima do aplicativo para alcançar o desempenho ideal.

  1. Execute o comando a seguir para receber o endereço do serviço:

    kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1
    

    O EXTERNAL-IP:PORT é o DEPLOYMENT_ENDPOINT da sua implantação.

  2. Se ainda não tiver feito isso, faça o download da CLI do Spanner Omni do bucket do Cloud Storage spanner-omni.

    Acessar o bucket do Spanner Omni

  3. Se você criou uma implantação com criptografia TLS, inclua o certificado de AC com cada comando para estabelecer uma conexão criptografada. Se você ativou o mTLS para clientes, inclua também o diretório de certificados do cliente.

    • --ca-certificate-file=certs/ca-api.crt
    • --client-certificate-directory=clientcerts
  4. Use a CLI do Spanner Omni para criar um banco de dados GoogleSQL ou PostgreSQL e interagir com ele.

    GoogleSQL

    Para criar e interagir com um banco de dados GoogleSQL, execute o seguinte:

    Spanner Omni CLI databases create DATABASE_NAME \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    Spanner Omni CLI sql --database=DATABASE_NAME \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    

    PostgreSQL

    Para criar e interagir com um banco de dados PostgreSQL, execute o seguinte:

    Spanner Omni CLI databases create POSTGRESQL_DATABASE_NAME \
      --database_dialect POSTGRESQL \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    Spanner Omni CLI sql --database=POSTGRESQL_DATABASE_NAME \
      --deployment-endpoint=dns:///DEPLOYMENT_ENDPOINT \
      --ca-certificate-file=certs/ca-api.crt
    

    Também é possível interagir com um banco de dados PostgreSQL seguindo as instruções em Conectar usando o PGAdapter para configurar o PGAdapter e usar ferramentas do PostgreSQL, como psql, com seus bancos de dados de dialeto PostgreSQL.

A seguir