Crea un deployment multicluster per Spanner Omni su Kubernetes

Questo documento descrive come configurare un deployment di Spanner Omni in più cluster Kubernetes. Puoi eseguire il deployment di Spanner Omni con o senza crittografia TLS. Se utilizzi la crittografia, Spanner Omni utilizza Transport Layer Security (TLS) 1.3 per criptare e autenticare la comunicazione all'interno del deployment e con i relativi client.

Un deployment senza crittografia TLS presenta i seguenti rischi per la sicurezza:

  • Chiunque può accedere al deployment se può raggiungere il suo indirizzo IP.
  • Non è presente alcuna crittografia di rete tra il client e il server o tra i pod.

A causa di questi rischi, evita un deployment non configurato con la crittografia TLS per gli ambienti di produzione.

La versione Anteprima di Spanner Omni non supporta la crittografia TLS e smette di scrivere dati 90 giorni dopo la creazione di un deployment. Per l'accesso in anteprima alla versione con tutte le funzionalità, contatta Google.

Prima di iniziare

Per prepararti all'implementazione, soddisfa questi requisiti:

  • Crea più cluster Kubernetes in ogni località per il deployment. I cluster possono essere zonali se esegui il deployment in una sola zona del cluster. Spanner Omni supporta la configurazione del grafico Helm per gli ambienti Google Kubernetes Engine (GKE) e Amazon Elastic Kubernetes Service (Amazon EKS). Altri ambienti potrebbero richiedere configurazioni personalizzate.

  • Accedere all'immagine container ospitata in Artifact Registry.

  • Installa e configura lo strumento a riga di comando kubectl e Helm.

  • Se configuri l'ambiente Kubernetes sulle macchine della piattaforma di virtualizzazione vSphere, disattiva la virtualizzazione del contatore di timestamp (TSC) aggiungendo monitor_control.virtual_rdtsc = FALSE al file di configurazione .vmx della macchina virtuale. Ciò consente a TrueTime di funzionare correttamente.

  • Configura la rete del cluster Kubernetes in modo che i pod di un cluster possano connettersi ai pod di un altro cluster. Per impostazione predefinita, Spanner Omni utilizza le porte TCP da 15000 a 15025 per la comunicazione interna. Per attivare la comunicazione tra i pod in questi cluster, apri queste porte per il traffico.

  • Configura il DNS del cluster per risolvere il nome host di un pod, ad esempio spanner-a-0.pod.spanner-ns-r1, nel suo indirizzo IP. Spanner Omni richiede la risoluzione del nome host per le connessioni TCP tra i pod in cluster diversi.

Prepara la configurazione del grafico Helm

Crea una configurazione Helm. Per saperne di più, consulta Creare una configurazione Helm.

Poiché si tratta di un deployment multicluster, assicurati che il file YAML di configurazione di Helm includa quanto segue:

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

deployment:
  multiCluster: true

Esempio di configurazione del grafico Helm per il deployment multicluster

Di seguito è riportato un esempio di grafico Helm configurato per un deployment multi-cluster Spanner Omni. Questa configurazione crea un deployment in tre regioni Google Cloud : us-west1, us-west2 e us-west3. Il deployment è distribuito su cinque zone, ognuna delle quali rappresenta una replica. Le repliche in us-west1 e us-west2 sono di lettura/scrittura, mentre l'unica replica in us-west3 è una replica di controllo.

# 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.

Configura kubectl per connettersi a più cluster

Prima di procedere, crea cluster con contesti kubectl. Ad esempio, nel file YAML di configurazione Helm, puoi denominare i contesti in base alla località, ad esempio ctx-usw1, ctx-usw2 e ctx-usw3.

Configura la crittografia TLS

Se stai configurando un deployment senza crittografia, vai a Installa un grafico Helm per ogni cluster.

Per configurare la crittografia TLS in un deployment multicluster, devi creare un'autorità di certificazione (CA) e generare certificati per ogni cluster. Per saperne di più, consulta Aggiungere la crittografia TLS al deployment Kubernetes.

Genera i certificati

Crea la CA e i certificati per il server e l'API. I certificati del server e dell'API devono includere gli host di tutti i cluster.

Crea il certificato server Spanner Omni

I server Spanner Omni utilizzano i certificati server per criptare la comunicazione tra server.

Per creare il certificato server, esegui il comando seguente. Sostituisci SERVER_LIST con un elenco separato da virgole di FQDN dei pod server Spanner Omni o utilizza caratteri jolly.

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

Crea il certificato API

I certificati API criptano la comunicazione dai sistemi che interagiscono con il deployment.

Per creare il certificato API, esegui il comando seguente. Sostituisci OMNI_ENDPOINT con gli endpoint di servizio per ogni 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

Esegui il push dei certificati in ogni cluster Kubernetes

Per ogni cluster, crea lo spazio dei nomi e un secret generico che contenga i certificati.

# 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>

Installa un grafico Helm per ogni cluster

Crea una configurazione Helm. Per saperne di più, consulta Creare una configurazione Helm.

Per un deployment multicluster, applica la configurazione del grafico Helm dal file di configurazione Helm a ogni cluster Kubernetes. In ogni comando, scegli come target una posizione specifica e il relativo spazio dei nomi per associarla al deployment di Spanner Omni. Applica la configurazione a ogni posizione nello stesso ordine in cui sono elencate nel file di configurazione Helm. Quando applichi la configurazione alla posizione finale, il sistema crea un job di bootstrap del deployment nel cluster.

