設定 VM 主機群組親和性

本文提供範例,說明如何設定 Google Distributed Cloud 叢集,以使用 VM 主機親和性。

VM 主機群組親和性是 Google Distributed Cloud 提供的機制之一,可確保高可用性。使用 VM 主機群組親和性,建立實體 ESXi 主機群組。接著,設定叢集,將 VM 群組與主機群組建立關聯。

舉例來說,您可以將一個節點集區中的所有 VM 設定為在特定主機群組上執行。您也可以將第二個節點集區中的所有 VM 設定為在不同的主機群組上執行。然後將每個節點集區視為失敗網域。 如要區分失敗網域,可以為各節點集區中的 VM 新增標籤。

在進階叢集中,VM 主機群組親和性適用於 1.32.200 版和 1.33 以上版本。如果叢集使用拓撲網域,請在 vSphere 基礎架構設定檔的 topologyDomains[i].compute.hostGroups 欄位中設定主機群組,而不是使用者叢集設定檔中的 nodePools[i].vsphere.hostgroups 欄位。

事前準備

如要進行這項練習,vSphere 環境中必須至少有六部 ESXi 主機。

建立主機群組

在 vSphere 環境中建立兩個以上的主機 DRS 群組。在本練習中,兩個主機群組各含三部主機就已足夠。如需操作說明,請參閱「建立主機 DRS 群組」。

建立使用者叢集

本節提供範例,說明如何建立使用 VM 主機群組相依性的使用者叢集。本範例中的叢集使用 Controlplane V2。叢集具有高可用性控制層,因此有三個控制層節點。除了控制層節點外,還有六個工作站節點:一個節點集區中有三個,第二個節點集區也有三個。所有節點都使用靜態 IP 位址。

首先,請按照「建立使用者叢集」中的操作說明建立使用者叢集 (如果叢集使用拓撲網域,請參閱「建立要搭配拓撲網域使用的使用者叢集」)。

填寫設定檔時,請注意以下事項:

  • 不含拓撲網域:在使用者叢集設定檔中,為工作節點指定兩個節點集區。針對每個節點集區,將 replicas 設為 3,並在 nodePools[i].vsphere.hostgroups 中提供現有主機群組的名稱。
  • 使用拓撲網域:在 vSphere 基礎架構設定檔中,指定兩個拓撲網域,並為每個網域提供 topologyDomains[i].compute.hostGroups 中現有主機群組的名稱。在使用者叢集設定檔中,為工作站節點指定兩個節點集區,將 replicas 設為 3,並設定 nodePools[i].topologyDomains,將每個節點集區與拓撲網域建立關聯。

設定檔範例

以下範例說明如何設定 VM 主機群組親和性,包括不使用拓撲網域和使用拓撲網域的情況。

沒有拓撲網域

以下是 IP 區塊檔案範例,以及不使用拓撲網域的叢集使用者叢集設定檔部分內容。

user-ipblock.yaml

blocks:
  - netmask: 255.255.255.0
    gateway: 172.16.21.1
    ips:
    - ip: 172.16.21.2
    - ip: 172.16.21.3
    - ip: 172.16.21.4
    - ip: 172.16.21.5
    - ip: 172.16.21.6
    - ip: 172.16.21.7
    - ip: 172.16.21.8

user-cluster-yaml

apiVersion: v1
kind: UserCluster
...
network:
  hostConfig:
    dnsServers:
    - "203.0.113.2"
    - "198.51.100.2"
    ntpServers:
    - "216.239.35.4"
  ipMode:
    type: "static"
    ipBlockFilePath: "user-ipblock.yaml"
  controlPlaneIPBlock:
    netmask: "255.255.255.0"
    gateway: "172.16.21.1"
    ips:
    - ip: "172.16.21.9"
      hostname: "cp-vm-1"
    - ip: "172.16.21.10"
      hostname: "cp-vm-2"
    - ip: "172.16.21.11"
      hostname: "cp-vm-3"
loadBalancer:
  vips:
    controlPlaneVIP: "172.16.21.40"
    ingressVIP: "172.16.21.30"
  kind: MetalLB
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
    - "172.16.21.30-172.16.21.39"
...
enableAdvancedCluster: true
enableControlplaneV2: true
masterNode:
  cpus: 4
  memoryMB: 8192
  replicas: 3
nodePools:
- name: "worker-pool-1"
  enableLoadBalancer: true
  replicas: 3
  vsphere:
    hostgroups:
    - "hostgroup-1"
  labels:
    failuredomain: "failuredomain-1"
