本頁提供建議的部署策略,協助您在 Google Distributed Cloud (GDC) 實體隔離環境中,建構穩固的高可用性 (HA) Kubernetes 容器應用程式。您必須在多個 GDC 區域部署容器應用程式,並設定非同步儲存空間複製功能,確保應用程式及其資料在發生意外停機或區域災害時可以復原。
本頁內容適用於應用程式運算子群組中的開發人員,他們負責為所屬機構建立應用程式工作負載。詳情請參閱 GDC air-gapped 說明文件適用對象。
目標
- 在 GDC 宇宙的兩個或多個區域中建立 Kubernetes 叢集。
- 設定全域負載平衡。
- 將容器工作負載部署到每個區域 Kubernetes 叢集。
- 佈建儲存空間並附加至 Pod。
- 使用區塊儲存空間或物件儲存空間,設定非同步儲存空間複製作業。
事前準備
確認您在 GDC 宇宙中工作,且有多個可用區域。執行
gdcloud zones list
,列出您所在宇宙的可用區域。詳情請參閱「列出宇宙中的區域」。請機構 IAM 管理員授予下列角色:
建立及管理容器工作負載的命名空間管理員 (
namespace-admin
) 角色。使用者叢集管理員 (
user-cluster-admin
) 和使用者叢集開發人員 (user-cluster-developer
) 角色,可建立及管理 Kubernetes 叢集和節點集區。負載平衡器管理員 (
load-balancer-admin
) 和全域負載平衡器管理員 (global-load-balancer-admin
) 角色。您必須具備這些角色,才能建立及管理負載平衡器。磁碟區複製全域管理員角色 (
app-volume-replication-admin-global
)。 您必須具備這個角色,才能管理磁碟區複製作業。全域 PNP 管理員 (
global-project-networkpolicy-admin
) 角色,可在各區域建立及管理專案網路政策。Harbor 執行個體管理員 (
harbor-instance-admin
)、Harbor 執行個體檢視者(harbor-instance-viewer
) 和 Harbor 專案建立者 (harbor-project-creator
) 角色。您必須具備這些角色,才能在 Artifact Registry 中建立及管理容器映像檔。磁碟區複製全域管理員 (
app-volume-replication-admin-global
) 角色,可管理區塊儲存空間資源的磁碟區複製關係。「專案 Bucket 物件管理員」(
project-bucket-object-admin
) 和「專案 Bucket 管理員」(project-bucket-admin
) 角色,可建立及管理儲存空間 Bucket。
詳情請參閱角色說明。
安裝並設定 gdcloud CLI,然後設定區域和全域環境。詳情請參閱跨區域管理資源。
安裝及設定 kubectl CLI,並為全域 API 伺服器、管理 API 伺服器和 Kubernetes 叢集設定適當的 kubeconfig 檔案。詳情請參閱「手動產生 kubeconfig 檔案」一節。
在多個區域中建立 Kubernetes 叢集
Kubernetes 叢集是區域資源,因此您必須在每個區域中分別建立叢集。
主控台
在導覽選單中,依序選取「Kubernetes Engine」>「叢集」。
點選「建立叢集」。
在「Name」(名稱) 欄位中,指定叢集的名稱。
選取叢集的 Kubernetes 版本。
選取要建立叢集的可用區。
按一下「附加專案」,然後選取要附加至叢集的現有專案。點選這個選項後,按一下 [儲存]。建立叢集後,您可以從「專案詳細資料」頁面附加或卸離專案。您必須先將專案附加至叢集,才能部署容器工作負載。
點選「下一步」。
設定叢集的網路設定。叢集建立後,您就無法變更這些網路設定。Kubernetes 叢集的預設網際網路通訊協定是網際網路通訊協定第 4 版 (IPv4),且僅支援此通訊協定。
指定負載平衡器 IP 位址集區大小,例如
20
。選取要使用的服務 CIDR (無類別跨網域路由)。系統會從這個範圍為已部署的服務 (例如負載平衡器) 分配 IP 位址。
選取要使用的 Pod CIDR。叢集會從這個範圍將 IP 位址分配給 Pod 和 VM。
點選「下一步」。
查看叢集自動產生的預設節點集區詳細資料。按一下「編輯」edit,修改預設節點集區。
如要建立其他節點集區,請選取「新增節點集區」。編輯預設節點集區或新增節點集區時,您可以透過下列選項自訂節點集區:
- 指派節點集區的名稱。節點集區建立後,名稱就無法修改。
- 指定要在節點集區中建立的工作站節點數量。
選取最符合工作負載需求的機器類別。 查看下列設定清單:
- 機型
- CPU
- 記憶體
按一下 [儲存]。
點選「建立」來建立叢集。
針對 GDC 宇宙中的每個區域重複執行上述步驟。請確保每個要納入高可用性策略的區域都有 Kubernetes 叢集。
API
如要直接使用 API 建立新的 Kubernetes 叢集,請將自訂資源套用至每個 GDC 區域。
建立
Cluster
自訂資源,並將其部署至區域的 Management API 伺服器:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF \ apiVersion: cluster.gdc.goog/v1 kind: Cluster metadata: name: CLUSTER_NAME namespace: platform spec: clusterNetwork: podCIDRSize: POD_CIDR serviceCIDRSize: SERVICE_CIDR initialVersion: kubernetesVersion: KUBERNETES_VERSION loadBalancer: ingressServiceIPSize: LOAD_BALANCER_POOL_SIZE nodePools: - machineTypeName: MACHINE_TYPE name: NODE_POOL_NAME nodeCount: NUMBER_OF_WORKER_NODES taints: TAINTS labels: LABELS acceleratorOptions: gpuPartitionScheme: GPU_PARTITION_SCHEME releaseChannel: channel: UNSPECIFIED EOF
更改下列內容:
- :區域管理 API 伺服器的 kubeconfig 路徑。
MANAGEMENT_API_SERVER
詳情請參閱「切換至區域環境」。 CLUSTER_NAME
:叢集名稱。叢集名稱結尾不得為-system
。-system
後置字串保留給 GDC 建立的叢集。POD_CIDR
:網路範圍的大小,Pod 虛擬 IP 位址 (VIP) 會從這個範圍分配。如未設定,系統會使用預設值21
。SERVICE_CIDR
:網路範圍的大小,服務 VIP 會從這個範圍分配。如未設定,系統會使用預設值23
。KUBERNETES_VERSION
:叢集的 Kubernetes 版本,例如1.26.5-gke.2100
。如要列出可供設定的 Kubernetes 版本,請參閱「列出叢集可用的 Kubernetes 版本」。LOAD_BALANCER_POOL_SIZE
:負載平衡器服務使用的不重疊 IP 位址集區大小。如未設定,系統會使用預設值20
。MACHINE_TYPE
:節點集區工作站節點的機器類型。如要查看可設定的項目,請參閱可用的機器類型。NODE_POOL_NAME
:節點集區的名稱。NUMBER_OF_WORKER_NODES
:要在節點集區中佈建的工作站節點數量。TAINTS
:要套用至這個節點集區節點的 taint。此為選填欄位。LABELS
:要套用至這個節點集區節點的標籤。其中包含鍵/值組合清單。這是選填欄位。GPU_PARTITION_SCHEME
:GPU 分割配置,如果您執行 GPU 工作負載 (例如mixed-2
),如果未設定這個欄位,GPU 就不會分割。如要瞭解可用的多執行個體 GPU (MIG) 設定檔,請參閱「支援的 MIG 設定檔」。
- :區域管理 API 伺服器的 kubeconfig 路徑。
針對要代管容器應用程式的每個區域,重複執行上一個步驟,以實作高可用性策略。
設定負載平衡器
如要在不同區域的 Pod 之間分配流量,請建立負載平衡器。您可以選擇建立外部負載平衡器 (ELB) 和內部負載平衡器 (ILB),這兩種負載平衡器都可以區域或全域設定。在本範例中,請為容器應用程式設定全域 ILB 和全域 ELB。
建立全域內部負載平衡器
內部負載平衡器 (ILB) 會從指派給機構的內部 IP 位址集區,公開機構內的服務。ILB 服務永遠無法從機構外部的任何端點存取。
請完成下列步驟,為容器工作負載建立全域 ILB。
gdcloud
使用 gdcloud CLI 建立以 Pod 工作負載為目標的 ILB。
這個 ILB 會以專案中符合 Backend
物件所定義標籤的所有工作負載為目標。Backend
自訂資源必須限定於某個區域。
如要使用 gdcloud CLI 建立 ILB,請按照下列步驟操作:
在每個執行 Pod 的區域中建立區域
Backend
資源,定義 ILB 的端點:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
更改下列內容:
BACKEND_NAME
:後端資源的所選名稱,例如my-backend
。LABELS
:定義要在 Pod 之間使用哪些端點來存取這個後端資源的選取器,例如app=web
。PROJECT
:專案名稱。CLUSTER_NAME
:定義選取器範圍時,會限制在該 Kubernetes 叢集內。如未指定這個欄位,系統會選取具有指定標籤的所有端點。這是選填欄位。ZONE
:這次呼叫要使用的區域。如要為所有需要區域旗標的指令預設區域旗標,請執行gdcloud config set core/zone ZONE
。可用區旗標僅適用於多可用區環境。這是選填欄位。
針對 GDC 宇宙中的每個區域重複執行這個步驟。
建立全域
BackendService
資源:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --global
更改下列內容:
BACKEND_SERVICE_NAME
:後端服務的名稱。PROJECT
:專案名稱。TARGET_PORTS
:以半形逗號分隔的目標通訊埠清單,這個後端服務會轉換這些通訊埠,其中每個目標通訊埠都會指定通訊協定、轉送規則中的通訊埠,以及後端執行個體中的通訊埠。您可以指定多個目標連接埠。 這個欄位的格式必須為protocol:port:targetport
,例如TCP:80:8080
。這是選填欄位。
將
BackendService
資源新增至先前在每個區域中建立的Backend
資源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend-zone=ZONE \ --backend=BACKEND_NAME \ --project=PROJECT \ --global
更改下列內容:
BACKEND_SERVICE_NAME
:全域後端服務的名稱。ZONE
:後端的可用區。BACKEND_NAME
:區域後端的名稱。PROJECT
:專案名稱。
針對先前建立的每個區域後端,完成這個步驟。
建立內部
ForwardingRule
資源,定義服務可用的虛擬 IP 位址 (VIP):gdcloud compute forwarding-rules create FORWARDING_RULE_INTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=INTERNAL \ --project=PROJECT \ --global
更改下列內容:
FORWARDING_RULE_INTERNAL_NAME
:轉送規則的名稱。CIDR
:轉送規則使用的 CIDR。這個欄位為選填。如未指定,系統會從全域 IP 位址集區自動保留IPv4/32
CIDR。指定與此轉送規則位於相同命名空間的Subnet
資源名稱。Subnet
資源代表全域子網路的請求和分配資訊。如要進一步瞭解Subnet
資源,請參閱「管理子網路」。PROTOCOL_PORT
:要在轉送規則中公開的通訊協定和通訊埠。這個欄位的格式必須為ip-protocol=TCP:80
。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。
如要驗證設定的 ILB,請確認每個建立物件的
Ready
條件。向 VIP 發出curl
要求,驗證流量:如要取得指派的 VIP,請說明轉送規則:
gdcloud compute forwarding-rules describe FORWARDING_RULE_INTERNAL_NAME --global
使用
curl
要求,在轉送規則的欄位中指定通訊埠,藉此驗證 VIP 的流量:curl http://FORWARDING_RULE_VIP:PORT
更改下列內容:
FORWARDING_RULE_VIP
:轉送規則的 VIP。PORT
:轉送規則的通訊埠號碼。
API
使用 KRM API 建立以容器工作負載為目標的 ILB。這個 ILB 會以專案中符合 Backend
物件所定義標籤的所有工作負載為目標。如要使用 KRM API 建立全域 ILB,請按照下列步驟操作:
建立
Backend
資源,定義 ILB 的端點。為容器工作負載所在的每個區域建立Backend
資源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
更改下列內容:
MANAGEMENT_API_SERVER
:區域管理 API 伺服器的 kubeconfig 路徑。詳情請參閱「切換至區域環境」。PROJECT
:專案名稱。BACKEND_NAME
:資源的名稱。Backend
CLUSTER_NAME
:定義選取器範圍時,會限制在該 Kubernetes 叢集內。如未指定這個欄位,系統會選取具有指定標籤的所有端點。這是選填欄位。APP_NAME
:容器應用程式的名稱。
你可以為每個區域使用相同的
Backend
資源,也可以為每個區域建立具有不同標籤集的Backend
資源。使用先前建立的
Backend
資源建立BackendService
物件。請務必加入HealthCheck
資源:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF
更改下列內容:
GLOBAL_API_SERVER
:全域 API 伺服器的 kubeconfig 路徑。PROJECT
:專案名稱。BACKEND_SERVICE_NAME
:您為BackendService
資源選擇的名稱。HEALTH_CHECK_NAME
:先前建立的HealthCheck
資源名稱。BACKEND_NAME
:可用區資源的名稱。Backend
ZONE
:Backend
資源所在的可用區。您可以在backendRefs
欄位中指定多個後端。例如:- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
targetPorts
欄位為選填。這項資源會列出BackendService
資源轉譯的通訊埠。如果您使用這個物件,請提供下列值:PORT
:服務公開的通訊埠。PROTOCOL
:流量必須符合的第 4 層通訊協定。僅支援 TCP 和 UDP。TARGET_PORT
:值要轉換成的通訊埠,例如8080
。值不得在指定物件中重複。targetPorts
的範例如下所示:targetPorts: - port: 80 protocol: TCP targetPort: 8080
建立內部
ForwardingRule
資源,定義服務可用的虛擬 IP 位址 (VIP)。kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleInternal metadata: namespace: PROJECT name: FORWARDING_RULE_INTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
更改下列內容:
GLOBAL_API_SERVER
:全域 API 伺服器的 kubeconfig 路徑。PROJECT
:專案名稱。FORWARDING_RULE_INTERNAL_NAME
:您為ForwardingRuleInternal
資源選擇的名稱。CIDR
:轉送規則使用的 CIDR。 這是選填欄位。如未指定,系統會從全域 IP 位址集區自動保留IPv4/32
CIDR。指定與此轉送規則位於相同命名空間的Subnet
資源名稱。Subnet
資源代表全域子網路的請求和分配資訊。如要進一步瞭解Subnet
資源,請參閱「管理子網路」。PORT
:要在轉送規則中公開的通訊埠。使用ports
欄位指定 L4 連接埠陣列,封包會轉送至透過這項轉送規則設定的後端。至少須指定一個通訊埠。使用port
欄位指定通訊埠號碼。公開的通訊埠必須與容器內實際應用程式公開的通訊埠相同。PROTOCOL
:轉送規則使用的通訊協定,例如TCP
。ports
陣列中的項目必須如下所示:ports: - port: 80 protocol: TCP
如要驗證設定的 ILB,請確認每個建立物件的
Ready
條件。向 VIP 發出curl
要求,驗證流量:擷取 VIP:
kubectl get forwardingruleinternal -n PROJECT
輸出內容如下:
NAME BACKENDSERVICE CIDR READY ilb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
使用
curl
要求,在轉送規則的欄位中指定的通訊埠,測試 VIP 的流量:curl http://FORWARDING_RULE_VIP:PORT
更改下列內容:
FORWARDING_RULE_VIP
:轉送規則的 VIP。PORT
:轉送規則中欄位的通訊埠號碼。
建立全域外部負載平衡器
外部負載平衡器 (ELB) 會公開服務,讓機構外部可透過指派給機構的集區 IP 位址,從較大的執行個體外部 IP 位址集區存取服務。
請完成下列步驟,為容器工作負載建立全域 ELB。
gdcloud
使用 gdcloud CLI 建立全域 ELB,以專案中符合 Backend
物件所定義標籤的所有工作負載為目標。Backend
自訂資源必須限定於某個區域。
如要讓 ELB 服務正常運作,您必須在政策中設定及套用自訂
ProjectNetworkPolicy
資料移轉,允許流量傳輸至這項 ELB 服務的工作負載。網路政策會控管工作負載的存取權,而非負載平衡器本身。ELB 會將工作負載公開發布到客戶網路,因此需要明確的網路政策,才能允許外部流量進入工作負載的連接埠,例如8080
。指定外部 CIDR 位址,允許流量傳輸至這個 ELB 的工作負載:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
更改下列內容:
GLOBAL_API_SERVER
:全域 API 伺服器的 kubeconfig 路徑。如果尚未產生全域 API 伺服器的 kubeconfig 檔案,請參閱「手動產生 kubeconfig 檔案」一文瞭解詳情。PROJECT
:專案名稱。CIDR
:ELB 需要從中存取的外部 CIDR。外部負載平衡器使用直接伺服器回傳 (DSR),會保留來源外部 IP 位址,並略過回傳路徑上的負載平衡器,因此必須採用這項政策。詳情請參閱「為跨機構流量建立全域 Ingress 防火牆規則」。PORT
:負載平衡器後方 Pod 的後端通訊埠。這個值位於Service
資源資訊清單的.spec.ports[].targetPortfield
欄位中。這是選填欄位。
這項設定可讓專案內的所有資源存取指定的 CIDR 範圍。
在每個可用區建立
Backend
資源,定義 ELB 的端點:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT \ --cluster=CLUSTER_NAME \ --zone=ZONE
更改下列內容:
BACKEND_NAME
:後端資源的名稱,例如my-backend
。LABELS
:定義要在 Pod 之間使用哪些端點來處理這個後端資源的選取器,例如app=web
。PROJECT
:專案名稱。CLUSTER_NAME
:定義選取器範圍時,會限制在該 Kubernetes 叢集內。如未指定這個欄位,系統會選取具有指定標籤的所有端點。這是選填欄位。ZONE
:這次呼叫要使用的區域。如要為所有需要區域旗標的指令預設區域旗標,請執行gdcloud config set core/zone ZONE
。可用區旗標僅適用於多可用區環境。這是選填欄位。
你可以為每個區域使用相同的
Backend
資源,也可以為每個區域建立具有不同標籤集的Backend
資源。建立全域
BackendService
資源:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global
更改下列內容:
BACKEND_SERVICE_NAME
:這個後端服務的所選名稱。PROJECT
:專案名稱。TARGET_PORTS
:以半形逗號分隔的目標通訊埠清單,後端服務會翻譯這些通訊埠,其中每個目標通訊埠都會指定通訊協定、轉送規則中的通訊埠,以及後端執行個體中的通訊埠。您可以指定多個目標連接埠。這個欄位必須採用protocol:port:targetport
格式,例如TCP:80:8080
。這個欄位為選填。HEALTH_CHECK_NAME
:健康狀態檢查資源的名稱。這是選填欄位。
將全域
BackendService
資源新增至先前建立的區域Backend
資源:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone=ZONE \ --project=PROJECT \ --global
針對先前建立的每個區域後端,完成這個步驟。
建立外部
ForwardingRule
資源,定義服務可用的 VIP:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT \ --global
更改下列內容:
FORWARDING_RULE_EXTERNAL_NAME
:轉送規則的名稱。CIDR
:轉送規則使用的 CIDR。這個欄位為選填。如未指定,系統會從全域 IP 位址集區自動保留IPv4/32
CIDR。指定與此轉送規則位於相同命名空間的Subnet
資源名稱。Subnet
資源代表全域子網路的請求和分配資訊。如要進一步瞭解Subnet
資源,請參閱「管理子網路」。PROTOCOL_PORT
:要在轉送規則中公開的通訊協定和通訊埠。這個欄位的格式必須為ip-protocol=TCP:80
。 公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。PROJECT
:專案名稱。
如要驗證設定的 ELB,請確認每個建立物件的
Ready
條件。使用curl
要求向 VIP 驗證流量:如要取得指派的 VIP,請說明轉送規則:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
使用
curl
要求,在轉送規則的PROTOCOL_PORT
欄位中指定的通訊埠,驗證 VIP 的流量:curl http://FORWARDING_RULE_VIP:PORT
更改下列內容:
FORWARDING_RULE_VIP
:轉送規則的 VIP。PORT
:轉送規則中PROTOCOL_PORT
欄位的通訊埠號碼。
API
使用 KRM API 建立以 Pod 工作負載為目標的 ELB。這個 ELB 會以專案中符合 Backend
物件所定義標籤的所有工作負載為目標。如要使用 KRM API 建立區域 ELB,請按照下列步驟操作:
如要讓 ELB 服務正常運作,您必須在政策中設定及套用自訂
ProjectNetworkPolicy
資料移轉,允許流量傳輸至這項 ELB 服務的工作負載。網路政策會控管工作負載的存取權,而非負載平衡器本身。ELB 會將工作負載公開發布到客戶網路,因此需要明確的網路政策,才能允許外部流量進入工作負載的連接埠,例如8080
。指定外部 CIDR 位址,允許流量傳輸至這個 ELB 的工作負載:
kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: PROJECT name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: CIDR ports: - protocol: TCP port: PORT EOF
更改下列內容:
GLOBAL_API_SERVER
:全域 API 伺服器的 kubeconfig 路徑。如果尚未產生全域 API 伺服器的 kubeconfig 檔案,請參閱「手動產生 kubeconfig 檔案」一文瞭解詳情。PROJECT
:專案名稱。CIDR
:ELB 需要從中存取的外部 CIDR。外部負載平衡器使用直接伺服器回傳 (DSR),會保留來源外部 IP 位址,並略過回傳路徑上的負載平衡器,因此必須採用這項政策。詳情請參閱「為跨機構流量建立全域 Ingress 防火牆規則」。PORT
:負載平衡器後方 Pod 的後端通訊埠。這個值位於Service
資源資訊清單的.spec.ports[].targetPortfield
欄位中。這是選填欄位。
建立
Backend
資源,定義 ELB 的端點。為工作負載所在的每個區域建立Backend
資源:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: APP_NAME EOF
更改下列內容:
MANAGEMENT_API_SERVER
:區域管理 API 伺服器的 kubeconfig 路徑。如果尚未為目標區域中的 API 伺服器產生 kubeconfig 檔案,請參閱「手動產生 kubeconfig 檔案」一文瞭解詳情。PROJECT
:專案名稱。BACKEND_NAME
:Backend
資源的名稱。CLUSTER_NAME
:定義選取器範圍的 Kubernetes 叢集。如未指定這個欄位,系統會選取具有指定標籤的所有端點。這個欄位為選填。APP_NAME
:容器應用程式的名稱。
你可以為每個區域使用相同的
Backend
資源,也可以為每個區域建立具有不同標籤集的Backend
資源。使用先前建立的
Backend
資源建立BackendService
物件:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME EOF
更改下列內容:
BACKEND_SERVICE_NAME
:您為BackendService
資源選擇的名稱。HEALTH_CHECK_NAME
:先前建立的HealthCheck
資源名稱。如果您要為 Pod 工作負載設定 ELB,請勿加入這個欄位。ZONE
:Backend
資源所在的可用區。您可以在backendRefs
欄位中指定多個後端。例如:
- name: my-backend-1 zone: us-east1-a - name: my-backend-2 zone: us-east1-b
建立外部
ForwardingRule
資源,定義服務可用的 VIP。kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
更改下列內容:
FORWARDING_RULE_EXTERNAL_NAME
:您為ForwardingRuleExternal
資源選擇的名稱。CIDR
:轉送規則使用的 CIDR。這個欄位為選填。如未指定,系統會從全域 IP 位址集區自動保留IPv4/32
CIDR。指定與此轉送規則位於相同命名空間的Subnet
資源名稱。Subnet
資源代表全域子網路的請求和分配資訊。如要進一步瞭解Subnet
資源,請參閱「管理子網路」。PORT
:轉送規則中要公開的通訊埠。使用ports
欄位指定 L4 通訊埠陣列,封包會轉送至透過這項轉送規則設定的後端。至少須指定一個通訊埠。使用port
欄位指定連接埠號碼。公開的通訊埠必須與實際應用程式在容器內公開的通訊埠相同。PROTOCOL
:轉送規則使用的通訊協定,例如TCP
。ports
陣列中的項目必須如下所示:
ports: - port: 80 protocol: TCP
如要驗證設定的 ELB,請確認每個建立物件的
Ready
條件。請嘗試使用curl
要求向 VIP 測試流量。擷取專案的 VIP:
kubectl get forwardingruleexternal -n PROJECT
輸出內容如下:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 192.0.2.0/32 True
使用 curl 要求,在轉送規則的
PORT
欄位中指定的通訊埠,向 VIP 驗證流量:curl http://FORWARDING_RULE_VIP:PORT
將
FORWARDING_RULE_VIP:PORT
替換為轉送規則的 VIP 和通訊埠,例如192.0.2.0:80
。
將容器工作負載部署至每個區域叢集
容器工作負載並非全域資源,因此您必須將每個容器應用程式分別部署到區域 Kubernetes 叢集。
登入 Kubernetes 叢集所在的區域:
gdcloud config set core/zone ZONE
確認容器映像檔可從受管理 Harbor 登錄檔取得。詳情請參閱部署容器應用程式教學課程。
為容器工作負載建立資訊清單檔案,並部署至區域 Kubernetes 叢集:
kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: DEPLOYMENT_NAME spec: replicas: NUMBER_OF_REPLICAS selector: matchLabels: run: APP_NAME template: metadata: labels: run: APP_NAME spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG EOF
更改下列內容:
KUBERNETES_CLUSTER
:您要部署容器工作負載的區域 Kubernetes 叢集 kubeconfig 檔案。如果尚未為區域 Kubernetes 叢集產生 kubeconfig 檔案,請參閱「手動產生 kubeconfig 檔案」一文瞭解詳情。PROJECT
:要部署容器工作負載的專案命名空間。DEPLOYMENT_NAME
:容器部署作業的名稱。NUMBER_OF_REPLICAS
:Deployment 管理的複製Pod
物件數量。APP_NAME
:要在部署作業中執行的應用程式名稱。CONTAINER_NAME
:容器名稱。HARBOR_INSTANCE_URL
:Harbor 執行個體的網址,例如harbor-1.org-1.zone1.google.gdc.test.
。如要擷取 Harbor 執行個體的網址,請參閱「查看 Harbor 登錄執行個體」。HARBOR_PROJECT_NAME
:Harbor 專案的名稱,例如my-project
。IMAGE
:圖片名稱,例如nginx
。TAG
:要提取的映像檔版本標記,例如1.0
。
針對 GDC 宇宙中的每個區域重複上述步驟。請確認容器應用程式位於您希望用於高可用性策略的每個區域。
使用 Kubernetes 公開容器應用程式
您必須公開容器應用程式,才能從 GDC 領域中的其他資源存取該應用程式。
建立
type: LoadBalancer
的Service
資源。這項資源會透過網路公開應用程式的 Pod。kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: v1 kind: Service metadata: name: SERVICE_NAME spec: selector: app: APP_NAME ports: - port: 80 protocol: TCP type: LoadBalancer EOF
更改下列內容:
KUBERNETES_CLUSTER
:您要部署容器工作負載的區域 Kubernetes 叢集 kubeconfig 檔案。PROJECT
:容器工作負載所在的專案命名空間。SERVICE_NAME
:負載平衡器服務的名稱。APP_NAME
:您為容器應用程式套用的標籤。
建立
NetworkPolicy
自訂資源,允許所有網路流量傳送至預設命名空間:kubectl --kubeconfig KUBERNETES_CLUSTER -n PROJECT \ apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: annotations: name: allow-all spec: ingress: - from: - ipBlock: cidr: 0.0.0.0/0 podSelector: {} policyTypes: - Ingress EOF
為 Pod 佈建永久儲存空間
您必須建立 PersistentVolumeClaim
資源 (PVC),為應用程式 Pod 提供永久儲存空間。
以下說明如何使用 GDC standard-rwo
StorageClass
建立磁碟區。
建立
PersistentVolumeClaim
資源。舉例來說,您可以設定ReadWriteOnce
存取模式和standard-rwo
儲存空間類別:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: PVC_NAME spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard-rwo EOF
更改下列內容:
KUBERNETES_CLUSTER
:Kubernetes 叢集的 kubeconfig 檔案。PROJECT
:要建立 PVC 的專案命名空間。PVC_NAME
:PersistentVolumeClaim
物件的名稱。
系統會動態佈建
PersistentVolume
(PV) 物件。檢查 Kubernetes 叢集中新 PV 的狀態:kubectl get pv --kubeconfig KUBERNETES_CLUSTER
輸出結果會與下列內容相似:
NAME CAPACITY ACCESS MODES STATUS CLAIM STORAGECLASS AGE pvc-uuidd 10Gi RWO Bound pvc-name standard-rwo 60s
設定容器工作負載以使用 PVC。以下是使用
standard-rwo
PVC 的 Pod 資訊清單範例:kubectl --kubeconfig KUBERNETES_CLUSTER \ --namespace PROJECT apply -f - <<EOF apiVersion: apps/v1 kind: Pod metadata: name: web-server-deployment labels: app: APP_LABEL spec: containers: - name: CONTAINER_NAME image: HARBOR_INSTANCE_URL/HARBOR_PROJECT_NAME/IMAGE:TAG volumeMounts: - mountPath: MOUNT_PATH name: data volumes: - name: data persistentVolumeClaim: claimName: PVC_NAME EOF
更改下列內容:
KUBERNETES_CLUSTER
:要部署容器工作負載的 Kubernetes 叢集 kubeconfig 檔案。PROJECT
:PVC 所在的專案命名空間。APP_LABEL
:您為容器應用程式套用的標籤。CONTAINER_NAME
:容器名稱。HARBOR_INSTANCE_URL
:Harbor 執行個體的網址,例如harbor-1.org-1.zone1.google.gdc.test.
。如要擷取 Harbor 執行個體的網址,請參閱「查看 Harbor 登錄執行個體」。HARBOR_PROJECT_NAME
:Harbor 專案的名稱,例如my-project
。IMAGE
:圖片名稱,例如nginx
。TAG
:要提取的圖片版本標記,例如1.0
。MOUNT_PATH
:要在 Pod 內掛接磁碟區的路徑。PVC_NAME
:您建立的 PVC。
設定非同步儲存空間複製
在災難復原情境中,GDC 多區域宇宙可讓您以非同步模式使用複製的儲存空間資源,例如磁碟區和 bucket。這些儲存空間資源選項可在同一區域的任意兩個可用區之間,提供非同步資料複製功能。非同步複製會在背景執行,因此發生災難時,復原點目標 (RPO) 雖然很低,但不會是零。所有複製的資料都會處於線上狀態,且可立即存取,但可能需要手動執行容錯移轉程序,才能在次要區域啟用寫入作業。
您可以為容器應用程式選擇下列其中一種非同步儲存空間複製類型:
建立雙區域 bucket 來儲存物件
物件儲存空間資料會寫入單一值區,且資料會儲存在兩個區域中。由於資料是以非同步方式在各個區域之間複製,因此各區域在任何時間點可能不會包含相同的物件版本,但如果沒有其他變更,最終會變得相同。與磁碟區複製作業不同,在區域分割期間,複製的 bucket 可供寫入。每次寫入物件都會產生不同版本,連線恢復後,任一區域的最新版本都會成為最終狀態。
確認基礎架構營運商 (IO) 已建立
BucketLocationConfig
自訂資源,這是物件儲存空間跨區域非同步複製作業的必要條件。這項資源必須部署至根層級的全球 API 伺服器。建立雙區域
Bucket
自訂資源:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: object.global.gdc.goog/v1 kind: Bucket metadata: name: BUCKET_NAME namespace: PROJECT spec: location: LOCATION_NAME description: Sample DZ Bucket storageClass: Standard EOF
更改下列內容:
GLOBAL_API_SERVER
:全域 API 伺服器的 kubeconfig 檔案。BUCKET_NAME
:儲存空間值區的名稱。PROJECT
:bucket 所在的專案名稱。LOCATION_NAME
:值區中物件資料所在的實體位置。這必須對應至現有BucketLocation
資源的名稱。如要查詢貴機構的全球 API 伺服器,取得可用BucketLocation
資源清單,請執行kubectl --kubeconfig GLOBAL_API_SERVER bucketlocations
。如果沒有BucketLocation
資源,請與 IO 聯絡,確認他們是否已啟用非同步複製功能。
設定跨可用區的非同步區塊儲存空間複製作業
複製的區塊儲存空間提供非同步複製的磁碟區 (PV),可在主要和次要磁碟區之間維持區塊等效性。由於非同步的特性,次要磁碟區會反映過去某個時間點的主要區域狀態 (非零 RPO)。如果次要磁碟區仍是複製作業的目標,就無法掛接,必須手動終止關係,才能啟用寫入作業。
您必須設定跨可用區的儲存空間複製關係,才能建立複製資料,以便在來源可用區資料無法使用時進行容錯移轉。如果您使用區塊儲存空間儲存容器應用程式,這項功能就非常實用。
開始前,請先確認基礎架構運算子 (IO) 已建立並設定 StorageClusterPeering
和 StorageVirtualMachinePeering
自訂資源,允許跨區域的區塊儲存空間複製作業。這項資源必須部署至根層級的全球 API 伺服器。
建立
VolumeReplicationRelationship
自訂資源 YAML 檔案,並部署至全域 API 伺服器:kubectl --kubeconfig GLOBAL_API_SERVER apply -f - <<EOF apiVersion: storage.global.gdc.goog/v1 kind: VolumeReplicationRelationship metadata: name: PVC_REPL_NAME namespace: PROJECT spec: source: pvc: clusterRef: SOURCE_PVC_CLUSTER pvcRef: SOURCE_PVC zoneRef: SOURCE_ZONE destination: pvc: clusterRef: DEST_PVC_CLUSTER zoneRef: DEST_ZONE EOF
更改下列內容:
GLOBAL_API_SERVER
:全域 API 伺服器的 kubeconfig 檔案。PVC_REPL_NAME
:磁碟區複製關係的名稱。PROJECT
:儲存基礎架構所在的專案。SOURCE_PVC_CLUSTER
:PVC 所在的 Kubernetes 叢集。SOURCE_PVC
:要複製的來源可用區 PVC。SOURCE_ZONE
:PVC 所在的來源可用區。DEST_PVC_CLUSTER
:要將 PVC 複製到的目標 Kubernetes 叢集。DEST_ZONE
:要複製 PVC 的目的地可用區。
在目的地區域中建立
VolumeFailover
自訂資源,如果來源區域因任何原因無法使用,系統就會停止將資料複製到目的地區域:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: storage.gdc.goog/v1 kind: VolumeFailover metadata: name: PVC_FAILOVER_NAME namespace: PROJECT spec: volumeReplicationRelationshipRef: PVC_REPL_NAME EOF
更改下列內容:
MANAGEMENT_API_SERVER
:區域管理 API 伺服器的 kubeconfig 檔案。PVC_FAILOVER_NAME
:PVC 容錯移轉的名稱。PROJECT
:儲存基礎架構所在的專案。PVC_REPL_NAME
:磁碟區複製關係的名稱。