在 Kubernetes 上為 Spanner Omni 建立多叢集部署作業

本文說明如何跨多個 Kubernetes 叢集設定 Spanner Omni 部署作業。您可以部署 Spanner Omni,並選擇是否使用 TLS 加密。如果您使用加密功能,Spanner Omni 會使用傳輸層安全標準 (TLS) 1.3,加密及驗證部署作業內部和與用戶端的通訊。

如果部署作業沒有 TLS 加密,可能會發生下列安全性風險:

  • 只要能連上部署作業的 IP 位址,任何人都能存取。
  • 用戶端與伺服器之間,或 Pod 之間沒有網路加密。

基於上述風險,請避免在未設定 TLS 加密的情況下,將應用程式部署至正式環境。

Spanner Omni 的預先發布版本不支援 TLS 加密,且會在您建立部署作業的 90 天後停止寫入資料。如要搶先體驗完整功能版本,請與 Google 聯絡

事前準備

如要準備部署,請完成下列必要條件:

  • 在每個部署位置建立多個 Kubernetes 叢集。如果您只在叢集中的一個可用區部署,叢集可以是區域叢集。 Spanner Omni 支援 Google Kubernetes Engine (GKE) 和 Amazon Elastic Kubernetes Service (Amazon EKS) 環境的 Helm 圖表設定。其他環境可能需要自訂設定。

  • 取得 Artifact Registry 中託管的容器映像檔存取權。

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

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

  • 設定 Kubernetes 叢集網路,讓一個叢集中的 Pod 可以連線至另一個叢集中的 Pod。根據預設,Spanner Omni 會使用 TCP 通訊埠 15000 到 15025 進行內部通訊。如要啟用這些叢集中 Pod 之間的通訊,請開啟這些通訊埠以傳輸流量。

  • 設定叢集 DNS,將 Pod 的主機名稱 (例如 spanner-a-0.pod.spanner-ns-r1) 解析為 IP 位址。Spanner Omni 需要主機名稱解析,才能在不同叢集的 Pod 之間建立 TCP 連線。

準備 Helm 資訊套件設定

建立 Helm 設定。詳情請參閱「建立 Helm 設定」。

每個區域的根伺服器數量必須是介於 1 到 9 之間的奇數 (含),以確保一致性仲裁。如果伺服器數量為偶數,部署作業可能會失敗。設定區域時,請將伺服器指定為根伺服器。建議您使用一個可用區進行開發或測試,並使用三個可用區來確保正式環境的高可用性。

由於這是多叢集部署作業,請確認 Helm 設定 YAML 檔案包含下列項目:

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

deployment:
  multiCluster: true

多叢集部署的範例 Helm 資訊套件設定

以下是為 Spanner Omni 多叢集部署設定的 Helm 範例。這項設定會在三個 Google Cloud 區域 (us-west1us-west2us-west3) 中建立部署作業。部署作業會分散在五個區域,每個區域代表一個副本。us-west1us-west2 中的副本是讀寫副本,而 us-west3 中的單一副本是見證副本。

# 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 以連線至多個叢集

請先使用 kubectl 內容建立叢集,再繼續操作。舉例來說,在 Helm 設定 YAML 檔案中,您可以根據位置命名環境,例如 ctx-usw1ctx-usw2ctx-usw3

設定 TLS 加密

如果設定的部署作業不含加密功能,請跳至「為每個叢集安裝 Helm 資訊套件」。

如要在多叢集部署作業中設定 TLS 加密,您必須建立憑證授權單位 (CA),並為每個叢集產生憑證。詳情請參閱「為 Kubernetes 部署作業新增 TLS 加密機制」。

產生憑證

為伺服器和 API 建立 CA 和憑證。伺服器和 API 憑證必須包含所有叢集的主機。

建立 Spanner Omni 伺服器憑證

Spanner Omni 伺服器會使用伺服器憑證加密伺服器間的通訊。

如要建立伺服器憑證,請執行下列指令。將 SERVER_LIST 替換為以半形逗號分隔的 Spanner Omni 伺服器 Pod FQDN 清單,或使用萬用字元。

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 憑證

API 憑證會加密與部署作業互動的系統通訊。

如要建立 API 憑證,請執行下列指令。請將 OMNI_ENDPOINT 替換為每個叢集的服務端點。

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

將憑證推送至每個 Kubernetes 叢集

為每個叢集建立命名空間和包含憑證的一般密鑰。

# 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 資訊套件

建立 Helm 設定。詳情請參閱「建立 Helm 設定」。

如果是多叢集部署作業,請將 Helm 設定檔中的 Helm 資訊套件設定套用至每個 Kubernetes 叢集。在每個指令中,指定特定位置及其命名空間,將其繫結至 Spanner Omni 部署作業。按照 Helm 設定檔中列出的順序,將設定套用至每個位置。將設定套用至最終位置時,系統會在該叢集中建立部署啟動程序工作。

為每個叢集安裝 Helm 前,請在要代管可觀測性堆疊的叢集上建立監控命名空間:

