Стадия жизненного цикла модуля: General Availability

Требования к окружению

Для корректной работы 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 (один или несколько):
      • Datastore должен быть подключен ко всем ESXi, на которых планируется создание виртуальных машин.
      • На Datastore должен быть назначен тег из категории, указанной в параметре zoneTagCategory (по умолчанию — k8s-zone). Этот тег определяет зону.
      • Все Cluster в пределах одной зоны должны иметь доступ ко всем Datastore с той же зоной.
    4. Cluster:
      • В Cluster должны быть добавлены все используемые ESXi.
      • На Cluster должен быть назначен тег из категории, указанной в параметре zoneTagCategory (по умолчанию — k8s-zone). Этот тег определяет зону.
    5. Folder для создаваемых виртуальных машин:
      • Параметр опционален.
      • По умолчанию используется корневой каталог виртуальных машин.
    6. Role:
    7. User:
      • Пользователю должна быть назначена роль, указанная в предыдущем пункте.
  • На созданный Datacenter должен быть назначен тег из категории, указанной в параметре regionTagCategory (по умолчанию — k8s-region). Этот тег определяет регион.

Список необходимых ресурсов vSphere

Список необходимых привилегий

О том, как создать и назначить роль пользователю, читайте в разделах «Настройка через vSphere Client» и «Настройка через govc».

Детальный список привилегий, необходимых для работы Deckhouse Kubernetes Platform в vSphere:

