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

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

如要設定拓撲網域,必須啟用進階叢集。

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

事前準備

程序總覽

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

  1. 填寫使用者叢集設定檔
    在使用者叢集設定檔中,指定新叢集的詳細資料。
  2. 填寫 IP 封鎖檔案
    在 IP 區塊檔案中,指定閘道、網路遮罩、控制層節點和 worker 節點 (選用) 的 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.36.200-gke.118。

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

name

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

gkeOnPremVersion

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

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 區塊檔案的路徑。

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

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

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

    使用者叢集的控制層節點必須從您在 IP 區塊檔案中提供的靜態位址清單取得 IP 位址。即使 worker 節點是從 DHCP 伺服器取得位址,也是如此。

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

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

loadBalancer

advancedNetworking

如果您打算建立輸出 NAT 閘道,請將 advancedNetworking 設為 true。

multipleNetworkInterfaces

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

storage

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

masterNode

  • 如要為使用者叢集的控制層節點指定 CPU 和記憶體,請填寫 masterNode 區段中的 cpus 和 memoryMB 欄位。

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

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

  • 移除整個 masterNode.vsphere 區段。

  • 在 masterNode.topologyDomains 欄位中,填入控制層節點所在的拓撲網域名稱。

nodePools

節點集區是叢集內設定相同的一組 worker 節點。舉例來說,您可能想為每個節點集區設定獨立的拓撲網域。您必須填寫 nodePools 區段,指定至少一個節點集區。

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

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

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

  • 將 nodePools[i].osImageType 設為 ubuntu_cgv2。

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

antiAffinityGroups

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

stackdriver

填寫 stackdriver 區段,為叢集啟用 Cloud Logging 和 Cloud Monitoring。

請注意下列要求:

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

  • stackdriver.clusterLocation 中設定的 Google Cloud 區域必須與 cloudAuditLogging.clusterLocation 和 gkeConnect.location 中設定的區域相同。此外,如果 gkeOnPremAPI.enabled 為 true,則必須在 gkeOnPremAPI.location 中設定相同區域。

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

gkeConnect

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

填寫 gkeConnect 區段,指定機群主專案和相關聯的服務帳戶。gkeConnect.projectID 中的 ID 必須與 stackdriver.projectID 和 cloudAuditLogging.projectID 中設定的 ID 相同。如果專案 ID 不同,叢集建立作業就會失敗。

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

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

gkeOnPremAPI

本節說明如何在 GKE On-Prem API 中註冊叢集。

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

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

  • 如要將專案中的所有叢集註冊到 GKE On-Prem API,請務必按照「事前準備」中的步驟操作,在專案中啟用及使用 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.projectID 和 stackdriver.projectID 中的 ID 相同。

  • cloudAuditLogging.clusterLocation 中的區域必須與 gkeConnect.location (如果設定檔包含該欄位) 和 stackdriver.clusterLocation 中設定的區域相同。此外,如果 gkeOnPremAPI.enabled 為 true,則必須在 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.36.200-gke.118
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" 中有三個 worker 節點。所有 worker 節點都使用靜態 IP 位址,因為 network.ipMode.type 設為 "static"。

  • 控制層節點和 worker 節點的 IP 位址是在 IP 區塊檔案中指定。雖然只有三個 worker 節點,但 IP 區塊檔案有四個 worker 節點位址。在叢集升級、更新和自動修復期間,需要額外的 worker 節點 IP 位址。控制層節點的 IP 位址具有 isControlPlane: true 旗標。

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

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

  • 控制層 VIP 與控制層節點位於相同的 VLAN,而 ingress VIP 則與 worker 節點位於相同的 VLAN

填寫 IP 封鎖檔案

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

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

如果 network.ipMode.type 設為 "static",請將 worker 節點的 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 過度集中在任何單一區域,以免發生故障。

疑難排解

請參閱「排解叢集建立和升級問題」。

後續步驟