Deployment mit TLS-Verschlüsselung in Kubernetes erstellen

Spanner Omni verwendet TLS 1.3, um Daten zu verschlüsseln, die zwischen dem Client und dem Server sowie zwischen Spanner Omni-Servern übertragen werden. Spanner Omni bietet mTLS für erweiterte Sicherheitsfunktionen, wobei beide Parteien die Authentizität der anderen bestätigen, bevor sie Daten austauschen. Wenn Sie die Verschlüsselung verwenden, müssen Ihre Server über mTLS kommunizieren. Sie können auswählen, ob Ihr Client und Server auch mTLS verwenden.

Die Vorschau version von Spanner Omni unterstützt keine TLS-Verschlüsselung. Wenn Sie die Funktionen zum Erstellen von Bereitstellungen mit TLS-Verschlüsselung nutzen möchten, wenden Sie sich an Google und beantragen Sie den vorzeitigen Zugriff auf die Vollversion von Spanner Omni.

Hinweis

Folgende Anforderungen müssen erfüllt sein:

  • Erstellen Sie einen Kubernetes-Cluster. Die Konfiguration unterstützt Google Kubernetes Engine (GKE) und Amazon Elastic Kubernetes Service (Amazon EKS). Möglicherweise müssen Sie die Konfiguration anpassen, damit sie in anderen Umgebungen funktioniert.

  • Der Kubernetes-Cluster muss auf das Artifact Registry-Artefakt zugreifen können, das den Spanner Omni-Container hostet.

  • Installieren und konfigurieren Sie das kubectl Befehlszeilentool 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 Maschine monitor_control.virtual_rdtsc = FALSE hinzufügen. So stellen Sie sicher, dass TrueTime korrekt funktioniert.

  • Prüfen Sie, ob Ihre Umgebung die Systemanforderungen von Spanner Omni erfüllt.

Schritt 1: Zertifikate generieren

Sie müssen drei Zertifikatsätze erstellen:

  • API-Zertifikate: Diese helfen, den Spanner Omni API -Server zu schützen.

  • Serverzertifikate: Diese helfen, die Kommunikation zwischen Servern zu schützen.

  • Clientzertifikate: Endnutzer oder Anwendungen verwenden diese, um ihre Identität und ihr Vertrauen in Spanner Omni-Server zu bestätigen.

Diese Zertifikate werden von einer Zertifizierungsstelle (Certification Authority, CA) ausgestellt. Spanner Omni bietet Tools zum Erstellen einer selbst signierten Zertifizierungsstelle und aller drei Zertifikatstypen.

Führen Sie die folgenden Schritte auf einem Ihrer Computer aus. In den Schritten wird davon ausgegangen, dass der Namespace spanner-ns ist. Ändern Sie dies in den Namespace, den Sie in Ihrer Bereitstellung verwenden möchten.

Sie können diese Zertifikate auf Ihrer Workstation mit der Spanner Omni CLI erstellen.

1. Zertifizierungsstelle (Certification Authority, CA) erstellen

Eine Zertifizierungsstelle (Certification Authority, CA) stellt alle Zertifikate aus. Ihre Organisation hat möglicherweise eine zentrale Zertifizierungsstelle oder Sie können eine öffentliche Zertifizierungsstelle verwenden. Sie können zwar dieselbe Zertifizierungsstelle für alle Zertifikate verwenden, aber API-Zertifikate und Clientzertifikate müssen dieselbe Zertifizierungsstelle verwenden.

Mit Spanner Omni können Sie eine private Zertifizierungsstelle erstellen.

./google/spanner/bin/spanner certificates create-ca --ca-certificate-directory=certs

Mit dem Befehl create-ca wird das CA-Zertifikat im Verzeichnis certs generiert. Sie können dieses Zertifikat entweder kopieren und als Zertifizierungsstelle für API-Zertifikate verwenden oder eine andere Zertifizierungsstelle erstellen. Achten Sie darauf, dass Sie beim Erstellen von Zertifikaten die richtige Zertifizierungsstelle verwenden.

cp certs/ca.crt certs/ca-api.crt

Das Verzeichnis $HOME/.spanner/private-keys enthält den privaten Schlüssel für die Zertifizierungsstelle. Es ist wichtig, dieses Verzeichnis zu sichern und zu sichern. Nutzer mit Zugriff auf den privaten Schlüssel können beliebige Zertifikate signieren, die von Clients, die der selbst signierten Zertifizierungsstelle vertrauen, vertraut werden. Optional können Sie eine zusätzliche Zertifizierungsstelle erstellen oder eine extern vertrauenswürdige Zertifizierungsstelle für die API-Zertifikate verwenden. In diesem Dokument wird dieselbe Zertifizierungsstelle für alle Zertifikatstypen verwendet.