Категория привилегий в UI Список привилегий в UI Список привилегий в API Назначение привилегий в Deckhouse
— (назначаются по умолчанию при создании роли) System.Anonymous
System.Read
System.View
Базовый доступ к объектам vSphere Inventory, необходимый для работы всех компонентов интеграции Deckhouse с vSphere.
Cns Searchable Cns.Searchable Поиск и сопоставление объектов Container Native Storage при работе CSI-драйвера с томами Kubernetes.
Datastore Allocate space,
Browse datastore,
Low level file operations
Datastore.AllocateSpace
Datastore.Browse
Datastore.FileManagement
Выделение дисков при создании виртуальных машин и заказе PersistentVolumes в кластере.
Folder Create folder,
Delete folder,
Move folder,
Rename folder
Folder.Create
Folder.Delete
Folder.Move
Folder.Rename
Группировка кластера Deckhouse Kubernetes Platform в одном Folder в vSphere Inventory.
Global Global tag,
System tag
Global.GlobalTag
Global.SystemTag
Доступ к глобальным и системным тегам, используемым Deckhouse Kubernetes Platform при работе с объектами vSphere.
vSphere Tagging Assign or Unassign vSphere Tag,
Assign or Unassign vSphere Tag on Object,
Create vSphere Tag,
Create vSphere Tag Category,
Delete vSphere Tag,
Delete vSphere Tag Category,
Edit vSphere Tag,
Edit vSphere Tag Category,
Modify UsedBy Field for Category,
Modify UsedBy Field for Tag
InventoryService.Tagging.AttachTag
InventoryService.Tagging.ObjectAttachable
InventoryService.Tagging.CreateTag
InventoryService.Tagging.CreateCategory
InventoryService.Tagging.DeleteTag
InventoryService.Tagging.DeleteCategory
InventoryService.Tagging.EditTag
InventoryService.Tagging.EditCategory
InventoryService.Tagging.ModifyUsedByForCategory
InventoryService.Tagging.ModifyUsedByForTag
Deckhouse Kubernetes Platform использует теги для определения доступных ему объектов Datacenter, Cluster и Datastore, а также для определения виртуальных машин, находящихся под его управлением.
Network Assign network Network.Assign Подключение сетей и port group к виртуальным машинам кластера Deckhouse Kubernetes Platform.
Resource Assign virtual machine to resource pool,
Create resource pool,
Modify resource pool,
Remove resource pool,
Rename resource pool
Resource.AssignVMToPool
Resource.CreatePool
Resource.DeletePool
Resource.EditPool
Resource.RenamePool
Размещение виртуальных машин кластера Deckhouse Kubernetes Platform в целевом пуле ресурсов и управление этим пулом.
VM Storage Policies (Profile-driven Storage Privileges в vSphere 7) View VM storage policies (Profile-driven storage view в vSphere 7) StorageProfile.View Просмотр политик хранения, используемых при создании виртуальных машин и динамическом заказе томов в кластере.
vApp Add virtual machine,
Assign resource pool,
Create,
Delete,
Import,
Power Off,
Power On,
View OVF Environment,
vApp application configuration,
vApp instance configuration,
vApp resource configuration
VApp.ApplicationConfig
VApp.AssignResourcePool
VApp.AssignVM
VApp.Create
VApp.Delete
VApp.ExtractOvfEnvironment
VApp.Import
VApp.InstanceConfig
VApp.PowerOff
VApp.PowerOn
VApp.ResourceConfig
Управление операциями, связанными с развертыванием и конфигурацией vApp и OVF-шаблонов, используемых при создании виртуальных машин.
Virtual Machine > Change Configuration Add existing disk,
Add new disk,
Add or remove device,
Advanced configuration,
Set annotation,
Change CPU count,
Toggle disk change tracking,
Extend virtual disk,
Acquire disk lease,
Modify device settings,
Configure managedBy,
Change Memory,
Query unowned files,
Configure Raw device,
Reload from path,
Remove disk,
Rename,
Reset guest information,
Change resource,
Change Settings,
Change Swapfile placement,
Upgrade virtual machine compatibility
VirtualMachine.Config.AddExistingDisk
VirtualMachine.Config.AddNewDisk
VirtualMachine.Config.AddRemoveDevice
VirtualMachine.Config.AdvancedConfig
VirtualMachine.Config.Annotation
VirtualMachine.Config.CPUCount
VirtualMachine.Config.ChangeTracking
VirtualMachine.Config.DiskExtend
VirtualMachine.Config.DiskLease
VirtualMachine.Config.EditDevice
VirtualMachine.Config.ManagedBy
VirtualMachine.Config.Memory
VirtualMachine.Config.QueryUnownedFiles
VirtualMachine.Config.RawDevice
VirtualMachine.Config.ReloadFromPath
VirtualMachine.Config.RemoveDisk
VirtualMachine.Config.Rename
VirtualMachine.Config.ResetGuestInfo
VirtualMachine.Config.Resource
VirtualMachine.Config.Settings
VirtualMachine.Config.SwapPlacement
VirtualMachine.Config.UpgradeVirtualHardware
Управление жизненным циклом виртуальных машин кластера Deckhouse Kubernetes Platform.
Virtual Machine > Edit Inventory Create new,
Create from existing,
Remove,
Move
VirtualMachine.Inventory.Create
VirtualMachine.Inventory.CreateFromExisting
VirtualMachine.Inventory.Delete
VirtualMachine.Inventory.Move
Создание, удаление и перемещение виртуальных машин кластера Deckhouse Kubernetes Platform в инвентаре vSphere.
Virtual Machine > Guest Operations Guest Operation Queries VirtualMachine.GuestOperations.Query Получение информации из гостевой операционной системы виртуальных машин.
Virtual Machine > Interaction Answer question,
Device connection,
Guest operating system management by VIX API,
Power Off,
Power On,
Reset,
Configure CD media,
Install VMware Tools
VirtualMachine.Interact.AnswerQuestion
VirtualMachine.Interact.DeviceConnection
VirtualMachine.Interact.GuestControl
VirtualMachine.Interact.PowerOff
VirtualMachine.Interact.PowerOn
VirtualMachine.Interact.Reset
VirtualMachine.Interact.SetCDMedia
VirtualMachine.Interact.ToolsInstall
Управление состоянием виртуальных машин, подключением устройств и взаимодействием с гостевой операционной системой.
Virtual Machine > Provisioning Clone virtual machine,
Customize guest,
Deploy template,
Allow virtual machine download,
Allow virtual machine files upload,
Read customization specifications
VirtualMachine.Provisioning.Clone
VirtualMachine.Provisioning.Customize
VirtualMachine.Provisioning.DeployTemplate
VirtualMachine.Provisioning.GetVmFiles
VirtualMachine.Provisioning.PutVmFiles
VirtualMachine.Provisioning.ReadCustSpecs
Клонирование шаблонов виртуальных машин, их настройка и развертывание при создании узлов кластера Deckhouse Kubernetes Platform.
Virtual Machine > Snapshot Management Create snapshot,
Remove Snapshot,
Rename Snapshot
VirtualMachine.State.CreateSnapshot
VirtualMachine.State.RemoveSnapshot
VirtualMachine.State.RenameSnapshot
Управление снимками виртуальных машин и томов в сценариях, где эта функциональность используется компонентами платформы.

Конфигурация vSphere

Настройка через vSphere Client

Создание тегов и категорий тегов с использованием vSphere Client

