在 Kubernetes 中建立部署作業,並啟用 TLS 加密

Spanner Omni 會使用 TLS 1.3 加密用戶端與伺服器之間,以及 Spanner Omni 伺服器之間的資料流。Spanner Omni 提供 mTLS,可加強安全性,雙方在交換任何資料前,會先驗證彼此的真實性。如果您使用加密功能,伺服器就必須透過 mTLS 通訊。您可以選擇用戶端和伺服器是否也使用 mTLS。

Spanner Omni 的預先發布版本不支援 TLS 加密。如要取得可建立 TLS 加密部署作業的功能,請與 Google 聯絡,要求搶先存取完整版 Spanner Omni。

事前準備

請確認符合下列規定:

  • 建立 Kubernetes 叢集。這項設定支援 Google Kubernetes Engine (GKE) 和 Amazon Elastic Kubernetes Service (Amazon EKS)。您可能需要自訂設定,才能在其他環境中運作。

  • 確認 Kubernetes 叢集可以存取 Artifact Registry 構件,該構件會代管 Spanner Omni 容器。

  • 安裝並設定 kubectl 指令列工具Helm

  • 如果您在 vSphere 虛擬化平台機器上設定 Kubernetes 環境,請在虛擬機器的 .vmx 設定檔中加入 monitor_control.virtual_rdtsc = FALSE,停用時間戳記計數器 (TSC) 虛擬化。確保 TrueTime 正常運作。

  • 確認環境符合 Spanner Omni 系統需求

步驟 1:產生憑證

您必須建立三組憑證:

  • API 憑證:有助於保護 Spanner Omni API 伺服器。

  • 伺服器憑證:有助於保護伺服器間的通訊。

  • 用戶端憑證:使用者或應用程式會使用這些憑證,與 Spanner Omni 伺服器建立身分和信任關係。

這些憑證是由認證授權單位 (CA) 核發。Spanner Omni 提供工具,可建立自行簽署的 CA 和所有三種憑證。

請在其中一部電腦上執行下列步驟。這些步驟假設命名空間為 spanner-ns。請將此值變更為您要在部署作業中使用的命名空間。

您可以使用 Spanner Omni CLI 在工作站上建立這些憑證。

1. 建立憑證授權單位 (CA)

所有憑證都由認證授權單位 (CA) 核發。貴機構可能會有中央 CA,您也可以使用公開 CA。雖然您可以為所有憑證使用相同的 CA,但 API 憑證和用戶端憑證必須使用相同的 CA。

您可以使用 Spanner Omni 建立私有 CA。

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

create-ca 指令會在 certs 目錄中產生 CA 憑證。您可以複製這個憑證做為 API 憑證的 CA,也可以建立其他 CA。建立憑證時,請務必使用正確的 CA。

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

$HOME/.spanner/private-keys 目錄包含 CA 的私密金鑰。請務必備份並保護這個目錄。有權存取私密金鑰的使用者可以簽署任意憑證,而信任自簽 CA 的用戶端會信任這些憑證。您也可以選擇為 API 憑證建立額外的 CA (或使用外部信任的 CA)。本文件針對所有類型的憑證使用相同的 CA。

2. 產生伺服器憑證

您必須產生兩種類型的伺服器憑證:

  • API 憑證:使用這個憑證加密與部署項目互動的系統通訊。

  • Spanner 伺服器憑證:Spanner Omni 伺服器會使用這個憑證加密彼此之間的通訊。

這項設定可彈性管理這些憑證。例如,您可以透過這項功能輪替憑證。

建立 Spanner 伺服器憑證

如要建立伺服器憑證,請執行下列指令:

# 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

這個指令會在 certs 目錄中建立 server.crtserver.key

建立 API 憑證

如要建立 API 憑證,請執行下列指令:

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

這個指令會在 certs 目錄中建立 api.crtapi.key。如有必要,請使用外部信任的 CA 做為 API 憑證。

3. 產生用戶端憑證

您可以使用用戶端憑證驗證使用者和應用程式。用戶端憑證可啟用用戶端與伺服器之間的 mTLS。如果您不打算使用 mTLS,可以略過這個步驟。

簽署 API 憑證的 CA 必須簽署用戶端憑證,且用戶端憑證也必須包含授權用的使用者名稱。在本例中,請使用 admin 使用者,這是每個新資料庫的預設使用者。詳情請參閱「Spanner Omni 中的驗證和授權」。

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

這個指令會在 clientcerts 目錄中建立 client.crtclient.key。將這些檔案傳送至連線到部署作業的任何電腦。

如果您打算搭配 Java 用戶端程式庫使用用戶端憑證,就必須以 PKCS#8 格式產生憑證金鑰。使用下列指令:

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

步驟 2:將憑證推送至 Kubernetes 叢集

執行下列指令,將憑證推送至 Kubernetes 叢集:

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

步驟 3:建立採用傳輸層安全標準 (TLS) 加密的部署作業

請按照下列步驟建立採用 TLS 加密的部署作業。

1. 準備 Helm 設定

請參閱「建立 Helm chart 設定」,並為您的環境建立部署設定。

如要啟用 TLS,請在 Helm 資訊套件設定中設定下列值:

# Enables TLS
global:
  insecureMode: false

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

2. 建立部署作業

執行下列指令來建立部署作業:

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

這個指令會觸發啟動工作。您可以查看這項工作的記錄,追蹤進度:

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

輸出內容會顯示進度。完成後,畫面會顯示「Deployment created successfully」(部署作業已成功建立) 訊息。

3. 檢查 Pod 的狀態

執行下列指令,確認 Pod 狀態:

kubectl get pods --watch --namespace NAMESPACE

所有 Pod 都處於 READY 狀態。

4. 使用負載平衡器詳細資料更新憑證和部署作業

如要讓用戶端從 Kubernetes 叢集外部連線,就必須執行這個步驟。

# 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)\"}}"

步驟 4:與 Spanner Omni 互動

您可以使用 Spanner Omni CLI,從任何 VM 與 Spanner Omni 部署作業互動。

如果您為用戶端啟用 mTLS,請在每個指令中使用下列標記:

  • --client-certificate-directory=CLIENT_CERTIFICATE_DIRECTORY

  • --ca-certificate-file=API_CA_CERT_FILE_PATH

1. 登入 Spanner Omni

執行下列指令登入:

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

預設密碼為 admin

Successfully logged in as "admin"

2. 建立資料庫

執行下列指令來建立資料庫:

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

執行下列指令來開啟 Shell:

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

4. 建立資料表並新增資料

執行下列 SQL 指令:

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

如要列出資料庫,請執行下列指令:

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

輸出看起來類似以下內容:

名稱 狀態 VERSION_RETENTION_PERIOD EARLIEST_VERSION_TIME ENABLE_DROP_PROTECTION
DATABASE_NAME 已就緒 1 小時 2025-02-07T12:25:30Z false

如要查詢資料,請執行下列指令:

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

執行下列 SQL 指令:

SHOW TABLES;
SELECT * FROM names;

或者,您可以按照「搭配 Spanner Omni 使用 PGAdapter」一文中的操作說明,設定 PGAdapter 並使用 psql 等工具互動。

步驟 5:監控部署作業

如果您使用 monitoring.enabled=true 安裝 Spanner Omni,Prometheus 會抓取指標。您可以使用 Grafana 顯示這些指標。

1. 取得服務詳細資料

執行下列指令來取得服務詳細資料:

# 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

後續步驟