Доступно только в Enterprise Edition.

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

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

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

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

Настройка govc

Для настройки утилиты задайте следующие переменные окружения:

export GOVC_URL=example.com
export GOVC_USERNAME=<USER_NAME>
export GOVC_PASSWORD=<USER_PASSWORD>
export GOVC_INSECURE=1

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

В vSphere нет понятия регион и зона, поэтому для разграничения зон доступности используются теги.

Регионом в vSphere является Datacenter, а зонойComputeCluster.

Например, если необходимо сделать 2 региона, и в каждом регионе будет 2 зоны доступности, выполните следующие команды:

govc tags.category.create -d "Kubernetes region" k8s-region
govc tags.category.create -d "Kubernetes zone" k8s-zone
govc tags.create -d "Kubernetes Region X1" -c k8s-region k8s-region-x1
govc tags.create -d "Kubernetes Region X2" -c k8s-region k8s-region-x2
govc tags.create -d "Kubernetes Zone X1-A" -c k8s-zone k8s-zone-x1-a
govc tags.create -d "Kubernetes Zone X1-B" -c k8s-zone k8s-zone-x1-b
govc tags.create -d "Kubernetes Zone X2-A" -c k8s-zone k8s-zone-x2-a
govc tags.create -d "Kubernetes Zone X2-B" -c k8s-zone k8s-zone-x2-b

Созданные категории тегов необходимо указать в VsphereClusterConfiguration в .spec.provider.

Теги регионов навешиваются на Datacenter. Пример:

govc tags.attach -c k8s-region k8s-region-x1 /X1

Теги зон навешиваются на Cluster и Datastores. Пример:

govc tags.attach -c k8s-zone k8s-zone-x1-a /X1/host/x1_cluster_prod
govc tags.attach -c k8s-zone k8s-zone-x1-a /X1/datastore/x1_lun_1

Datastore теги

При наличии Datastore’ов на всех ESXi, где будут размещаться виртуальные машины узлов кластера, возможно использовать динамический заказ PV. Для автоматического создания StorageClass’ов в Kubernetes кластере, повесьте тег региона и зоны, созданные ранее, на выбранные Datastore’ы.

Права

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

Необходимо создать роль (Role) с указанными правами и прикрепить её к одному или нескольким Datacenter’ам, где нужно развернуть кластер Kubernetes.

govc role.create kubernetes Datastore.AllocateSpace Datastore.Browse Datastore.FileManagement 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.ColdMigrate Resource.HotMigrate Resource.CreatePool Resource.DeletePool \
  Resource.RenamePool Resource.EditPool Resource.MovePool StorageProfile.View System.Anonymous System.Read System.View \
  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.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.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 \
  Cns.Searchable StorageProfile.View

govc permissions.set  -principal имя_пользователя -role kubernetes /datacenter

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

Сети

Для работы кластера необходим 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-диски для VM (может быть тот же Datastore, что и для PersistentVolume).

Сборка образа виртуальных машин

Чтобы собрать образ виртуальной машины, выполните следующие шаги:

  1. Установите Packer.
  2. Склонируйте репозиторий Deckhouse:

    git clone https://github.com/deckhouse/deckhouse/
    
  3. Перейдите в директорию ee/modules/030-cloud-provider-vsphere/packer/ склонированного репозитория:

    cd deckhouse/ee/modules/030-cloud-provider-vsphere/packer/
    
  4. Создайте файл vsphere.auto.pkrvars.hcl со следующим содержимым:

    vcenter_server = "<hostname или IP vCenter>"
    vcenter_username = "<имя пользователя>"
    vcenter_password = "<пароль>"
    vcenter_cluster = "<имя ComputeCluster, где будет создан образ>"
    vcenter_datacenter = "<имя Datacenter>"
    vcenter_resource_pool = "имя ResourcePool"
    vcenter_datastore = "<имя Datastore, в котором будет создан образ>"
    vcenter_folder = "<имя директории>"
    vm_network = "<имя сети, к которой подключится виртуальная машина при сборке образа>"
    
  5. Если ваш компьютер (с которого запущен Packer) не находится в одной сети с vm_network, а вы подключены через VPN-туннель, то замените {{ .HTTPIP }} в файле <UbuntuVersion>.pkrvars.hcl на IP-адрес вашего компьютера из VPN-сети в следующей строке:

     " url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg",
    
  6. Выберите версию Ubuntu и соберите образ:

    # Ubuntu 20.04
    packer build --var-file=20.04.pkrvars.hcl .
    # Ubuntu 18.04
    packer build --var-file=18.04.pkrvars.hcl .