Prima di installare Helm per ogni cluster, crea lo spazio dei nomi di monitoraggio sul cluster in cui prevedi di ospitare lo stack di osservabilità:

kubectl create namespace monitoring --context ctx-usw1

Esempi di comandi di installazione del grafico Helm

I seguenti comandi installano un grafico Helm sui cluster. In ogni comando, PATH_TO_HELM_CONFIG_FILE è il percorso del file YAML di configurazione del grafico Helm che hai creato per il deployment.

Installare un grafico in us-west1 con il monitoraggio abilitato

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

Installare un grafico in us-west2 senza monitoraggio

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

Installare un grafico in us-west3 senza monitoraggio

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

Seguire l'avanzamento del deployment

Dopo aver applicato la configurazione del grafico Helm, in ogni cluster Kubernetes viene avviato un job di bootstrap. Dopo l'avvio del job di bootstrap nell'ultimo cluster, esegui il seguente comando per seguire il processo di deployment:

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

Se i log indicano che il deployment non riesce a raggiungere tutti i server, assicurati che il servizio DNS su ogni cluster sia configurato correttamente.

Configura il servizio DNS del cluster

Se utilizzi un DNS esterno con il tuo cluster Kubernetes e gestisce le voci DNS per i servizi headless, puoi saltare questo passaggio.

Spanner utilizza il nome host del pod per tutte le comunicazioni interne. Configura il DNS in modo che i pod possano risolvere i nomi host anche quando vengono eseguiti in cluster Kubernetes diversi. Per farlo, esponi il servizio kube-dns in ogni cluster in modo che gli altri cluster possano raggiungerlo eseguendo lo script dns-setup.sh.

Questo script esegue il deployment di un servizio di bilanciamento del carico in ogni cluster per l'applicazione kube-dns e aggiorna la configurazione DNS in modo che punti ai servizi di bilanciamento del carico. Anche se dns-setup.sh configura kube-dns e CoreDNS in GKE e Amazon EKS, potrebbe essere necessario configurarlo per il tuo ambiente.

Per configurare il servizio DNS del cluster:

  1. Se non l'hai ancora fatto, scarica lo script dns-setup.sh dal bucket Cloud Storage spanner-omni.

    Vai al bucket Spanner Omni

  2. Esegui lo script dns-setup.sh:

    dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTS
    
    • Sostituisci CSV_NAME_SPACE_LIST con un elenco separato da virgole dei tuoi spazi dei nomi.

    • Sostituisci CONTEXTS con un elenco dei tuoi contesti.

    Di seguito è riportato un esempio di utilizzo dello script dns-setup.sh:

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

Dopo aver eseguito lo script, controlla i log del job di deployment. I messaggi indicano che l'implementazione è in corso e viene visualizzato un messaggio Deployment created successfully.

Aggiorna il certificato API

Se stai configurando il deployment senza crittografia TLS, vai a Interagisci con Spanner Omni.

Per implementare la crittografia TLS, devi aggiornare il certificato API con gli indirizzi IP esterni o i nomi DNS dei bilanciatori del carico per ogni cluster. In questo modo, i client possono connettersi al deployment tramite canali sicuri.

  1. Recupera i dettagli del servizio per ogni 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. Aggiorna il certificato API con gli indirizzi IP esterni:

    # 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. Aggiorna i secret in ogni cluster Kubernetes con il nuovo certificato 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)\"}}"
    

Interagire con Spanner Omni

Ogni cluster in una configurazione multi-cluster ha un servizio di bilanciamento del carico. Puoi utilizzare uno qualsiasi degli indirizzi IP esterni del servizio per interagire con Spanner Omni. Per le scritture e le letture coerenti, utilizza l'indirizzo che funge da regione leader. Per le richieste di lettura dati inattivi, utilizza la regione più vicina alla tua applicazione per ottenere prestazioni ottimali.

  1. Esegui questo comando per ottenere l'indirizzo di emergenza:

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

    EXTERNAL-IP:PORT è DEPLOYMENT_ENDPOINT per la tua implementazione.

  2. Se non l'hai ancora fatto, scarica Spanner Omni CLI dal bucket Cloud Storage spanner-omni.

    Vai al bucket Spanner Omni

  3. Se hai creato un deployment con crittografia TLS, devi includere il certificato CA in ogni comando per stabilire una connessione criptata. Se hai abilitato mTLS per i client, includi anche la directory dei certificati client.

    • --ca-certificate-file=certs/ca-api.crt
    • --client-certificate-directory=clientcerts
  4. Utilizza la CLI Spanner Omni per creare un database GoogleSQL o PostgreSQL e interagire con esso.

    GoogleSQL

    Per creare un database GoogleSQL e interagire con esso, esegui il comando seguente:

    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

    Per creare un database PostgreSQL e interagire con esso, esegui il comando seguente:

    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
    

    Puoi anche interagire con un database PostgreSQL seguendo le istruzioni riportate in Connettersi utilizzando PGAdapter per configurare PGAdapter e utilizzare gli strumenti PostgreSQL, come psql, con i database di dialetti PostgreSQL.

Passaggi successivi