kubectl create namespace monitoring --context ctx-usw1

Helm 資訊套件安裝指令範例

下列指令會在叢集上安裝 Helm 資訊套件。在每個指令中,PATH_TO_HELM_CONFIG_FILE 是您為部署作業建立的 Helm 資訊套件設定 YAML 檔案路徑。

在啟用監控功能的 us-west1 中安裝圖表

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.2.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

us-west2 中安裝圖表,但不要監控

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.2.0 \
  -f  PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw2 \
  --set currentLocation=us-west2 \
  --create-namespace \
  --kube-context ctx-usw2

us-west3 中安裝圖表,但不要監控

helm upgrade --install spanner-omni oci://us-docker.pkg.dev/spanner-omni/charts/spanner-omni --version 0.2.0 \
  -f  PATH_TO_HELM_CONFIG_FILE \
  --namespace spanner-ns-usw3 \
  --set currentLocation=us-west3 \
  --create-namespace \
  --kube-context ctx-usw3

追蹤部署進度

套用 Helm 資訊圖表設定後,每個 Kubernetes 叢集都會啟動啟動程序工作。最後一個叢集啟動啟動程序工作後,請執行下列指令來追蹤部署程序:

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

如果記錄顯示部署作業無法連上所有伺服器,請確保每個叢集上的 DNS 服務設定正確

設定叢集 DNS 服務

如果您使用外部 DNS 搭配 Kubernetes 叢集,且該 DNS 管理無標頭服務的 DNS 項目,則可以略過這個步驟。

Spanner 會使用 Pod 主機名稱進行所有內部通訊。請設定 DNS,讓 Pod 即使在不同的 Kubernetes 叢集中執行,也能解析主機名稱。如要這麼做,請在每個叢集中公開 kube-dns 服務,讓其他叢集可以執行 dns-setup.sh 指令碼來存取該服務。

這個指令碼會在每個叢集中部署 kube-dns 應用程式的負載平衡器服務,並更新 DNS 設定,指向負載平衡器服務。dns-setup.sh 會在 GKE 和 Amazon EKS 中設定 kube-dnsCoreDNS,但您可能需要為環境設定。

如要設定叢集 DNS 服務,請按照下列步驟操作:

  1. 如果尚未下載 dns-setup.sh 指令碼,請從 spanner-omni Cloud Storage 值區下載。

    前往 Spanner Omni 值區

  2. 執行 dns-setup.sh 指令碼:

    dns-setup.sh -n CSV_NAME_SPACE_LIST CONTEXTS
    
    • CSV_NAME_SPACE_LIST 替換為以半形逗號分隔的命名空間清單。

    • CONTEXTS 替換為您的環境清單。

    以下是使用 dns-setup.sh 指令碼的範例:

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

執行指令碼後,請檢查部署作業的記錄檔。訊息會指出部署作業正在進行中,並顯示 Deployment created successfully 訊息。

更新 API 憑證

如果設定部署作業時未採用 TLS 加密,請繼續進行「與 Spanner Omni 互動」。

如要實作 TLS 加密,您必須更新 API 憑證,加入每個叢集的負載平衡器外部 IP 位址或 DNS 名稱。這麼做可確保用戶端能透過安全通道連線至部署作業。

  1. 取得每個叢集的服務詳細資料:

    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. 使用外部 IP 位址更新 API 憑證:

    # 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. 使用新的 API 憑證更新每個 Kubernetes 叢集中的密鑰:

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

與 Spanner Omni 互動

在多叢集設定中,每個叢集都有一個負載平衡器服務。您可以使用服務的任何外部 IP 位址與 Spanner Omni 互動。如要執行寫入和強讀取作業,請使用做為主要區域的位址。對於過時讀取要求,請使用最接近應用程式的區域,以達到最佳效能。

  1. 執行下列指令來取得服務位址:

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

    EXTERNAL-IP:PORT 是部署的 DEPLOYMENT_ENDPOINT

  2. 如果尚未下載 Spanner Omni CLI,請從 spanner-omni Cloud Storage 值區下載。

    前往 Spanner Omni 值區

  3. 如果您建立的部署作業採用 TLS 加密,則必須在每個指令中加入 CA 憑證,才能建立加密連線。如果您為用戶端啟用 mTLS,請一併加入用戶端憑證目錄。

    • --ca-certificate-file=certs/ca-api.crt
    • --client-certificate-directory=clientcerts
  4. 使用 Spanner Omni CLI 建立 GoogleSQL 或 PostgreSQL 資料庫,並與之互動。

    GoogleSQL

    如要建立及操作 GoogleSQL 資料庫,請執行下列指令:

    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

    如要建立 PostgreSQL 資料庫並與之互動,請執行下列指令:

    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
    

    您也可以按照「使用 PGAdapter 連線」中的操作說明設定 PGAdapter,並搭配使用 PostgreSQL 工具 (例如 psql) 與 PostgreSQL 方言資料庫,與 PostgreSQL 資料庫互動。

後續步驟