2. Serverzertifikate generieren

Sie müssen zwei Arten von Serverzertifikaten generieren:

  • API-Zertifikat: Verwenden Sie dieses Zertifikat, um die Kommunikation von Systemen zu verschlüsseln, die mit der Bereitstellung interagieren.

  • Spanner-Serverzertifikat: Spanner Omni-Server verwenden dieses Zertifikat, um die Kommunikation miteinander zu verschlüsseln.

Diese Konfiguration bietet Flexibilität bei der Verwaltung dieser Zertifikate. So können Sie beispielsweise die Zertifikatsrotation verwenden.

Spanner-Serverzertifikat erstellen

Führen Sie den folgenden Befehl aus, um das Serverzertifikat zu erstellen:

# Comma-separate names of the Spanner servers; wildcards are supported.
SERVER_NAMES=*.pod.NAMESPACE
./google/spanner/bin/spanner certificates create-server --hostnames=${SERVER_NAMES} --ca-certificate-directory certs --output-directory certs

Mit diesem Befehl werden server.crt und server.key im Verzeichnis certs erstellt.

API-Zertifikat erstellen

Führen Sie den folgenden Befehl aus, um das API-Zertifikat zu erstellen:

OMNI_ENDPOINT=spanner.NAMESPACE
./google/spanner/bin/spanner certificates create-server --filename-prefix=api --hostnames=${OMNI_ENDPOINT} --ca-certificate-directory certs --output-directory certs

Mit diesem Befehl werden api.crt und api.key im Verzeichnis certs erstellt. Verwenden Sie bei Bedarf eine extern vertrauenswürdige Zertifizierungsstelle für die API-Zertifikate.

3. Clientzertifikate generieren

Sie können Clientzertifikate verwenden, um Nutzer und Anwendungen zu authentifizieren. Clientzertifikate ermöglichen mTLS zwischen dem Client und dem Server. Sie können diesen Schritt überspringen, wenn Sie mTLS nicht verwenden möchten.

Dieselbe Zertifizierungsstelle, die das API-Zertifikat signiert, muss auch Clientzertifikate signieren. Diese müssen außerdem einen Nutzernamen für die Autorisierung enthalten. Verwenden Sie in diesem Beispiel den Nutzer admin. Das ist der Standardnutzer für jede neue Datenbank. Weitere Informationen finden Sie unter Authentifizierung und Autorisierung in Spanner Omni.

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs

Mit diesem Befehl werden client.crt und client.key im Verzeichnis clientcerts erstellt. Senden Sie diese Dateien an alle Computer, die eine Verbindung zur Bereitstellung herstellen.

Wenn Sie Clientzertifikate mit der Java-Clientbibliothek verwenden möchten, müssen Sie den Zertifikatschlüssel im PKCS#8-Format generieren. Verwenden Sie den folgenden Befehl:

USERNAME=admin
./google/spanner/bin/spanner certificates create-client $USERNAME --output-directory clientcerts --ca-certificate-directory certs --generate-pkcs8-key

Schritt 2: Zertifikate an den Kubernetes-Cluster senden

Führen Sie die folgenden Befehle aus, um die Zertifikate an Ihren Kubernetes-Cluster zu senden:

kubectl create namespace NAMESPACE

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 NAMESPACE

Schritt 3: Bereitstellung mit TLS-Verschlüsselung erstellen

Führen Sie die folgenden Schritte aus, um Ihre Bereitstellung mit TLS-Verschlüsselung zu erstellen.

1. Helm-Konfiguration vorbereiten

Folgen Sie der Anleitung unter Helm-Chart-Konfiguration erstellen und erstellen Sie die Bereitstellungskonfiguration für Ihre Umgebung.

Legen Sie die folgenden Werte in der Helm-Chart-Konfiguration fest, um TLS zu aktivieren:

# Enables TLS
global:
  insecureMode: false

# Enables client certificate authentication (mTLS)
deployment:
  enableClientCertificateAuthentication: true

2. Bereitstellung erstellen

Führen Sie den folgenden Befehl aus, um die Bereitstellung zu erstellen:

kubectl create ns monitoring

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni \
  --version VERSION \
  --set global.platform=gke \
  --set global.insecureMode=false \
  --set deployment.enableClientCertificateAuthentication=true \
  --namespace NAMESPACE \
  --set monitoring.enabled=true

