Требования

Для корректной работы Deckhouse Kubernetes Platform с VMware vSphere необходимы:

  • Доступ к vCenter;
  • Пользователь с необходимым набором прав;
  • Созданные теги и категории тегов в vSphere;
  • Сети с DHCP и интернетом;
  • Доступные shared datastore на всех ESXi.

  • Версия vSphere: 7.x или 8.x с поддержкой механизма Online volume expansion.
  • vCenter: доступен изнутри кластера с master-узлов.
  • Созданный Datacenter, в котором:
    1. VirtualMachine template.
      • Образ виртуальной машины должен использовать Virtual machines with hardware version 15 or later (необходимо для работы online resize).
      • Необходимо наличие пакетов: open-vm-tools, cloud-init и cloud-init-vmware-guestinfo (при использовании версии cloud-init ниже 21.3).
    2. Network.
      • Должна быть доступна на всех ESXi, на которых будут создаваться виртуальные машины.
    3. Datastore (один или несколько).
      • Подключен ко всем ESXi, на которых будут создаваться виртуальные машины.
      • Необходимо назначение тега из категории тегов, указанных в zoneTagCategory (по умолчанию k8s-zone). Этот тег будет обозначать зону. Все Cluster’ы из конкретной зоны должны иметь доступ ко всем Datastore’ам с идентичной зоной.
    4. Cluster.
      • Добавлены используемые ESXi.
      • Необходимо назначение тега из категории тегов, указанных в zoneTagCategory (по умолчанию k8s-zone). Этот тег будет обозначать зону.
    5. Folder для создаваемых виртуальных машин.
      • Опциональный (по умолчанию используется root vm-каталог).
    6. Роль.
      • Должна содержать необходимый набор прав.
    7. Пользователь.
      • Привязывается роль из п. 6.
  • На созданный Datacenter необходимо назначить тег из категории тегов, указанный в regionTagCategory (по умолчанию k8s-region). Этот тег будет обозначать регион.

Требования к образу виртуальной машины

Для создания шаблона виртуальной машины (Template) рекомендуется использовать готовый cloud-образ/OVA-файл, предоставляемый вендором ОС:

Если вы планируете использовать дистрибутив отечественной ОС, обратитесь к вендору ОС для получения образа/OVA-файла.

Провайдер поддерживает работу только с одним диском в шаблоне виртуальной машины. Убедитесь, что шаблон содержит только один диск.

Подготовка образа виртуальной машины

DKP использует cloud-init для настройки виртуальной машины после запуска. Чтобы подготовить cloud-init и образ ВМ, выполните следующие действия:

  1. Установите необходимые пакеты:

    Если используется версия cloud-init ниже 21.3 (требуется поддержка VMware GuestInfo):

    sudo apt-get update
    sudo apt-get install -y open-vm-tools cloud-init cloud-init-vmware-guestinfo
    

    Если используется версия cloud-init 21.3 и выше:

    sudo apt-get update
    sudo apt-get install -y open-vm-tools cloud-init
    
  2. Проверьте, что в файле /etc/cloud/cloud.cfg установлен параметр disable_vmware_customization: false.

  3. Убедитесь, что в файле /etc/cloud/cloud.cfg указан параметр default_user. Он необходим для добавления SSH-ключа при запуске ВМ.

  4. Добавьте datasource VMware GuestInfo — создайте файл /etc/cloud/cloud.cfg.d/99-DataSourceVMwareGuestInfo.cfg:

    datasource:
      VMware:
        vmware_cust_file_max_wait: 10
    
  5. Перед созданием шаблона ВМ сбросьте идентификаторы и состояние cloud-init:

    truncate -s 0 /etc/machine-id rm /var/lib/dbus/machine-id ln -s /etc/machine-id /var/lib/dbus/machine-id
    
  6. Очистите логи событий cloud-init:

    cloud-init clean --logs --seed
    

После запуска виртуальной машины в ней должны быть запущены следующие службы, связанные с пакетами, установленными при подготовке cloud-init:

  • cloud-config.service,
  • cloud-final.service,
  • cloud-init.service.

Чтобы убедиться в том, что службы включены, используйте команду:

systemctl is-enabled cloud-config.service cloud-init.service cloud-final.service

Пример ответа для включенных служб:

enabled
enabled
enabled

DKP создаёт диски виртуальных машин с типом eagerZeroedThick, но тип дисков созданных ВМ будет изменён без уведомления, согласно настроенным в vSphere VM Storage Policy. Подробнее можно прочитать в документации.

DKP использует интерфейс ens192, как интерфейс по умолчанию для виртуальных машин в vSphere. Поэтому, при использовании статических IP-адресов в mainNetwork, вы должны в образе ОС создать интерфейс с именем ens192, как интерфейс по умолчанию.

Установка govc

Для настройки окружения используется CLI-инструмент govc. После установки задайте переменные окружения:

export GOVC_URL=example.com
export GOVC_USERNAME=<username>@vsphere.local
export GOVC_PASSWORD=<password>
export GOVC_INSECURE=1

Настройка тегов и категорий

В vSphere нет встроенных понятий региона и зоны — вместо этого используются теги.

Создайте категории тегов:

govc tags.category.create -d "Kubernetes Region" k8s-region
govc tags.category.create -d "Kubernetes Zone" k8s-zone

Создайте теги:

govc tags.create -d "Kubernetes Region" -c k8s-region test-region
govc tags.create -d "Kubernetes Zone Test 1" -c k8s-zone test-zone-1
govc tags.create -d "Kubernetes Zone Test 2" -c k8s-zone test-zone-2

Назначьте теги:

govc tags.attach -c k8s-region test-region /<DatacenterName>
govc tags.attach -c k8s-zone test-zone-1 /<DatacenterName>/host/<ClusterName1>
govc tags.attach -c k8s-zone test-zone-2 /<DatacenterName>/host/<ClusterName2>

Настройка Datastore

Для корректной работы PersistentVolume необходимо, чтобы datastore был доступен на всех ESXi.

Назначьте теги:

govc tags.attach -c k8s-region test-region /<DatacenterName>/datastore/<DatastoreName1>
govc tags.attach -c k8s-zone test-zone-1 /<DatacenterName>/datastore/<DatastoreName1>

govc tags.attach -c k8s-region test-region /<DatacenterName>/datastore/<DatastoreName2>
govc tags.attach -c k8s-zone test-zone-2 /<DatacenterName>/datastore/<DatastoreName2>

Создание и назначение роли

Создайте роль с необходимыми правами:

govc role.create deckhouse \
   Cns.Searchable Datastore.AllocateSpace Datastore.Browse Datastore.FileManagement \
   Global.GlobalTag Global.SystemTag Network.Assign StorageProfile.View \
   VcIdentityProviders.Read \
   Infraprofile.Read\
   $(govc role.ls Admin | grep -F -e 'Folder.' -e 'InventoryService.' -e 'Resource.' -e 'VirtualMachine.' -e 'Host.Cim.' -e 'Host.Config.' -e 'Profile.' -e 'VApp.')

Назначьте роль пользователю:

govc permissions.set -principal <username>@vsphere.local -role deckhouse /

Для более детальной настройки прав обратитесь к официальной документации.