Требования к окружению
- Версия vSphere:
7.xили8.xс поддержкой механизмаOnline volume expansion. - vCenter, до которого есть доступ изнутри кластера с master-узлов.
- Создать Datacenter, в котором создать:
- 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).
- Образ виртуальной машины должен использовать
- Network, доступную на всех ESXi, на которых будут создаваться виртуальные машины.
- Datastore (или несколько), подключенный ко всем ESXi, на которых будут создаваться виртуальные машины.
- На Datastore’ы необходимо «повесить» тег из категории тегов, указанных в
zoneTagCategory(по умолчаниюk8s-zone). Этот тег будет обозначать зону. Все Cluster’ы из конкретной зоны должны иметь доступ ко всем Datastore’ам с идентичной зоной.
- На Datastore’ы необходимо «повесить» тег из категории тегов, указанных в
- Cluster, в который добавить необходимые используемые ESXi.
- На Cluster необходимо «повесить» тег из категории тегов, указанных в
zoneTagCategory(по умолчаниюk8s-zone). Этот тег будет обозначать зону.
- На Cluster необходимо «повесить» тег из категории тегов, указанных в
- Folder для создаваемых виртуальных машин.
- Опциональный. По умолчанию будет использоваться root vm-каталог.
- Роль с необходимым набором прав.
- Пользователя, привязав к нему роль из п. 6.
- VirtualMachine template.
- На созданный Datacenter необходимо «повесить» тег из категории тегов, указанный в
regionTagCategory(по умолчаниюk8s-region). Этот тег будет обозначать регион.
Список необходимых ресурсов vSphere
- User с необходимым набором прав.
- Network с DHCP и доступом в интернет.
- Datacenter с соответствующим тегом
k8s-region. - Cluster с соответствующим тегом
k8s-zone. - Datastore в любом количестве с соответствующими тегами.
- Template — подготовленный образ виртуальной машины.
Список необходимых привилегий
О том, как создать и назначить роль пользователю, читайте в разделе «Создание и назначение роли».
Детальный список привилегий, необходимых для работы Deckhouse Kubernetes Platform в vSphere:
| Список привилегий | Назначение |
|---|---|
Cns.SearchableStorageProfile.ViewDatastore.AllocateSpaceDatastore.BrowseDatastore.FileManagement |
Выделение дисков при создании виртуальных машин и заказе PersistentVolumes в кластере. |
Global.GlobalTagGlobal.SystemTagInventoryService.Tagging.AttachTagInventoryService.Tagging.CreateCategoryInventoryService.Tagging.CreateTagInventoryService.Tagging.DeleteCategoryInventoryService.Tagging.DeleteTagInventoryService.Tagging.EditCategoryInventoryService.Tagging.EditTagInventoryService.Tagging.ModifyUsedByForCategoryInventoryService.Tagging.ModifyUsedByForTagInventoryService.Tagging.ObjectAttachable |
Deckhouse Kubernetes Platform использует теги для определения доступных ему объектов Datacenter, Cluster и Datastore, а также для определения виртуальных машин, находящихся под его управлением. |
Folder.CreateFolder.DeleteFolder.MoveFolder.Rename |
Группировка кластера Deckhouse Kubernetes Platform в одном Folder в vSphere Inventory. |
Network.AssignResource.ApplyRecommendationResource.AssignVAppToPoolResource.AssignVMToPoolResource.ColdMigrateResource.CreatePoolResource.DeletePoolResource.EditPoolResource.HotMigrateResource.MovePoolResource.QueryVMotionResource.RenamePoolVirtualMachine.Config.AddExistingDiskVirtualMachine.Config.AddNewDiskVirtualMachine.Config.AddRemoveDeviceVirtualMachine.Config.AdvancedConfigVirtualMachine.Config.AnnotationVirtualMachine.Config.ChangeTrackingVirtualMachine.Config.CPUCountVirtualMachine.Config.DiskExtendVirtualMachine.Config.DiskLeaseVirtualMachine.Config.EditDeviceVirtualMachine.Config.HostUSBDeviceVirtualMachine.Config.ManagedByVirtualMachine.Config.MemoryVirtualMachine.Config.MksControlVirtualMachine.Config.QueryFTCompatibilityVirtualMachine.Config.QueryUnownedFilesVirtualMachine.Config.RawDeviceVirtualMachine.Config.ReloadFromPathVirtualMachine.Config.RemoveDiskVirtualMachine.Config.RenameVirtualMachine.Config.ResetGuestInfoVirtualMachine.Config.ResourceVirtualMachine.Config.SettingsVirtualMachine.Config.SwapPlacementVirtualMachine.Config.ToggleForkParentVirtualMachine.Config.UpgradeVirtualHardwareVirtualMachine.GuestOperations.ExecuteVirtualMachine.GuestOperations.ModifyVirtualMachine.GuestOperations.ModifyAliasesVirtualMachine.GuestOperations.QueryVirtualMachine.GuestOperations.QueryAliasesVirtualMachine.Hbr.ConfigureReplicationVirtualMachine.Hbr.MonitorReplicationVirtualMachine.Hbr.ReplicaManagementVirtualMachine.Interact.AnswerQuestionVirtualMachine.Interact.BackupVirtualMachine.Interact.ConsoleInteractVirtualMachine.Interact.CreateScreenshotVirtualMachine.Interact.CreateSecondaryVirtualMachine.Interact.DefragmentAllDisksVirtualMachine.Interact.DeviceConnectionVirtualMachine.Interact.DisableSecondaryVirtualMachine.Interact.DnDVirtualMachine.Interact.EnableSecondaryVirtualMachine.Interact.GuestControlVirtualMachine.Interact.MakePrimaryVirtualMachine.Interact.PauseVirtualMachine.Interact.PowerOffVirtualMachine.Interact.PowerOnVirtualMachine.Interact.PutUsbScanCodesVirtualMachine.Interact.RecordVirtualMachine.Interact.ReplayVirtualMachine.Interact.ResetVirtualMachine.Interact.SESparseMaintenanceVirtualMachine.Interact.SetCDMediaVirtualMachine.Interact.SetFloppyMediaVirtualMachine.Interact.SuspendVirtualMachine.Interact.SuspendToMemoryVirtualMachine.Interact.TerminateFaultTolerantVMVirtualMachine.Interact.ToolsInstallVirtualMachine.Interact.TurnOffFaultToleranceVirtualMachine.Inventory.CreateVirtualMachine.Inventory.CreateFromExistingVirtualMachine.Inventory.DeleteVirtualMachine.Inventory.MoveVirtualMachine.Inventory.RegisterVirtualMachine.Inventory.UnregisterVirtualMachine.Namespace.EventVirtualMachine.Namespace.EventNotifyVirtualMachine.Namespace.ManagementVirtualMachine.Namespace.ModifyContentVirtualMachine.Namespace.QueryVirtualMachine.Namespace.ReadContentVirtualMachine.Provisioning.CloneVirtualMachine.Provisioning.CloneTemplateVirtualMachine.Provisioning.CreateTemplateFromVMVirtualMachine.Provisioning.CustomizeVirtualMachine.Provisioning.DeployTemplateVirtualMachine.Provisioning.DiskRandomAccessVirtualMachine.Provisioning.DiskRandomReadVirtualMachine.Provisioning.FileRandomAccessVirtualMachine.Provisioning.GetVmFilesVirtualMachine.Provisioning.MarkAsTemplateVirtualMachine.Provisioning.MarkAsVMVirtualMachine.Provisioning.ModifyCustSpecsVirtualMachine.Provisioning.PromoteDisksVirtualMachine.Provisioning.PutVmFilesVirtualMachine.Provisioning.ReadCustSpecsVirtualMachine.State.CreateSnapshotVirtualMachine.State.RemoveSnapshotVirtualMachine.State.RenameSnapshotVirtualMachine.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-файл, предоставляемый вендором ОС:
- Ubuntu
- Debian
- CentOS
- Rocky Linux (секция Generic Cloud / OpenStack)
Если вы планируете использовать дистрибутив отечественной ОС, обратитесь к вендору ОС для получения образа/OVA-файла.
Провайдер поддерживает работу только с одним диском в шаблоне виртуальной машины. Убедитесь, что шаблон содержит только один диск.
Подготовка образа виртуальной машины
DKP использует cloud-init для настройки виртуальной машины после запуска. Чтобы подготовить cloud-init и образ ВМ, выполните следующие действия:
-
Установите необходимые пакеты:
Если используется версия
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-init21.3 и выше:sudo apt-get update sudo apt-get install -y open-vm-tools cloud-init -
Проверьте, что в файле
/etc/cloud/cloud.cfgустановлен параметрdisable_vmware_customization: false. -
Убедитесь, что в файле
/etc/cloud/cloud.cfgуказан параметрdefault_user. Он необходим для добавления SSH-ключа при запуске ВМ. -
Добавьте datasource VMware GuestInfo — создайте файл
/etc/cloud/cloud.cfg.d/99-DataSourceVMwareGuestInfo.cfg:datasource: VMware: vmware_cust_file_max_wait: 10 -
Перед созданием шаблона ВМ сбросьте идентификаторы и состояние
cloud-init:truncate -s 0 /etc/machine-id rm /var/lib/dbus/machine-id ln -s /etc/machine-id /var/lib/dbus/machine-id -
Очистите логи событий
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).