Configurar a afinidade de grupo de host de VM

Neste documento, mostramos um exemplo de como configurar um cluster do Google Distributed Cloud para usar a afinidade de host da VM.

A afinidade de grupo do host da VM é um dos mecanismos que o Google Distributed Cloud oferece para garantir alta disponibilidade. Com a afinidade de grupo do host de VM, você cria grupos de hosts físicos ESXi. Em seguida, configure o cluster para associar grupos de VMs a grupos de hosts.

Por exemplo, é possível configurar todas as VMs em um pool de nós para serem executadas em um determinado grupo de hosts. Também é possível configurar todas as VMs em um segundo pool de nós para serem executadas em um grupo de hosts diferente. Em seguida, trate cada pool de nós como um domínio de falha. Para diferenciar os domínios de falha, adicione rótulos às VMs nos vários pools de nós.

Em clusters avançados, a afinidade de grupo de hosts de VM é compatível com a versão 1.32.200 e a versão 1.33 e mais recentes. Se o cluster usar domínios de topologia, configure grupos de hosts no campo topologyDomains[i].compute.hostGroups do arquivo de configuração da infraestrutura do vSphere em vez do campo nodePools[i].vsphere.hostgroups no arquivo de configuração do cluster de usuário.

Antes de começar

Para este exercício, você precisa ter pelo menos seis hosts ESXi no ambiente do vSphere.

Criar grupos de host

Crie dois ou mais grupos de DRS de host no seu ambiente do vSphere. Para este exercício, dois grupos de hosts com três hosts cada seriam apropriados. Para mais instruções, consulte Criar um grupo de DRS do host.

Criar um cluster de usuário

Nesta seção, você verá um exemplo de como criar um cluster de usuário que usa a afinidade de grupo do host da VM. O cluster neste exemplo usa o Controlplane V2. O cluster tem um plano de controle de alta disponibilidade, portanto, há três nós do plano de controle. Além dos nós do plano de controle, há seis nós de trabalho: três em um pool de nós e três em um segundo pool de nós. Todos os nós usam endereços IP estáticos.

Comece seguindo as instruções em Criar um cluster de usuário (ou Criar um cluster de usuário para uso com domínios de topologia se o cluster usar domínios de topologia).

Ao preencher os arquivos de configuração:

  • Sem domínios de topologia: no arquivo de configuração do cluster de usuário, especifique dois pools de nós para nós de trabalho. Para cada pool de nós, defina replicas como 3 e forneça o nome de um grupo de hosts em nodePools[i].vsphere.hostgroups.
  • Com domínios de topologia: no arquivo de configuração da infraestrutura do vSphere, especifique dois domínios de topologia e forneça o nome de um grupo de hosts existente em topologyDomains[i].compute.hostGroups para cada domínio. No arquivo de configuração do cluster de usuário, especifique dois pools de nós para nós de trabalho, defina replicas como 3 e defina nodePools[i].topologyDomains para associar cada pool de nós a um domínio de topologia.

Exemplo: arquivo de configuração

Os exemplos a seguir mostram como configurar a afinidade de grupo de host de VM sem domínios de topologia e com domínios de topologia.

Sem domínios de topologia

Confira um exemplo de um arquivo de bloco de IP e uma parte de um arquivo de configuração de cluster de usuário para um cluster que não usa domínios de topologia.

usuario-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"
...

Estes são os pontos importantes que você precisa entender no exemplo anterior:

  • Os endereços IP estáticos dos nós de trabalho são especificados em um arquivo de bloco de IP. O arquivo de bloco de IP tem sete endereços, mesmo que haja apenas seis nós de trabalho. O endereço IP extra é necessário durante o upgrade, a atualização e o reparo automático do cluster.

  • Os endereços IP estáticos dos três nós do plano de controle são especificados na seção network.controlPlaneIPBlock do arquivo de configuração do cluster de usuário. Não é necessário ter um endereço IP extra neste bloco.

  • O campo masterNode.replicas está definido como 3, então haverá três nós do plano de controle.

  • Um controlador de cluster criará um grupo de DRS de VM que tem os três nós no pool de nós worker-pool-1. Um controlador também criará uma regra de afinidade de host de VM que garante que os nós em worker-pool-1 sejam executados em hosts que estão em hostgroup-1. Os nós em worker-pool-1 têm o rótulo failuredomain: "failuredomain-1"

  • Um controlador de cluster criará um grupo de DRS de VM que tem os três nós no pool de nós worker-pool-2. Um controlador também criará uma regra de afinidade de host de VM que garante que os nós em worker-pool-2 sejam executados em hosts em hostgroup-2. Os nós em worker-pool-2 têm o rótulo failuredomain: "failuredomain-2"

Continue a criação do cluster de usuário conforme descrito em Criar um cluster de usuário.

Com domínios de topologia

Confira um exemplo de uma parte de um arquivo de configuração de infraestrutura do vSphere e um arquivo de configuração de cluster de usuário para um cluster avançado que usa domínios de topologia.

vsphere-infra-config.yaml

Cada domínio de topologia no arquivo de configuração da infraestrutura do vSphere especifica um grupo de hosts em topologyDomains[i].compute.hostGroups e um rótulo de domínio de falha em 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

No exemplo a seguir de um arquivo de configuração do cluster de usuário, a seção nodePools[i].vsphere é removida, e cada pool de nós faz referência ao domínio de topologia em nodePools[i].topologyDomains.

Um controlador de cluster cria um grupo de DRS de VM e uma regra de afinidade de host de VM para worker-pool-1 (em topology-domain-1) para que os nós sejam executados em hosts em hostgroup-1 e recebam o rótulo topology.kubernetes.io/zone: "zone-1". Da mesma forma, um controlador de cluster cria um grupo de DRS de VM e uma regra de afinidade de host de VM para worker-pool-2 (em topology-domain-2) para que os nós sejam executados em hosts em hostgroup-2 e recebam o rótulo 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"
...

Continue para criar um cluster de usuário para uso com domínios de topologia.