В VMware vSphere нет понятий «регион» и «зона». «Регионом» в vSphere является Datacenter, а «зоной» — Cluster. Для создания этой связи используются теги.

  1. Откройте vSphere Client и перейдите в «Menu» → «Tags & Custom Attributes» → «Tags».

    Создание тегов и категорий тегов, шаг 1

  2. Откройте вкладку «Categories» и нажмите «NEW». Создайте категорию для регионов (например k8s-region): установите значение «One tag» для параметра «Tags Per Object» и задайте связываемые типы, включая Datacenter.

    Создание тегов и категорий тегов, шаг 2

  3. Создайте вторую категорию для зон (например, k8s-zone) с типами объектов Host, Cluster и Datastore.

    Создание тегов и категорий тегов, шаг 3

  4. Перейдите на вкладку «Tags» и создайте минимум по одному тегу в категории региона и в категории зон (например, test-region, test-zone-1).

    Создание тегов и категорий тегов, шаг 4

  5. Во вкладке «Inventory» выберите целевой Datacenter, перейдите в панель «Summary», откройте «Actions» → «Tags & Custom Attributes» → «Assign Tag» и назначьте тег региона. Повторите для каждого Cluster, на котором будут узлы, назначая соответствующие теги зон.

    Создание тегов и категорий тегов, шаг 5.1 Создание тегов и категорий тегов, шаг 5.2

Настройка Datastore с использованием vSphere Client

Для динамического заказа PersistentVolume необходимо, чтобы Datastore был доступен на каждом хосте ESXi в зоне (shared datastore).

Во вкладке «Inventory» выберите Datastore, перейдите в панель «Summary», затем откройте меню «Actions» → «Tags & Custom Attributes» → «Assign Tag». Назначьте Datastore тот же тег региона, что и у соответствующего Datacenter, а также тот же тег зоны, что и у соответствующего Cluster.

Создание тегов и категорий тегов, шаг 6

Создание и назначение роли с использованием vSphere Client

  1. Перейдите в «Menu» → «Administration» → «Access Control» → «Roles».

    Создание и назначение роли, шаг 1

  2. Нажмите «NEW», введите имя роли (например, deckhouse) и добавьте привилегии из списка.

    Создание и назначение роли, шаг 2

  3. Назначьте роль для учётной записи Deckhouse, во вкладке «Menu» → «Administration» → «Access Control» → «Global Permissions» нажмите «ADD» и выберите пользователя и роль deckhouse.

    Создание и назначение роли, шаг 3

Настройка через govc

Установка govc

Для дальнейшей настройки vSphere потребуется CLI-утилита govc.

После установки задайте переменные окружения для работы с vCenter:

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

Создание тегов и категорий тегов с использованием govc

В VMware vSphere нет понятий «регион» и «зона». «Регионом» в vSphere является Datacenter, а «зоной» — Cluster. Для создания этой связи используются теги.

Создайте категории тегов с помощью команд:

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

Создайте теги в каждой категории. Если вы планируете использовать несколько «зон» (Cluster), создайте тег для каждой из них:

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

Назначьте тег «региона» на Datacenter:

govc tags.attach -c k8s-region test-region /<DatacenterName>

Назначьте теги «зон» на объекты Cluster:

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 с использованием govc

Для динамического заказа PersistentVolume необходимо, чтобы Datastore был доступен на каждом хосте ESXi (shared datastore).

Для автоматического создания StorageClass в кластере Kubernetes назначьте созданные ранее теги «региона» и «зоны» на объекты Datastore:

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

Ввиду разнообразия подключаемых к vSphere SSO-провайдеров шаги по созданию пользователя в данной статье не рассматриваются.

Роль, которую предлагается создать далее, включает в себя привилегии из раздела «Список необходимых привилегий». При необходимости более гранулярных прав обратитесь в техподдержку Deckhouse.

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

