建立要搭配拓撲網域使用的使用者叢集

在 Google Distributed Cloud 中,工作負載會在一個以上的使用者叢集上執行。本頁說明如何建立使用者叢集,以便在 Google Distributed Cloud 拓撲網域中使用。如要使用拓撲網域,必須使用 Google Distributed Cloud 1.31 以上版本。

如要設定拓撲網域,必須啟用進階叢集。請注意,進階叢集預覽功能有下列限制:

  • 您只能在建立新的 1.31 叢集時啟用進階叢集。
  • 啟用進階叢集後,您將無法將叢集升級至 1.32 版。請僅在測試環境中啟用進階叢集。

本文適用於負責設定、監控及管理技術基礎架構的管理員、架構師和作業人員。如要進一步瞭解我們在 Google Cloud 內容中提及的常見角色和範例工作,請參閱「常見的 GKE Enterprise 使用者角色和工作」。

事前準備

程序總覽

使用 gkectl 建立使用者叢集的主要步驟如下:

  1. 填寫使用者叢集設定檔
    在使用者叢集設定檔中,指定新叢集的詳細資料。
  2. 填寫 IP 區塊檔案
    在 IP 區塊檔案中,指定閘道、網路遮罩、控制層節點的 IP 位址,以及 (選用) 工作站節點的 IP 位址。
  3. 建立使用者叢集
    執行 gkectl create cluster,根據設定檔中的指定項目建立叢集。
  4. 確認使用者叢集正在執行中
    使用 kubectl 查看叢集節點。

完成這項程序後,您將擁有執行中的使用者叢集,可供部署工作負載。

填寫使用者叢集設定檔

如果您使用 gkeadm 建立管理員工作站,gkeadm 會產生名為 user-cluster.yaml 的使用者叢集設定檔範本。此外,gkeadm還為你填寫了部分欄位。

如果您未使用 gkeadm 建立管理員工作站,可以透過 gkectl 為使用者叢集設定檔產生範本。

如要產生使用者叢集設定檔的範本,請按照下列步驟操作:

gkectl create-config cluster --config=OUTPUT_FILENAME --gke-on-prem-version=VERSION

更改下列內容:

OUTPUT_FILENAME:您選擇的生成範本路徑。如果省略這個旗標,gkectl 會將檔案命名為 user-cluster.yaml,並放在目前的目錄中。

VERSION:所需版本號碼。例如: gkectl create-config cluster --gke-on-prem-version=1.32.100-gke.106

請詳閱使用者叢集設定檔文件,瞭解設定檔內容。建議您在另一個分頁或視窗中開啟這份文件,以便在完成下列步驟時參考。

name

name 欄位設為您選擇的使用者叢集名稱。

gkeOnPremVersion

系統會自動填寫這個欄位。指定 Google Distributed Cloud 的版本。例如 1.32.100-gke.106

enableAdvancedCluster

enableAdvancedCluster 設為 true

enableControlplaneV2

所有 1.30 以上版本的使用者叢集都必須使用 Controlplane V2。將 enableControlplaneV2 設為 true

啟用 Controlplane V2 後,使用者叢集的控制層會在使用者叢集的節點上執行。

enableDataplaneV2

enableDataplaneV2 設為 true

vCenter

移除整個部分。您可以在每個拓撲網域的 vSphere 基礎架構設定檔中設定 vCenter 資訊。

network

  • 從設定檔中移除下列項目:

    • 整個「network.hostConfig」部分。這項資訊是在每個拓撲網域的 vSphere 基礎架構設定檔中設定。
    • network.vCenter.networkName 欄位。這個欄位是在每個拓撲網域的 vSphere 基礎架構設定檔中設定。
    • 整個「network.controlPlaneIPBlock」部分。閘道、網路遮罩和控制層節點的 IP 位址是在 IP 區塊檔案中設定。
  • network.ipMode.ipBlockFilePath 設為 IP 區塊檔案的路徑。

  • 決定工作站節點取得 IP 位址的方式。選項如下:

    • 來自您預先設定的 DHCP 伺服器。將 network.ipMode.type 設為 "dhcp"

    • 從您在 IP 區塊檔案中提供的靜態 IP 位址清單。將 network.ipMode.type 設為 "static"

    使用者叢集的控制層節點必須從您在 IP 區塊檔案中提供的靜態位址清單取得 IP 位址。即使工作站節點是從 DHCP 伺服器取得位址,也適用這項規定。

    無論您是依賴 DHCP 伺服器,還是指定靜態 IP 位址清單,都必須為使用者叢集提供足夠的 IP 位址。如要瞭解需要多少 IP 位址,請參閱「規劃 IP 位址」。

  • network.podCIDRnetwork.serviceCIDR 都有預先填入的值,除非與網路中已使用的位址衝突,否則可以保留不變。Kubernetes 會使用這些範圍,將 IP 位址指派給叢集中的 Pod 和 Service。

