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

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

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

  • User с необходимым набором прав.
  • Network с DHCP и доступом в интернет.
  • Datacenter с соответствующим тегом k8s-region.
  • Cluster с соответствующим тегом k8s-zone.
  • Datastore в любом количестве с соответствующими тегами.
  • Templateподготовленный образ виртуальной машины.

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

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

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

Список привилегий Назначение
Cns.Searchable
StorageProfile.View
Datastore.AllocateSpace
Datastore.Browse
Datastore.FileManagement
Выделение дисков при создании виртуальных машин и заказе PersistentVolumes в кластере.
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
Deckhouse Kubernetes Platform использует теги для определения доступных ему объектов Datacenter, Cluster и Datastore, а также для определения виртуальных машин, находящихся под его управлением.
Folder.Create
Folder.Delete
Folder.Move
Folder.Rename
Группировка кластера Deckhouse Kubernetes Platform в одном Folder в vSphere Inventory.
Network.Assign
Resource.ApplyRecommendation
Resource.AssignVAppToPool
Resource.AssignVMToPool
Resource.ColdMigrate
Resource.CreatePool
Resource.DeletePool
Resource.EditPool
Resource.HotMigrate
Resource.MovePool
Resource.QueryVMotion
Resource.RenamePool
VirtualMachine.Config.AddExistingDisk
VirtualMachine.Config.AddNewDisk
VirtualMachine.Config.AddRemoveDevice
VirtualMachine.Config.AdvancedConfig
VirtualMachine.Config.Annotation
VirtualMachine.Config.ChangeTracking
VirtualMachine.Config.CPUCount
VirtualMachine.Config.DiskExtend
VirtualMachine.Config.DiskLease
VirtualMachine.Config.EditDevice
VirtualMachine.Config.HostUSBDevice
VirtualMachine.Config.ManagedBy
VirtualMachine.Config.Memory
VirtualMachine.Config.MksControl
VirtualMachine.Config.QueryFTCompatibility
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.ToggleForkParent
VirtualMachine.Config.UpgradeVirtualHardware
VirtualMachine.GuestOperations.Execute
VirtualMachine.GuestOperations.Modify
VirtualMachine.GuestOperations.ModifyAliases
VirtualMachine.GuestOperations.Query
VirtualMachine.GuestOperations.QueryAliases
VirtualMachine.Hbr.ConfigureReplication
VirtualMachine.Hbr.MonitorReplication
VirtualMachine.Hbr.ReplicaManagement
VirtualMachine.Interact.AnswerQuestion
VirtualMachine.Interact.Backup
VirtualMachine.Interact.ConsoleInteract
VirtualMachine.Interact.CreateScreenshot
VirtualMachine.Interact.CreateSecondary
VirtualMachine.Interact.DefragmentAllDisks
VirtualMachine.Interact.DeviceConnection
VirtualMachine.Interact.DisableSecondary
VirtualMachine.Interact.DnD
VirtualMachine.Interact.EnableSecondary
VirtualMachine.Interact.GuestControl
VirtualMachine.Interact.MakePrimary
VirtualMachine.Interact.Pause
VirtualMachine.Interact.PowerOff
VirtualMachine.Interact.PowerOn
VirtualMachine.Interact.PutUsbScanCodes
VirtualMachine.Interact.Record
VirtualMachine.Interact.Replay
VirtualMachine.Interact.Reset
VirtualMachine.Interact.SESparseMaintenance
VirtualMachine.Interact.SetCDMedia
VirtualMachine.Interact.SetFloppyMedia
VirtualMachine.Interact.Suspend
VirtualMachine.Interact.SuspendToMemory
VirtualMachine.Interact.TerminateFaultTolerantVM
VirtualMachine.Interact.ToolsInstall
VirtualMachine.Interact.TurnOffFaultTolerance
VirtualMachine.Inventory.Create
VirtualMachine.Inventory.CreateFromExisting
VirtualMachine.Inventory.Delete
VirtualMachine.Inventory.Move
VirtualMachine.Inventory.Register
VirtualMachine.Inventory.Unregister
VirtualMachine.Namespace.Event
VirtualMachine.Namespace.EventNotify
VirtualMachine.Namespace.Management
VirtualMachine.Namespace.ModifyContent
VirtualMachine.Namespace.Query
VirtualMachine.Namespace.ReadContent
VirtualMachine.Provisioning.Clone
VirtualMachine.Provisioning.CloneTemplate
VirtualMachine.Provisioning.CreateTemplateFromVM
VirtualMachine.Provisioning.Customize
VirtualMachine.Provisioning.DeployTemplate
VirtualMachine.Provisioning.DiskRandomAccess
VirtualMachine.Provisioning.DiskRandomRead
VirtualMachine.Provisioning.FileRandomAccess
VirtualMachine.Provisioning.GetVmFiles
VirtualMachine.Provisioning.MarkAsTemplate
VirtualMachine.Provisioning.MarkAsVM
VirtualMachine.Provisioning.ModifyCustSpecs
VirtualMachine.Provisioning.PromoteDisks
VirtualMachine.Provisioning.PutVmFiles
VirtualMachine.Provisioning.ReadCustSpecs
VirtualMachine.State.CreateSnapshot
VirtualMachine.State.RemoveSnapshot
VirtualMachine.State.RenameSnapshot
VirtualMachine.State.RevertToSnapshot
Управление жизненным циклом виртуальных машин кластера Deckhouse Kubernetes Platform.

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

Установка govc

Для дальнейшей конфигурации vSphere вам понадобится vSphere CLI — govc.

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

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

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

В 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

Для динамического заказа 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>

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

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

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

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

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

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

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

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

Для создания шаблона виртуальной машины (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, как интерфейс по умолчанию.

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

Сети

Для работы кластера необходим 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).