本文說明如何跨多個 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-west1、us-west2 和 us-west3) 中建立部署作業。部署作業會分散在五個區域,每個區域代表一個副本。us-west1 和 us-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-usw1、ctx-usw2 和 ctx-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-dns 和 CoreDNS,但您可能需要為環境設定。
如要設定叢集 DNS 服務,請按照下列步驟操作:
如果尚未下載
dns-setup.sh指令碼,請從spanner-omniCloud Storage 值區下載。執行
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 名稱。這麼做可確保用戶端能透過安全通道連線至部署作業。
取得每個叢集的服務詳細資料:
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使用外部 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使用新的 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 互動。如要執行寫入和強讀取作業,請使用做為主要區域的位址。對於過時讀取要求,請使用最接近應用程式的區域,以達到最佳效能。
執行下列指令來取得服務位址:
kubectl get service spanner -n spanner-ns-usw1 --context ctx-usw1EXTERNAL-IP:PORT是部署的 DEPLOYMENT_ENDPOINT。如果尚未下載 Spanner Omni CLI,請從
spanner-omniCloud Storage 值區下載。如果您建立的部署作業採用 TLS 加密,則必須在每個指令中加入 CA 憑證,才能建立加密連線。如果您為用戶端啟用 mTLS,請一併加入用戶端憑證目錄。
--ca-certificate-file=certs/ca-api.crt--client-certificate-directory=clientcerts
使用 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.crtPostgreSQL
如要建立 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 資料庫互動。