loadBalancer

advancedNetworking

如要建立輸出 NAT 閘道,請將advancedNetworking設為 true

multipleNetworkInterfaces

multipleNetworkInterfaces 設為 false。拓撲網域不支援 Pod 的多個網路介面。

storage

storage.vSphereCSIDisabled 設為 true,即可停用 vSphere CSI 元件的部署作業。

masterNode

  • 如要為使用者叢集的控制平面節點指定 CPU 和記憶體,請填寫 masterNode 部分的 cpusmemoryMB 欄位。

  • 僅支援高可用性 (HA) 叢集。將 replicas 欄位設為 3,指定叢集將有三個控制層節點。

  • 如要啟用控制層節點的自動調整大小功能,請將 autoResize.enabled 設為 true

  • 移除整個 masterNode.vsphere 部分。

  • 在「masterNode.topologyDomains」欄位中,填入要讓控制平面節點所在的拓撲網域名稱。

nodePools

節點集區是叢集中具有相同設定的一組工作站節點。舉例來說,您可能會想為每個節點集區分別設定拓撲網域。您必須填寫nodePools部分,指定至少一個節點集區。

針對您指定的每個節點集區:

  • nodePools[i].topologyDomains欄位中,填入要將節點集區納入的拓撲網域名稱。

  • 移除 nodePools[i].vsphere 區段中的所有欄位,但 nodePools[i].vsphere.tags 除外。您可以在每個拓撲網域的 vSphere 基礎架構設定檔中指定這項資訊。

  • nodePools[i].osImageType 設為 ubuntu_cgroupv2ubuntu_containerd

如要進一步瞭解節點集區,請參閱「節點集區」和「建立及管理節點集區」。

antiAffinityGroups

antiAffinityGroups.enabled 設為 false。拓撲網域不支援分散式資源排程器 (DRS) 反親和性規則。

stackdriver

填寫「stackdriver」部分,為叢集啟用 Cloud Logging 和 Cloud Monitoring

請注意下列要求:

  • stackdriver.projectID 中的 ID 必須與 gkeConnect.projectIDcloudAuditLogging.projectID 中的 ID 相同。

  • stackdriver.clusterLocation 中設定的 Google Cloud 區域必須與 cloudAuditLogging.clusterLocationgkeConnect.location 中設定的區域相同。此外,如果 gkeOnPremAPI.enabledtrue,則 gkeOnPremAPI.location 中必須設定相同區域。

如果專案 ID 和區域不同,叢集建立作業就會失敗。

gkeConnect

使用者叢集必須註冊至 Google Cloud 機群

填寫「gkeConnect」部分,指定車隊主專案和相關聯的服務帳戶。gkeConnect.projectID 中的 ID 必須與 stackdriver.projectIDcloudAuditLogging.projectID 中設定的 ID 相同。如果專案 ID 不同,叢集建立作業就會失敗。

您可以選擇在 gkeConnect.location 中指定車隊和 Connect 服務的執行區域。如果您未加入這個欄位,叢集會使用這些服務的全球執行個體。

如果在設定檔中加入 gkeConnect.location,您指定的區域必須與 cloudAuditLogging.clusterLocationstackdriver.clusterLocationgkeOnPremAPI.location 中設定的區域相同。如果區域不同,叢集建立作業就會失敗。

gkeOnPremAPI

本節說明如何向 GKE On-Prem API 註冊叢集

gkectl 指令列工具是唯一可用的叢集生命週期管理工具,適用於使用拓撲網域的叢集。雖然使用拓撲網域的叢集不支援 Google Cloud 控制台、Google Cloud CLI 和 Terraform,但您可以在建立叢集時,選擇在 GKE On-Prem API 中註冊叢集。

