Далее описан процесс добавления узлов из vSphere в существующий статический кластер Deckhouse Kubernetes Platform (DKP).
Для интеграции с vSphere используется модуль cloud-provider-vsphere. Он обеспечивает взаимодействие DKP с vCenter, получение информации о виртуальных машинах, работу с параметрами размещения и интеграцию с инфраструктурными возможностями vSphere.
В разделе описаны два способа добавления узлов:
- Автоматическое создание узлов в vSphere. DKP создаёт виртуальные машины через API vSphere. Параметры ВМ задаются ресурсом VsphereInstanceClass, а требуемое количество узлов и зоны размещения — ресурсом NodeGroup с типом
CloudEphemeral. - Подключение вручную созданных узлов через bootstrap-скрипт. Виртуальная машина создаётся пользователем заранее и подключается к кластеру с помощью bootstrap-скрипта DKP. Для такого сценария используется NodeGroup с типом
CloudStatic.
Предварительные требования для vSphere
Перед началом убедитесь, что выполнены следующие условия:
- Кластер создан с параметром
clusterType: Static. - Между сетью статических узлов и сетью виртуальных машин во vSphere настроена сетевая связность. Узлы vSphere, добавляемые в кластер, имеют доступ к Kubernetes API, DNS и необходимым адресам согласно разделам «Сетевое взаимодействие» и «Настройка сетевых политик». При использовании Cilium с туннелированием трафика подов выбран режим
tunnelMode, соответствующий сетевой связности между площадками. - Выполнены требования из раздела «Подключение и авторизация в VMware vSphere»:
- настроен доступ к vCenter;
- подготовлена учётная запись vSphere с необходимыми привилегиями;
- подготовлен шаблон виртуальной машины;
- настроены сети, Datastore, теги регионов и зон.
Добавление автоматически создаваемых узлов
Для подключения уже работающего статического кластера к vCenter используйте ресурс ModuleConfig модуля cloud-provider-vsphere.
В параметре spec.settings укажите параметры доступа к vCenter, сетевые настройки, теги региона и зоны, а также SSH-ключи, которые будут добавлены на создаваемые виртуальные машины.
Пример конфигурации и описание доступных параметров приведены в примерах модуля и в разделе с описанием настроек модуля.
-
Создайте файл, например
vsphere-mc.yaml, с ModuleConfig для модуляcloud-provider-vsphere:apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: cloud-provider-vsphere spec: version: 2 enabled: true settings: host: "<VCENTER_FQDN>" username: "<USERNAME@DOMAIN.LOCAL>" password: "<PASSWORD>" insecure: true vmFolderPath: "<FOLDER_PATH_UNDER_DATACENTER>" regionTagCategory: "<TAG_CATEGORY_FOR_REGION>" zoneTagCategory: "<TAG_CATEGORY_FOR_ZONE>" region: "<REGION_TAG_NAME_ON_DATACENTER>" zones: - "<ZONE_TAG_NAME_ON_CLUSTER>" internalNetworkNames: - "<PORT_GROUP_NAME_FOR_INTERNAL_IP>" sshKeys: - "<SSH_PUBLIC_KEY_ONE_LINE>"Значения параметров:
host— адрес vCenter;username,password— учётные данные пользователя vSphere;insecure— отключение проверки TLS-сертификата vCenter;vmFolderPath— папка, в которой будут создаваться виртуальные машины;regionTagCategory,zoneTagCategory— категории тегов региона и зоны;region— тег региона;zones— список зон, в которых можно создавать узлы;internalNetworkNames— список сетей vSphere для подключения создаваемых узлов;sshKeys— публичные SSH-ключи, которые будут добавлены на создаваемые виртуальные машины.
-
Примените конфигурацию модуля:
d8 k apply -f vsphere-mc.yaml -
Дождитесь готовности модуля
cloud-provider-vsphere:d8 k get module cloud-provider-vsphere -o wide -
Создайте файл c ресурсами VsphereInstanceClass и NodeGroup со значением
nodeType: CloudEphemeral. Например,vsphere-instance.yaml:apiVersion: deckhouse.io/v1 kind: VsphereInstanceClass metadata: name: ephemeral spec: numCPUs: 2 memory: 4096 rootDiskSize: 40 template: "<PATH_TO_TEMPLATE_FROM_DATACENTER>" mainNetwork: "<PORT_GROUP_NAME>" datastore: "<DATASTORE_OR_FOLDER/DATASTORE>" --- apiVersion: deckhouse.io/v1 kind: NodeGroup metadata: name: ephemeral spec: nodeType: CloudEphemeral cloudInstances: classReference: kind: VsphereInstanceClass name: ephemeral maxPerZone: 1 minPerZone: 1 zones: - "<ZONE_TAG_NAME_ON_CLUSTER>" disruptions: approvalMode: AutomaticГде:
- VsphereInstanceClass описывает параметры виртуальной машины, которая будет создана во vSphere;
- NodeGroup описывает группу узлов, которую DKP должен поддерживать в кластере;
nodeType: CloudEphemeralозначает, что узлы будут создаваться автоматически через облачный провайдер;cloudInstances.classReferenceуказывает на VsphereInstanceClass;cloudInstances.zonesдолжен содержать зоны из спискаzonesв ModuleConfig.
-
Примените манифест:
d8 k apply -f vsphere-instance.yamlПосле применения манифеста DKP начнёт создавать виртуальную машину во vSphere. После загрузки ВМ kubelet подключится к Kubernetes API, и новый узел появится в кластере.
-
Проверьте состояние узлов:
d8 k get nodes -o wideПример ожидаемого результата:
NAME STATUS ROLES AGE VERSION static-master-0 Ready control-plane,master 1h v1.33.10 ephemeral-1ca02a5b-7588b-k89dc Ready ephemeral 10m v1.33.10 -
При сбоях создания ВМ проверьте объекты Machine, MachineSet и логи machine-controller-manager:
d8 k -n d8-cloud-instance-manager get machinesets,machines -o wide d8 k -n d8-cloud-instance-manager logs deploy/machine-controller-manager --tail=200Также проверьте события в кластере:
d8 k get events -A --sort-by=.lastTimestamp | tail -n 100
Добавление вручную созданных узлов через bootstrap-скрипт
Перед началом убедитесь, что выполнены следующие условия:
-
Модуль
cloud-provider-vsphereвключён:d8 k get module cloud-provider-vsphere -o wide -
Компоненты модуля
cloud-provider-vsphereнаходятся в состоянииRunning:d8 k -n d8-cloud-provider-vsphere get pods -o wide -
В кластере созданы StorageClass для vSphere:
d8 k get sc - В vSphere создана виртуальная машина, которая будет подключена к кластеру.
- Имя виртуальной машины в vSphere совпадает с именем хоста (hostname) внутри операционной системы.
-
В дополнительных параметрах ВМ в vSphere заданы параметры:
disk.EnableUUID = TRUE guestinfo.metadata = <BASE64_ENCODED_METADATA> guestinfo.metadata.encoding = base64Параметр
guestinfo.metadataдолжен содержать конфигурацию метаданных, закодированных в Base64. Пример файлаmetadata.json:{ "instance-id": "cloud-static-worker-0", "local-hostname": "cloud-static-worker-0", "public-keys-data": "<SSH_PUBLIC_KEY>", "network": { "version": 2, "ethernets": { "id0": { "match": { "driver": "vmxnet3" }, "set-name": "ens192", "dhcp4": true } } } }Где:
instance-id— идентификатор виртуальной машины;local-hostname— имя хоста (hostname) узла внутри операционной системы;public-keys-data— публичный SSH-ключ для доступа к виртуальной машине;network— сетевые настройки, которые будут применены внутри виртуальной машины.
Чтобы получить значение для параметра
guestinfo.metadata, выполните:METADATA_B64="$(base64 -w0 metadata.json)" echo "$METADATA_B64" - Виртуальная машина подключена к сети, указанной в параметре
internalNetworkNamesконфигурации модуляcloud-provider-vsphere. - На виртуальной машине установлен один из пакетных менеджеров (
apt/apt-get,yumилиrpm) для поддерживаемой ОС. В РЕД ОС по умолчанию могут отсутствоватьyumиwhich, поэтому их необходимо заранее установить.
-
Создайте файл с ресурсом NodeGroup и типом узлов
CloudStatic. Например,cloud-static-nodegroup.yaml:d8 k apply -f - <<EOF apiVersion: deckhouse.io/v1 kind: NodeGroup metadata: name: cloud-static spec: nodeType: CloudStatic -
Убедитесь, что NodeGroup создана и синхронизирована:
d8 k get nodegroup cloud-staticПример ожидаемого результата:
NAME TYPE READY NODES UPTODATE INSTANCES DESIRED MIN MAX STANDBY STATUS AGE SYNCED cloud-static CloudStatic 0 0 0 1m True -
Получите bootstrap-скрипт для созданной NodeGroup:
NODE_GROUP=cloud-static d8 k -n d8-cloud-instance-manager get secret manual-bootstrap-for-${NODE_GROUP} \ -o jsonpath='{.data.bootstrap\.sh}' > bootstrap.b64 -
Скопируйте bootstrap-скрипт на подключаемую виртуальную машину:
scp bootstrap.b64 <USER>@<NODE_IP>:/tmp/bootstrap.b64 -
Подключитесь к виртуальной машине по SSH:
ssh <USER>@<NODE_IP> -
На виртуальной машине назначьте права и запустите bootstrap-скрипт:
base64 -d /tmp/bootstrap.b64 > /tmp/bootstrap.sh chmod +x /tmp/bootstrap.sh sudo bash /tmp/bootstrap.shПосле запуска bootstrap-скрипт установит необходимые компоненты, настроит container runtime, kubelet и подключит узел к кластеру.
-
На master-узле проверьте появление нового узла:
d8 k get nodes -o wideПример ожидаемого результата:
NAME STATUS ROLES AGE VERSION INTERNAL-IP static-master-0 Ready master 1h v1.33.10 192.168.240.135 cloud-static-worker-0 Ready cloud-static 5m v1.33.10 192.168.240.152