- name: "worker-pool-2"
  replicas: 3
  vsphere:
    hostgroups:
    - "hostgroup-2"
  labels:
    failuredomain: "failuredomain-2"
...

在上述範例中,請務必瞭解下列要點:

  • 工作站節點的靜態 IP 位址是在 IP 區塊檔案中指定。IP 區塊檔案有七個位址,但只有六個工作節點。叢集升級、更新和自動修復期間需要額外的 IP 位址。

  • 三個控制層節點的靜態 IP 位址是在使用者叢集設定檔的 network.controlPlaneIPBlock 區段中指定。這個區塊不需要額外 IP 位址。

  • masterNode.replicas 欄位設為 3,因此會有三個控制層節點。

  • 叢集控制器會建立 VM DRS 群組,其中包含 worker-pool-1 節點集區中的三個節點。控制器也會建立VM 主機親和性規則,確保 worker-pool-1 中的節點會在 hostgroup-1 中的主機上執行。worker-pool-1 中的節點具有標籤 failuredomain: "failuredomain-1"

  • 叢集控制器會建立 VM DRS 群組,其中包含 worker-pool-2 節點集區中的三個節點。控制器也會建立 VM 主機親和性規則,確保 worker-pool-2 中的節點會在 hostgroup-2 中的主機上執行。worker-pool-2 中的節點具有標籤 failuredomain: "failuredomain-2"

按照「建立使用者叢集」一文的說明,繼續建立使用者叢集。

使用拓撲網域

以下是vSphere 基礎架構設定檔和進階叢集使用者叢集設定檔的範例,該叢集使用拓撲網域。

vsphere-infra-config.yaml

vSphere 基礎架構設定檔中的每個拓撲網域,都會在 topologyDomains[i].compute.hostGroups 中指定主機群組,並在 topologyDomains[i].topologyLabels 中指定故障網域標籤。

apiVersion: vmware.cluster.gke.io/v1alpha1
kind: VSphereInfraConfig
metadata:
  name: default
...
topologyDomains:
- name: "topology-domain-1"
  topologyLabels:
    "topology.kubernetes.io/zone": "zone-1"
  compute:
    vcenter: "vc01.example"
    datacenter: "dc-1"
    cluster: "cls-1"
    resourcePool: "rp-1"
    hostGroups:
    - "hostgroup-1"
  storage:
    datastore: "vsanDatastore"
  network:
    vsphereNetwork: "vm-network-1"
    gateway: "172.16.21.1"
    dnsServers:
    - "203.0.113.2"
    - "198.51.100.2"
    ntpServers:
    - "216.239.35.4"
- name: "topology-domain-2"
  topologyLabels:
    "topology.kubernetes.io/zone": "zone-2"
  compute:
    vcenter: "vc01.example"
    datacenter: "dc-1"
    cluster: "cls-1"
    resourcePool: "rp-1"
    hostGroups:
    - "hostgroup-2"
  storage:
    datastore: "vsanDatastore"
  network:
    vsphereNetwork: "vm-network-1"
    gateway: "172.16.21.1"
    dnsServers:
    - "203.0.113.2"
    - "198.51.100.2"
    ntpServers:
    - "216.239.35.4"

user-cluster.yaml

在下列使用者叢集設定檔範例中,nodePools[i].vsphere 區段已移除,且每個節點集區都會在 nodePools[i].topologyDomains 中參照其拓撲網域。

叢集控制器會為 worker-pool-1 (位於 topology-domain-1 中) 建立 VM DRS 群組和 VM 主機相依性規則,以便節點在 hostgroup-1 中的主機上執行,並接收 topology.kubernetes.io/zone: "zone-1" 標籤。同樣地,叢集控制器會為 worker-pool-2 (位於 topology-domain-2 中) 建立 VM DRS 群組和 VM 主機親和性規則,以便節點在 hostgroup-2 中的主機上執行,並接收 topology.kubernetes.io/zone: "zone-2" 標籤。

apiVersion: v1
kind: UserCluster
...
enableAdvancedCluster: true
enableControlplaneV2: true
masterNode:
  cpus: 4
  memoryMB: 8192
  replicas: 3
  topologyDomains:
  - "topology-domain-1"
nodePools:
- name: "worker-pool-1"
  replicas: 3
  osImageType: "ubuntu_cgv2"
  topologyDomains:
  - "topology-domain-1"
- name: "worker-pool-2"
  replicas: 3
  osImageType: "ubuntu_cgv2"
  topologyDomains:
  - "topology-domain-2"
...

繼續建立使用者叢集,以便搭配拓撲網域使用。