如果專案已啟用 GKE On-Prem API,專案中的所有叢集都會在 stackdriver.clusterLocation 中設定的區域,自動註冊 GKE On-Prem API。Google Cloud gkeOnPremAPI.location 區域必須與 cloudAuditLogging.clusterLocationgkeConnect.locationstackdriver.clusterLocation 中指定的區域相同。

  • 如要在專案中註冊所有叢集,請務必按照「事前準備」一節中的步驟,在專案中啟用及使用 GKE On-Prem API。

  • 如果不想在 GKE On-Prem API 中註冊叢集,請加入這個區段,並將 gkeOnPremAPI.enabled 設為 false。如果不想在專案中註冊任何叢集,請在專案中停用 gkeonprem.googleapis.com (GKE On-Prem API 的服務名稱)。如需操作說明,請參閱「停用服務」。

cloudAuditLogging

如要整合叢集 Kubernetes API 伺服器的稽核記錄與 Cloud 稽核記錄,請填寫cloudAuditLogging 部分。

請注意下列要求:

# advanced-cluster-change #

cloudAuditLogging.serviceAccountKeyPath 設為與 stackdriver.serviceAccountKeyPath 相同的路徑。

  • cloudAuditLogging.projectID 中的 ID 必須與 gkeConnect.projectIDstackdriver.projectID 中的 ID 相同。

  • cloudAuditLogging.clusterLocation 中的區域必須與 gkeConnect.location 中設定的區域相同 (如果設定檔中包含該欄位) 和 stackdriver.clusterLocation。此外,如果 gkeOnPremAPI.enabledtrue,則必須在 gkeOnPremAPI.location 中設定相同區域。

如果專案 ID 和區域不同,叢集建立作業就會失敗。

preparedSecrets

移除 preparedSecrets 欄位。 啟用拓撲網域時,系統不支援準備好的憑證

schedulerConfiguration

如要設定其他會傳遞至 kube-scheduler 的設定,請將 schedulerConfiguration 區段新增至設定檔。

填寫完畢的設定檔範例

以下是 IP 區塊檔案和使用者叢集設定檔的範例:

user-ipblock.yaml

blocks:
  - netmask: 255.255.255.0
    gateway: 172.16.21.1
    ips:
    - ip: 172.16.21.2
      hostname: worker-vm-1
    - ip: 172.16.21.3
      hostname: worker-vm-2
    - ip: 172.16.21.4
      hostname: worker-vm-3
    - ip: 172.16.21.5
      hostname: worker-vm-4
  - netmask: 255.255.255.0
    gateway: 100.115.223.254
    ips:
    - ip: 100.115.222.205
      hostname: cp-1
      isControlPlane: true
    - ip: 100.115.222.206
      hostname: cp-2
      isControlPlane: true
    - ip: 100.115.222.207
      hostname: cp-3
      isControlPlane: true

user-cluster.yaml

cat user-cluster.yaml
apiVersion: v1
kind: UserCluster
name: "my-user-cluster"
gkeOnPremVersion: 1.32.100-gke.106
enableAdvancedCluster: true
enableControlplaneV2: true
enableDataplaneV2: true
network:
  ipMode:
    type: "static"
    ipBlockFilePath: "user-ipblock.yaml"
  serviceCIDR: 10.96.0.0/20
  podCIDR: 192.168.0.0/16
loadBalancer:
  vips:
    controlPlaneVIP: "100.115.222.200"
    ingressVIP: "172.16.21.30"
  kind: "ManualLB"
  manualLB:
    ingressHTTPNodePort: 32527
    ingressHTTPSNodePort: 30139
    controlPlaneNodePort: 30968
masterNode:
  cpus: 4
  memoryMB: 8192
  replicas: 3
nodePools:
- name: "worker-node-pool1"
  cpus: 4
  memoryMB: 8192
  replicas: 3
  topologyDomains:
  - "domain1"
antiAffinityGroups:
  enabled: false
gkeConnect:
  projectID: "my-project-123"
  location: "us-central1"
  registerServiceAccountKeyPath: "connect-register-sa-2203040617.json"
stackdriver:
  projectID: "my-project-123"
  clusterLocation: "us-central1"
  enableVPC: false
  serviceAccountKeyPath: "log-mon-sa-2203040617.json"
