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
kubectle 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 = FALSEal file di configurazione.vmxdella 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:
Se non l'hai ancora fatto, scarica lo script
dns-setup.shdal bucket Cloud Storagespanner-omni.Esegui lo script
dns-setup.sh:dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTSSostituisci 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.
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-usw3Aggiorna 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 --overwriteAggiorna 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.
Esegui questo comando per ottenere l'indirizzo di emergenza:
kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1EXTERNAL-IP:PORTè DEPLOYMENT_ENDPOINT per la tua implementazione.Se non l'hai ancora fatto, scarica Spanner Omni CLI dal bucket Cloud Storage
spanner-omni.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
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.crtPostgreSQL
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.crtPuoi 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
- Scopri come utilizzare le librerie client e i driver JDBC per connettere la tua applicazione al deployment.