govc role.create deckhouse \
   Cns.Searchable \
   Datastore.AllocateSpace Datastore.Browse Datastore.FileManagement \
   Folder.Create Folder.Delete Folder.Move Folder.Rename \
   Global.GlobalTag Global.SystemTag \
   InventoryService.Tagging.AttachTag InventoryService.Tagging.CreateCategory \
   InventoryService.Tagging.CreateTag InventoryService.Tagging.DeleteCategory \
   InventoryService.Tagging.DeleteTag InventoryService.Tagging.EditCategory \
   InventoryService.Tagging.EditTag InventoryService.Tagging.ModifyUsedByForCategory \
   InventoryService.Tagging.ModifyUsedByForTag InventoryService.Tagging.ObjectAttachable \
   Network.Assign \
   Resource.AssignVMToPool Resource.CreatePool Resource.DeletePool Resource.EditPool Resource.RenamePool \
   StorageProfile.View \
   System.Anonymous System.Read System.View \
   VApp.ApplicationConfig VApp.AssignResourcePool VApp.AssignVM VApp.Create VApp.Delete \
   VApp.ExtractOvfEnvironment VApp.Import VApp.InstanceConfig VApp.PowerOff VApp.PowerOn VApp.ResourceConfig \
   VirtualMachine.Config.AddExistingDisk VirtualMachine.Config.AddNewDisk VirtualMachine.Config.AddRemoveDevice \
   VirtualMachine.Config.AdvancedConfig VirtualMachine.Config.Annotation VirtualMachine.Config.CPUCount \
   VirtualMachine.Config.ChangeTracking VirtualMachine.Config.DiskExtend VirtualMachine.Config.DiskLease \
   VirtualMachine.Config.EditDevice VirtualMachine.Config.ManagedBy VirtualMachine.Config.Memory \
   VirtualMachine.Config.QueryUnownedFiles VirtualMachine.Config.RawDevice VirtualMachine.Config.ReloadFromPath \
   VirtualMachine.Config.RemoveDisk VirtualMachine.Config.Rename VirtualMachine.Config.ResetGuestInfo \
   VirtualMachine.Config.Resource VirtualMachine.Config.Settings VirtualMachine.Config.SwapPlacement \
   VirtualMachine.Config.UpgradeVirtualHardware \
   VirtualMachine.GuestOperations.Query \
   VirtualMachine.Interact.AnswerQuestion VirtualMachine.Interact.DeviceConnection \
   VirtualMachine.Interact.GuestControl VirtualMachine.Interact.PowerOff VirtualMachine.Interact.PowerOn \
   VirtualMachine.Interact.Reset VirtualMachine.Interact.SetCDMedia VirtualMachine.Interact.ToolsInstall \
   VirtualMachine.Inventory.Create VirtualMachine.Inventory.CreateFromExisting VirtualMachine.Inventory.Delete \
   VirtualMachine.Inventory.Move \
   VirtualMachine.Provisioning.Clone VirtualMachine.Provisioning.Customize VirtualMachine.Provisioning.DeployTemplate \
   VirtualMachine.Provisioning.GetVmFiles VirtualMachine.Provisioning.PutVmFiles VirtualMachine.Provisioning.ReadCustSpecs \
   VirtualMachine.State.CreateSnapshot VirtualMachine.State.RemoveSnapshot VirtualMachine.State.RenameSnapshot

Назначьте пользователю роль на объекте vCenter:

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

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

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

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

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

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

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

DKP использует cloud-init для настройки виртуальной машины после запуска.

Отключите VMware Guest OS Customization (а также любые механизмы vApp/OS customization, если они применимы в вашей схеме) для шаблона и виртуальных машин кластера. DKP выполняет первичную настройку узлов через cloud-init (datasource VMware GuestInfo). Включенная customization может конфликтовать с 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, как интерфейс по умолчанию.

Инфраструктура

Сети

Для работы кластера необходим VLAN с DHCP и доступом в интернет:

  • Если VLAN публичный (публичные адреса), нужна вторая сеть, в которой необходимо развернуть сеть узлов кластера (в этой сети DHCP не нужен).
  • Если VLAN внутренний (приватные адреса), эта же сеть будет сетью узлов кластера.

Входящий трафик

  • Если у вас имеется внутренний балансировщик запросов, можно обойтись им и направлять трафик напрямую на frontend-узлы кластера.
  • Если балансировщика нет, для организации отказоустойчивых LoadBalancer’ов рекомендуется использовать MetalLB в режиме BGP. В кластере будут созданы frontend-узлы с двумя интерфейсами. Для этого дополнительно потребуются:
    • отдельный VLAN для обмена трафиком между BGP-роутерами и MetalLB. В этом VLAN’e должны быть DHCP и доступ в интернет;
    • IP-адреса BGP-роутеров;
    • ASN (номер автономной системы) на BGP-роутере;
    • ASN (номер автономной системы) в кластере;
    • диапазон, из которого анонсировать адреса.

Использование хранилища данных

В кластере может одновременно использоваться различное количество типов хранилищ. В минимальной конфигурации потребуются:

  • Datastore, в котором Kubernetes-кластер будет заказывать PersistentVolume;
  • Datastore, в котором будут заказываться root-диски для виртуальной машины (это может быть тот же Datastore, что и для PersistentVolume).