autoRepair:
  enabled: true

以下是上述範例中需要瞭解的重要事項:

  • nodePools.replicas 欄位設為 3,表示 "worker-node-pool" 中有三個工作站節點。所有工作站節點都會使用靜態 IP 位址,因為 network.ipMode.type 已設為 "static"

  • 控制層節點和工作站節點的 IP 位址會指定在 IP 區塊檔案中。即使只有三個工作站節點,IP 區塊檔案仍有四個工作站節點位址。叢集升級、更新和自動修復期間需要額外的工作節點 IP 位址。控制層節點的 IP 位址會標示 isControlPlane: true 旗標。

  • 啟用進階叢集、Controlplane V2 和 Dataplane V2。

  • masterNode.replicas 欄位設為 3,因此叢集將具備高可用性控制層。

  • 控制層 VIP 與控制層節點位於相同的 VLAN,而 Ingress VIP 與工作站節點位於相同的 VLAN

填寫 IP 區塊檔案

IP 區塊檔案的範本複製到使用者叢集設定檔中 network.ipMode.ipBlockFilePath 欄位指定的目錄檔案。為管理員叢集和每個使用者叢集分別建立 IP 區塊檔案。

將閘道、網路遮罩和控制層節點的 IP 位址新增至 IP 區塊檔案。針對每個控制層節點 IP 位址,新增 isControlPlane: true,如上一個範例所示。如要建立高可用性 (HA) 使用者叢集,請指定三個 IP 位址。否則,請指定一個 IP 位址。為控制層節點指定的 IP 位址數量,必須與使用者叢集設定檔中 masterNode.replicas 欄位的數量相符。

如果 network.ipMode.type 設為 "static",請將工作節點的 IP 位址新增至 IP 區塊檔案。請務必指定一個額外 IP 位址,供叢集升級、更新和自動修復期間使用。

IP 區塊檔案中的每個閘道位址,都必須與 vSphere 基礎架構設定檔中 topologyDomains[i].network.gateway 欄位指定的位址相符。詳情請參閱拓撲網域範例

建立使用者叢集

執行下列指令來建立使用者叢集:

gkectl create cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

找出使用者叢集 kubeconfig 檔案

gkectl create cluster 指令會在目前目錄中建立名為 USER_CLUSTER_NAME-kubeconfig 的 kubeconfig 檔案。稍後您需要這個 kubeconfig 檔案,才能與使用者叢集互動。

kubeconfig 檔案包含使用者叢集的名稱。如要查看叢集名稱,可以執行:

kubectl config get-clusters --kubeconfig USER_CLUSTER_KUBECONFIG

輸出內容會顯示叢集名稱。例如:

NAME
my-user-cluster

您可以視需要變更 kubeconfig 檔案的名稱和位置。

確認使用者叢集正在執行中

確認使用者叢集正在執行:

kubectl get nodes --kubeconfig USER_CLUSTER_KUBECONFIG

USER_CLUSTER_KUBECONFIG 替換為使用者叢集 kubeconfig 檔案的路徑。

輸出內容會顯示使用者叢集節點。例如:

cp-vm-1       Ready    control-plane,master   18m
cp-vm-2       Ready    control-plane,master   18m
cp-vm-3       Ready    control-plane,master   18m
worker-vm-1   Ready                           6m7s
worker-vm-2   Ready                           6m6s
worker-vm-3   Ready                           6m14s

設定「PodTemplate

拓撲標籤會填入拓撲網域中節點的標籤。 除非您的拓撲網域設定使用預設限制 "topology.kubernetes.io/zone" 做為拓撲鍵,否則您需要在 Deployment、StatefulSet 或 ReplicaSet 的 Pod 範本中設定拓撲鍵 (視情況而定)。

舉例來說,假設您在拓撲標籤中將鍵定義為 "topology.examplepetstore.com/zone"。在 PodTemplate 中,您會將金鑰指定為 topologySpreadConstraints.topologyKey 欄位的值。這樣一來,Kubernetes 排程器就能在拓撲網域中分配 Pod,確保高可用性,並避免在發生故障時,Pod 過度集中在單一區域。

疑難排解

請參閱「建立及升級叢集疑難排解」。

後續步驟