Deckhouse Kubernetes Platform (DKP) имеет возможность использовать ресурсы облачных провайдеров для расширения ресурсов статических кластеров. В данный момент поддерживается интеграция с облаками на базе OpenStack и vSphere.
Гибридный кластер представляет собой объединенные в один кластер bare-metal-узлы и узлы провайдера. Для создания такого кластера необходимо наличие L2-сети между всеми узлами кластера.
В Deckhouse Kubernetes Platform есть возможность задавать префикс для имени CloudEphemeral-узлов, добавляемых в гибридный кластер c master-узлами типа Static.
Для этого используйте параметр instancePrefix модуля node-manager. Префикс, указанный в параметре, будет добавляться к имени всех добавляемых в кластер узлов типа CloudEphemeral. Задать префикс для определенной NodeGroup нельзя.
Гибридный кластер с vSphere
Выполните следующие шаги:
-
Удалите
flannelизkube-system:d8 k -n kube-system delete ds flannel-ds -
Настройте интеграцию и пропишите необходимые для работы параметры.
Cloud-controller-manager синхронизирует состояние между vSphere и Kubernetes, удаляя из Kubernetes те узлы, которых нет в vSphere. В гибридном кластере такое поведение не всегда соответствует потребности, поэтому, если узел Kubernetes запущен не с параметром --cloud-provider=external, он автоматически игнорируется (DKP прописывает static:// на узлы в .spec.providerID, а cloud-controller-manager такие узлы игнорирует).
Гибридный кластер с OpenStack
Выполните следующие шаги:
-
Удалите
flannelизkube-system:d8 k -n kube-system delete ds flannel-ds - Настройте интеграцию и пропишите необходимые для работы параметры.
- Создайте один или несколько кастомных ресурсов OpenStackInstanceClass.
- Создайте один или несколько кастомных ресурсов NodeGroup для управления количеством и процессом заказа машин в облаке.
Cloud-controller-manager синхронизирует состояние между OpenStack и Kubernetes, удаляя из Kubernetes те узлы, которых нет в OpenStack. В гибридном кластере такое поведение не всегда соответствует потребности, поэтому, если узел Kubernetes запущен не с параметром --cloud-provider=external, он автоматически игнорируется (DKP прописывает static:// на узлы в .spec.providerID, а cloud-controller-manager такие узлы игнорирует).
Подключение storage
Если вам требуются PersistentVolumes на узлах, подключаемых к кластеру из OpenStack, необходимо создать StorageClass с нужным OpenStack volume type. Получить список типов можно с помощью следующей команды:
openstack volume type list
Например, для volume type ceph-ssd:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-ssd
provisioner: csi-cinderplugin # Обязательно должно быть так.
parameters:
type: ceph-ssd
volumeBindingMode: WaitForFirstConsumer
Гибридный кластер с Yandex Cloud
Для создания гибридного кластера, объединяющего статические узлы и узлы в Yandex Cloud, выполните описанные далее шаги.
Предварительные требования
- Рабочий кластер с параметром
clusterType: Static. - Контроллер CNI переведён в режим VXLAN. Подробнее — настройка
tunnelMode. - Настроенная сетевая связность между Yandex Cloud и сетью узлов статического кластера согласно необходимым сетевым политикам для работы DKP.
Шаги по настройке
-
Создайте Service Account в нужном каталоге Yandex Cloud:
- Назначьте роль
editor. - Предоставьте доступ к используемой VPC с ролью
vpc.admin.
- Назначьте роль
-
Создайте секрет
d8-provider-cluster-configurationс нужными данными. Пример содержимогоcloud-provider-cluster-configuration.yaml:apiVersion: deckhouse.io/v1 kind: YandexClusterConfiguration layout: WithoutNAT masterNodeGroup: replicas: 1 instanceClass: cores: 4 memory: 8192 imageID: fd80bm0rh4rkepi5ksdi diskSizeGB: 100 platform: standard-v3 externalIPAddresses: - "Auto" nodeNetworkCIDR: 10.160.0.0/16 existingNetworkID: empty provider: cloudID: CLOUD_ID folderID: FOLDER_ID serviceAccountJSON: '{"id":"ajevk1dp8f9...--END PRIVATE KEY-----\n"}' sshPublicKey: <ssh-rsa SSHKEY>Значения параметров:
nodeNetworkCIDR— CIDR сети, который включает адреса всех используемых подсетей узлов в Yandex Cloud;cloudID— ID вашего облака;folderID— ID каталога;serviceAccountJSON— service account в каталоге, выгруженный в формате JSON;-
sshPublicKey— публичный ключ, который будет добавлен на разворачиваемые машины.Значения в
masterNodeGroupне имеют значения, так как master-узлы не разворачиваются.
-
Заполните значения для файла
data.cloud-provider-discovery-data.jsonв этом же секрете. Пример:{ "apiVersion": "deckhouse.io/v1", "defaultLbTargetGroupNetworkId": "empty", "internalNetworkIDs": [ "<NETWORK-ID>" ], "kind": "YandexCloudDiscoveryData", "monitoringAPIKey": "", "region": "ru-central1", "routeTableID": "empty", "shouldAssignPublicIPAddress": false, "zoneToSubnetIdMap": { "ru-central1-a": "<A-SUBNET-ID>", "ru-central1-b": "<B-SUBNET-ID>", "ru-central1-d": "<D-SUBNET-ID>" }, "zones": [ "ru-central1-a", "ru-central1-b", "ru-central1-d" ] }Значения параметров:
internalNetworkIDs— список ID сетей в Yandex Cloud, через которые обеспечивается внутренняя связность между узлами.zoneToSubnetIdMap— отображение зон на соответствующие подсети внутри указанных сетей (по одной подсети на зону).shouldAssignPublicIPAddress: true— указывает, требуется ли назначать публичные IP-адреса для создаваемых узлов. Для зон, в которых подсети отсутствуют, допустимо использовать значениеempty.
-
Закодируйте полученные выше файлы YandexClusterConfiguration и YandexCloudDiscoveryData в формат Base64. Затем вставьте закодированные строки в поля
cloud-provider-cluster-configuration.yamlиcloud-provider-discovery-data.jsonсекрета, как показано в примере ниже:apiVersion: v1 data: cloud-provider-cluster-configuration.yaml: <YANDEXCLUSTERCONFIGURATION_BASE64_ENCODED> cloud-provider-discovery-data.json: <YANDEXCLOUDDISCOVERYDATA-BASE64-ENCODED> kind: Secret metadata: labels: heritage: deckhouse name: d8-provider-cluster-configuration name: d8-provider-cluster-configuration namespace: kube-system type: Opaque --- apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: cloud-provider-yandex spec: version: 1 enabled: true settings: storageClass: default: network-ssd -
Удалите объект
ValidatingAdmissionPolicyBinding, чтобы избежать конфликтов:d8 k delete validatingadmissionpolicybindings.admissionregistration.k8s.io heritage-label-objects.deckhouse.io -
Примените два созданных на предыдущем шаге манифеста в кластере.
-
После применения дождитесь активации модуля
cloud-provider-yandexи появления CRD yandexinstanceclasses:d8 k get mc cloud-provider-yandex d8 k get crd yandexinstanceclasses -
Внесите необходимые значения в приведённые ниже манифесты и примените их в кластере. Пример:
--- apiVersion: deckhouse.io/v1alpha1 kind: NodeGroup metadata: name: worker spec: nodeType: Cloud cloudInstances: classReference: kind: YandexInstanceClass name: worker minPerZone: 1 maxPerZone: 3 zones: - ru-central1-d --- apiVersion: deckhouse.io/v1alpha1 kind: YandexInstanceClass metadata: name: worker spec: cores: 4 memory: 8192 diskSizeGB: 50 diskType: network-ssd mainSubnet: <YOUR-SUBNET-ID>Параметр
mainSubnetдолжен содержать ID подсети из Yandex Cloud, которая используется для связи с вашей инфраструктурой (L2-связность с группами статических узлов).После применения манифестов начнётся заказ виртуальных машин в Yandex Cloud, управляемых модулем
node-manager. -
Для диагностики состояния и поиска возможных проблем проверьте логи
machine-controller-manager:d8 k -n d8-cloud-provider-yandex get machine d8 k -n d8-cloud-provider-yandex get machineset d8 k -n d8-cloud-instance-manager logs deploy/machine-controller-manager
Гибридный кластер с VCD
Далее описан процесс создания гибридного кластера, объединяющего статические (bare-metal) узлы и облачные узлы в VMware vCloud Director (VCD) с использованием Deckhouse Kubernetes Platform (DKP).
Перед началом убедитесь, что выполнены следующие условия:
- Инфраструктура:
- Установлен bare-metal кластер DKP.
- Настроен тенант в VCD с выделенными ресурсами.
- Настроена сетевая связанность между сетью узлов статического кластера и VCD (на уровне L2, либо на уровне L3 с доступами по портам согласно необходимым сетевым политикам для работы DKP).
- Настроена рабочая сеть в VCD с включённым DHCP-сервером.
- Создан пользователь со статичным паролем и правами администратора VCD.
- Настройки ПО:
- Контроллер CNI переведён в режим VXLAN. Подробнее — настройка
tunnelMode. - Подготовлен список необходимых ресурсов VCD (VDC, VAPP, шаблоны, политики и т.д.).
- Контроллер CNI переведён в режим VXLAN. Подробнее — настройка
Настройка
-
Создайте файл конфигурации
cloud-provider-vcd-token.ymlсо следующим содержимым:apiVersion: deckhouse.io/v1 kind: VCDClusterConfiguration layout: Standard mainNetwork: <NETWORK_NAME> internalNetworkCIDR: <NETWORK_CIDR> organization: <ORGANIZATION> virtualApplicationName: <VAPP_NAME> virtualDataCenter: <VDC_NAME> provider: server: <API_URL> apiToken: <PASSWORD> username: <USER_NAME> insecure: false masterNodeGroup: instanceClass: etcdDiskSizeGb: 10 mainNetworkIPAddresses: - 192.168.199.2 rootDiskSizeGb: 50 sizingPolicy: <SIZING_POLICY> storageProfile: <STORAGE_PROFILE> template: <VAPP_TEMPLATE> replicas: 1 sshPublicKey: <SSH_PUBLIC_KEY>Где:
mainNetwork— имя сети, в которой будут размещаться облачные ноды в вашем VCD кластере.internalNetworkCIDR— CIDR-адресация указанной сети.organization— название вашей VCD организации.virtualApplicationName— имя vApp, где будут создаваться узлы (например,dkp-vcd-app).virtualDataCenter— имя виртуального датацентра.template— шаблон ВМ для создания узлов.sizingPolicyиstorageProfile— соответствующие политики в VCD.provider.server— URL-адрес API вашего VCD.provider.apiToken— токен доступа (пароль) пользователя с правами администратора в VCD.provider.username— имя статического пользователя, от имени которого будет происходить взаимодействие с VCD.mainNetworkIPAddresses— список IP-адресов из указанной сети, которые будут выделены для master-узлов.storageProfile— имя storage-профиля, определяющего хранилище для дисков создаваемых ВМ.
-
Закодируйте файл
cloud-provider-vcd-token.ymlв Base64:base64 -i $PWD/cloud-provider-vcd-token.yml -
Создайте секрет со следующим содержимым:
apiVersion: v1 data: cloud-provider-cluster-configuration.yaml: <BASE64_СТРОКА_ПОЛУЧЕННАЯ_НА_ПРЕДЫДУЩЕМ_ЭТАПЕ> cloud-provider-discovery-data.json: eyJhcGlWZXJzaW9uIjoiZGVja2hvdXNlLmlvL3YxIiwia2luZCI6IlZDRENsb3VkUHJvdmlkZXJEaXNjb3ZlcnlEYXRhIiwiem9uZXMiOlsiZGVmYXVsdCJdfQo= kind: Secret metadata: labels: heritage: deckhouse name: d8-provider-cluster-configuration name: d8-provider-cluster-configuration namespace: kube-system type: Opaque -
Включите модуль
cloud-provider-vcd:d8 system module enable cloud-provider-vcd -
Отредактируйте секрет
d8-cni-configuration, чтобы значение параметраmodeопределялось изmc cni-cilium(измените.data.ciliumна.data.neciliumпри необходимости). -
Убедитесь, что все поды в пространстве имён
d8-cloud-provider-vcdнаходятся в состоянииRunning:d8 k get pods -n d8-cloud-provider-vcd -
Перезагрузите master-узел и дождитесь завершения инициализации.
-
Создайте классы инстансов в VCD:
apiVersion: deckhouse.io/v1 kind: VCDInstanceClass metadata: name: worker spec: rootDiskSizeGb: 50 sizingPolicy: <SIZING_POLICY> storageProfile: <STORAGE_PROFILE> template: <VAPP_TEMPLATE> -
Создайте ресурс NodeGroup:
apiVersion: deckhouse.io/v1 kind: NodeGroup metadata: name: worker spec: cloudInstances: classReference: kind: VCDInstanceClass name: worker maxPerZone: 2 minPerZone: 1 nodeTemplate: labels: node-role/worker: "" nodeType: CloudEphemeral -
Убедитесь, что в кластере появилось требуемое количество узлов:
d8 k get nodes -o wide