In diesem Dokument wird beschrieben, wie Sie eine Spanner Omni-Bereitstellung in mehreren Kubernetes-Clustern einrichten. Sie können Spanner Omni mit oder ohne TLS-Verschlüsselung bereitstellen. Wenn Sie die Verschlüsselung verwenden, verschlüsselt und authentifiziert Spanner Omni die Kommunikation innerhalb der Bereitstellung und mit ihren Clients mit Transport Layer Security (TLS) 1.3.
Eine Bereitstellung ohne TLS-Verschlüsselung birgt die folgenden Sicherheitsrisiken:
- Jeder kann auf die Bereitstellung zugreifen, wenn er ihre IP-Adresse erreichen kann.
- Es gibt keine Netzwerkverschlüsselung zwischen dem Client und dem Server oder zwischen den Pods.
Aufgrund dieser Risiken sollten Sie für Produktionsumgebungen keine Bereitstellung verwenden, die nicht mit TLS-Verschlüsselung konfiguriert ist.
Die Vorschauversion von Spanner Omni unterstützt keine TLS-Verschlüsselung und beendet das Schreiben von Daten 90 Tage nach der Erstellung einer Bereitstellung. Wenn Sie Vorabzugriff auf die Version mit allen Funktionen erhalten möchten, wenden Sie sich an Google.
Hinweis
Führen Sie die folgenden Schritte aus, um sich auf die Bereitstellung vorzubereiten:
Erstellen Sie an jedem Standort mehrere Kubernetes-Cluster für Ihre Bereitstellung. Cluster können zonal sein, wenn Sie die Bereitstellung nur in einer Zone in diesem Cluster vornehmen. Spanner Omni unterstützt die Helm-Diagrammkonfiguration für Google Kubernetes Engine (GKE) und Amazon Elastic Kubernetes Service (Amazon EKS)-Umgebungen. Für andere Umgebungen sind möglicherweise benutzerdefinierte Konfigurationen erforderlich.
Rufen Sie das in Artifact Registry gehostete Container-Image auf.
Installieren und konfigurieren Sie das
kubectlBefehlszeilentool und Helm.Wenn Sie die Kubernetes-Umgebung auf Maschinen der vSphere-Virtualisierungsplattform einrichten, deaktivieren Sie die TSC-Virtualisierung (Time Stamp Counter), indem Sie der
.vmx-Konfigurationsdatei der virtuellen Maschinemonitor_control.virtual_rdtsc = FALSEhinzufügen. So funktioniert TrueTime richtig.Konfigurieren Sie das Kubernetes-Clusternetzwerk so, dass Pods in einem Cluster eine Verbindung zu Pods in einem anderen Cluster herstellen können. Standardmäßig verwendet Spanner Omni die TCP-Ports 15000 bis 15025 für die interne Kommunikation. Wenn Sie die Kommunikation zwischen Pods in diesen Clustern ermöglichen möchten, öffnen Sie diese Ports für den Traffic.
Konfigurieren Sie das Cluster-DNS so, dass der Hostname eines Pods, z. B.
spanner-a-0.pod.spanner-ns-r1, in seine IP-Adresse aufgelöst wird. Für Spanner Omni ist die Hostnameauflösung für TCP-Verbindungen zwischen Pods in verschiedenen Clustern erforderlich.
Helm-Diagrammkonfiguration vorbereiten
Erstellen Sie eine Helm-Konfiguration. Weitere Informationen finden Sie unter Helm-Konfiguration erstellen.
Da es sich um eine Multi-Cluster-Bereitstellung handelt, muss die YAML-Datei der Helm-Konfiguration Folgendes enthalten:
# This is required for a multi-cluster deployment setup.
deployment:
multiCluster: true
Beispiel für eine Helm-Diagrammkonfiguration für die Multi-Cluster-Bereitstellung
Das folgende Beispiel zeigt ein Helm-Diagramm, das für eine Spanner Omni-Multi-Cluster-Bereitstellung konfiguriert ist. Mit dieser Konfiguration wird
eine Bereitstellung in drei Google Cloud Regionen erstellt: us-west1, us-west2,
und us-west3. Die Bereitstellung ist auf fünf Zonen verteilt, wobei jede Zone ein Replikat darstellt. Die Replikate in us-west1 und us-west2 sind Lese-/Schreibreplikate, während das einzelne Replikat in us-west3 ein Zeugenreplikat ist.
# 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.
kubectl für die Verbindung mit mehreren Clustern konfigurieren
Erstellen Sie zuerst Cluster mit kubectl-Kontexten. In der
YAML-Datei der Helm-Konfiguration können Sie die Kontexte beispielsweise nach Standort benennen, z. B. ctx-usw1, ctx-usw2, und
ctx-usw3.
TLS-Verschlüsselung konfigurieren
Wenn Sie eine Bereitstellung ohne Verschlüsselung einrichten, fahren Sie mit Helm-Diagramm für jeden Cluster installieren fort.
Wenn Sie die TLS-Verschlüsselung für eine Multi-Cluster-Bereitstellung konfigurieren möchten, müssen Sie eine Zertifizierungsstelle (Certificate Authority, CA) erstellen und Zertifikate für jeden Cluster generieren. Weitere Informationen finden Sie unter TLS-Verschlüsselung zu Ihrer Kubernetes-Bereitstellung hinzufügen.
Zertifikate generieren
Erstellen Sie die Zertifizierungsstelle und die Zertifikate für den Server und die API. Die Server- und API-Zertifikate müssen die Hosts aus allen Clustern enthalten.
Spanner Omni-Serverzertifikat erstellen
Die Spanner Omni-Server verwenden Serverzertifikate, um die Kommunikation zwischen den Servern zu verschlüsseln.
Führen Sie Folgendes aus, um das Serverzertifikat zu erstellen. Ersetzen Sie SERVER_LIST durch eine durch Kommas getrennte Liste der Spanner Omni-Server-Pod-FQDNs oder verwenden Sie Platzhalter.
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
API-Zertifikat erstellen
API-Zertifikate verschlüsseln die Kommunikation von Systemen, die mit der Bereitstellung interagieren.
Führen Sie Folgendes aus, um das API-Zertifikat zu erstellen. Ersetzen Sie OMNI_ENDPOINT durch die Dienstendpunkte für jeden 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
Zertifikate per Push an jeden Kubernetes-Cluster übertragen
Erstellen Sie für jeden Cluster den Namespace und ein generisches Secret, das die Zertifikate enthält.
# 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>
Helm-Diagramm für jeden Cluster installieren
Erstellen Sie eine Helm-Konfiguration. Weitere Informationen finden Sie unter Helm-Konfiguration erstellen.
Wenden Sie für eine Multi-Cluster-Bereitstellung die Helm-Diagrammkonfiguration aus der Helm-Konfigurationsdatei auf jeden Kubernetes-Cluster an. Geben Sie in jedem Befehl einen bestimmten Standort und seinen Namespace an, um ihn an die Spanner Omni-Bereitstellung zu binden. Wenden Sie die Konfiguration in derselben Reihenfolge auf jeden Standort an, wie sie in der Helm-Konfigurationsdatei aufgeführt ist. Wenn Sie die Konfiguration auf den letzten Standort anwenden, erstellt das System einen Bootstrap-Job für die Bereitstellung in diesem Cluster.
Bevor Sie Helm für jeden Cluster installieren, erstellen Sie den Monitoring-Namespace auf dem Cluster, auf dem Sie den Observability-Stack hosten möchten:
kubectl create namespace monitoring --context ctx-usw1
Beispiele für Helm-Diagramm-Installationsbefehle
Mit den folgenden Befehlen wird ein Helm-Diagramm in Clustern installiert. In jedem Befehl ist PATH_TO_HELM_CONFIG_FILE der Pfad zur YAML-Datei der Helm-Diagrammkonfiguration, die Sie für Ihre Bereitstellung erstellt haben.
Diagramm in us-west1 mit aktiviertem Monitoring installieren
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
Diagramm in us-west2 ohne Monitoring installieren
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
Diagramm in us-west3 ohne Monitoring installieren
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
Fortschritt der Bereitstellung verfolgen
Nachdem Sie die Helm-Diagrammkonfiguration angewendet haben, wird in jedem Kubernetes-Cluster ein Bootstrap-Job gestartet. Nachdem der Bootstrap-Job im letzten Cluster gestartet wurde, führen Sie den folgenden Befehl aus, um den Bereitstellungsprozess zu verfolgen:
kubectl logs -n spanner-ns-usw3 -l app.kubernetes.io/component=bootstrap -f
Wenn die Logs darauf hinweisen, dass die Bereitstellung nicht alle Server erreichen kann, prüfen Sie, ob der DNS Dienst in jedem Cluster richtig konfiguriert ist.
Cluster-DNS-Dienst konfigurieren
Wenn Sie ein externes DNS mit Ihrem Kubernetes-Cluster verwenden und DNS-Einträge für Headless-Dienste verwaltet werden, können Sie diesen Schritt überspringen.
Spanner verwendet den Pod-Hostnamen für die gesamte interne Kommunikation.
Konfigurieren Sie das DNS so, dass Pods Hostnamen auch dann auflösen können, wenn sie in verschiedenen Kubernetes-Clustern ausgeführt werden. Dazu müssen Sie den kube-dns-Dienst in jedem Cluster verfügbar machen, damit er von anderen Clustern erreicht werden kann. Führen Sie dazu das Skript dns-setup.sh aus.
Mit diesem Skript wird in jedem Cluster ein Load-Balancer-Dienst für die kube-dns-Anwendung bereitgestellt und die DNS-Konfiguration so aktualisiert, dass sie auf die Load-Balancer-Dienste verweist. Während dns-setup.sh kube-dns und CoreDNS in GKE und Amazon EKS konfiguriert, müssen Sie es möglicherweise für Ihre Umgebung konfigurieren.
So konfigurieren Sie den Cluster-DNS-Dienst:
Laden Sie das Skript
dns-setup.shaus dem Cloud Storage-Bucketspanner-omniherunter, falls noch nicht geschehen.Führen Sie das Skript
dns-setup.shaus:dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTSErsetzen Sie CSV_NAME_SPACE_LIST durch eine durch Kommas getrennte Liste Ihrer Namespaces.
Ersetzen Sie CONTEXTS durch eine Liste Ihrer Kontexte.
Das folgende Beispiel zeigt die Verwendung des Skripts
dns-setup.sh:dns-setup.sh -n spanner-ns-usw1,spanner-ns-usw2,spanner-ns-usw3 ctx-usw1 ctx-usw2 ctx-usw3
Prüfen Sie nach dem Ausführen des Skripts die Logs des Bereitstellungsjobs. Meldungen zeigen, dass die Bereitstellung fortschreitet, und die Meldung Deployment created successfully wird angezeigt.
API-Zertifikat aktualisieren
Wenn Sie eine Bereitstellung ohne TLS-Verschlüsselung einrichten, fahren Sie mit Mit Spanner Omni interagieren fort.
Wenn Sie die TLS-Verschlüsselung implementieren möchten, müssen Sie das API-Zertifikat mit den externen IP-Adressen oder DNS-Namen der Load-Balancer für jeden Cluster aktualisieren. So können Clients über sichere Kanäle eine Verbindung zur Bereitstellung herstellen.
Rufen Sie die Dienstdetails für jeden Cluster ab:
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-usw3Aktualisieren Sie das API-Zertifikat mit den externen IP-Adressen:
# 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 --overwriteAktualisieren Sie die Secrets in jedem Kubernetes-Cluster mit dem neuen API-Zertifikat:
# 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)\"}}"
Mit Spanner Omni interagieren
Jeder Cluster in einer Multi-Cluster-Einrichtung hat einen Load-Balancer-Dienst. Sie können eine beliebige externe IP-Adresse des Dienstes verwenden, um mit Spanner Omni zu interagieren. Verwenden Sie für Schreibvorgänge und starke Lesevorgänge die Adresse, die als führende Region fungiert. Verwenden Sie für veraltete Leseanfragen die Region, die Ihrer Anwendung am nächsten ist, um eine optimale Leistung zu erzielen.
Führen Sie den folgenden Befehl aus, um die Dienstadresse abzurufen:
kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1The
EXTERNAL-IP:PORTist der DEPLOYMENT_ENDPOINT für Ihre Bereitstellung.Laden Sie die Spanner Omni CLI aus dem Cloud Storage-Bucket
spanner-omniherunter, falls noch nicht geschehen.Wenn Sie eine Bereitstellung mit TLS-Verschlüsselung erstellt haben, müssen Sie in jedem Befehl das CA-Zertifikat angeben, um eine verschlüsselte Verbindung herzustellen. Wenn Sie mTLS für Clients aktiviert haben, geben Sie auch das Verzeichnis des Clientzertifikats an.
--ca-certificate-file=certs/ca-api.crt--client-certificate-directory=clientcerts
Verwenden Sie die Spanner Omni CLI, um eine GoogleSQL- oder PostgreSQL-Datenbank zu erstellen und mit ihr zu interagieren.
GoogleSQL
Führen Sie Folgendes aus, um eine GoogleSQL-Datenbank zu erstellen und mit ihr zu interagieren:
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
Führen Sie Folgendes aus, um eine PostgreSQL-Datenbank zu erstellen und mit ihr zu interagieren:
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.crtSie können auch mit einer PostgreSQL-Datenbank interagieren, indem Sie der Anleitung unter Mit PGAdapter verbinden folgen, um PGAdapter zu konfigurieren und PostgreSQL-Tools wie
psqlmit Ihren Datenbanken im PostgreSQL-Dialekt zu verwenden.
Nächste Schritte
- Informationen zum Verwenden von Clientbibliotheken und JDBC-Treibern, um Ihre Anwendung mit der Bereitstellung zu verbinden.