Mit dem Befehl wird ein Bootstrap-Job ausgelöst. Sie können den Fortschritt verfolgen, indem Sie sich die Logs dieses Jobs ansehen:

kubectl logs -n NAMESPACE -l app.kubernetes.io/component=bootstrap -f

Die Ausgabe zeigt den Fortschritt an. Wenn der Vorgang abgeschlossen ist, wird die Meldung „Deployment created successfully“ (Bereitstellung erfolgreich erstellt) angezeigt.

3. Status der Pods prüfen

Führen Sie den folgenden Befehl aus, um den Pod-Status zu prüfen:

kubectl get pods --watch --namespace NAMESPACE

Alle Pods haben den Status READY.

4. Zertifikat und Bereitstellung mit Load-Balancer-Details aktualisieren

Dieser Schritt ist erforderlich, wenn Clients eine Verbindung von außerhalb des Kubernetes-Clusters herstellen sollen.

# Get the service details
kubectl get service spanner -n NAMESPACE

# The EXTERNAL-IP:PORT is the API or deployment endpoint for your deployment.
# Update the API certificate with these details.
OMNI_ENDPOINT=EXTERNAL_IP,spanner.NAMESPACE.svc
./google/spanner/bin/spanner certificates update --filename_prefix=api --hostnames=${OMNI_ENDPOINT} --ca_certificate_directory certs --output_directory certs --overwrite

# Update the secrets in Kubernetes
kubectl patch secret tls-certs -n NAMESPACE -p "{\"data\":{\"api.crt\":\"$(base64 -w 0 certs/api.crt)\"}}"

Schritt 4: Mit Spanner Omni interagieren

Sie können mit der Spanner Omni-Bereitstellung von jeder VM aus mit der Spanner Omni CLI interagieren.

Wenn Sie mTLS für Clients aktiviert haben, verwenden Sie die folgenden Flags mit jedem Befehl:

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. In Spanner Omni anmelden

Führen Sie den folgenden Befehl aus, um sich anzumelden:

./google/spanner/bin/spanner auth login admin --ca-certificate-file=certs/ca-api.crt \
--client-certificate_directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Das Standardpasswort ist admin.

Successfully logged in as "admin"

2. Datenbank erstellen

Führen Sie den folgenden Befehl aus, um eine Datenbank zu erstellen:

./google/spanner/bin/spanner --deployment-endpoint=DEPLOYMENT_ENDPOINT databases create DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

3. SQL-Shell öffnen

Führen Sie den folgenden Befehl aus, um die Shell zu öffnen:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --deployment-endpoint=DEPLOYMENT_ENDPOINT --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts

4. Tabelle erstellen und Daten hinzufügen

Führen Sie die folgenden SQL-Befehle aus:

spanner> CREATE TABLE names (nameId INT64 NOT NULL, name String(100)) PRIMARY KEY (nameId);
Query OK, 0 rows affected (4.62 sec)

spanner> INSERT names (nameId, name) VALUES (1, "Jack");
Query OK, 1 rows affected (0.18 sec)

5. Deployment prüfen

Führen Sie den folgenden Befehl aus, um die Datenbanken aufzulisten:

./google/spanner/bin/spanner databases list --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Die Ausgabe sieht dann ungefähr so aus:

NAME STATUS VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME BEREIT 1 Std. 2025-02-07T12:25:30Z falsch

Führen Sie den folgenden Befehl aus, um die Daten abzufragen:

./google/spanner/bin/spanner sql --database=DATABASE_NAME --ca-certificate-file=certs/ca-api.crt --client-certificate-directory=clientcerts --deployment-endpoint=DEPLOYMENT_ENDPOINT

Führen Sie die folgenden SQL-Befehle aus:

SHOW TABLES;
SELECT * FROM names;

Alternativ können Sie der Anleitung unter PGAdapter mit Spanner Omni verwenden folgen, um PGAdapter zu konfigurieren und mit Tools wie psql zu interagieren.

Schritt 5: Bereitstellung beobachten

Wenn Sie Spanner Omni mit monitoring.enabled=true installiert haben, werden Messwerte von Prometheus erfasst. Sie können diese Messwerte mit Grafana visualisieren.

1. Dienstdetails abrufen

Führen Sie die folgenden Befehle aus, um die Dienstdetails abzurufen:

# Prometheus service details. Default port is 9090.
kubectl get service prometheus-service -n monitoring

# Grafana service details. Default port is 3000.
kubectl get service grafana -n monitoring

Nächste Schritte