Как развернуть или удалить кластер без GUI

Развёртывание и удаление клиентских кластеров выполняется через REST API платформы: запросы отправляются с токеном аутентификации в заголовке Authorization: Bearer $token. Переменная $BACKENDPOINT — адрес backend API платформы.

Авторизация

Перед управлением клиентскими кластерами авторизуйтесь в платформе и получите токен.

В примерах ниже:

  • $BACKENDPOINT — базовый адрес backend API платформы;
  • $token — токен авторизованного пользователя;
  • $CLUSTERNAME — имя создаваемого или удаляемого кластера;
  • $PROVIDERTEMPLATENAME — имя заранее созданной конфигурации провайдера.

Подготовить провайдер

Создать кластер без провайдера нельзя. Перед запросом на создание кластера в платформе должен быть создан экземпляр провайдера: именно его имя передаётся в теле запроса как identityName, providerName или name в зависимости от типа провайдера.

Получите список доступных провайдеров и их конфигураций:

curl -k -s -L --request GET $BACKENDPOINT/api/v1/platform/providers \
  --header "Authorization: Bearer $token" | jq -r

Пример фрагмента ответа:

[
  {
    "providerType": "capov",
    "configs": [
      {
        "name": "capov-name",
        "kubeVers": ["v1.34.1"],
        "allowEditCSI": false,
        "IPAddressPoolName": "",
        "IPAddressPoolAvailableCount": 0
      }
    ]
  },
  {
    "providerType": "capvs",
    "configs": [
      {
        "name": "capvs",
        "kubeVers": ["v1.34.1"],
        "allowEditCSI": false,
        "IPAddressPoolName": "name-pool",
        "IPAddressPoolAvailableCount": 1
      }
    ]
  }
]

Если подходящей конфигурации нет, создайте её через API провайдера.

VMware vSphere (capvs)

Команда создания провайдера VMware vSphere (capvs):

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/capvs \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "IPAddressPoolName": "name-pool",
  "allowEditCSI": false,
  "cloneMode": "linkedClone",
  "connectInfo": {
    "passwd": "mypassword",
    "url": "stendcloud.aaaaaaa.bb:443",
    "user": "myusername"
  },
  "datacenter": "/StendCloud",
  "datastore": "StendCloud_Name",
  "folder": "/StendCloud/vm/StendCloud/Name/",
  "identityName": "identityname",
  "network": "/StendCloud/network/data",
  "resourcePool": "/StendCloud/host/StendCloud/Resources/Name",
  "storagePolicyName": "",
  "template": [
    { "key": "РЕД ОС-7.3.2-shturval", "value": "v1.34.1" }
  ],
  "templateNetInterface": "enp1s0"
}
EOF
) | jq -r

Пример ответа:

{
  "identityName": "identityname",
  "provider": {
    "vCenterAddress": "stendcloud.aaaaaaa.aa:443",
    "user": "",
    "passwd": "",
    "thumbprint": "A1:F1:C8:9F:04:E8:13:7A:87:39:D0:EA:10:96:40:57:FE:D0:77:3E",
    "datacenter": "/StendCloud",
    "datastore": "StendCloud_Name",
    "storagePolicyName": "",
    "cloneMode": "",
    "folder": "/StendCloud/vm/StendCloud/Name/",
    "network": "/StendCloud/network/data",
    "template": [
      { "key": "РЕД ОС-7.3.2-shturval", "value": "v1.34.1" }
    ],
    "templateNetInterface": "enp1s0",
    "resourcePool": "/StendCloud/host/StendCloud/Resources/Name",
    "allowEditCSI": false,
    "IPAddressPoolName": "name-pool"
  },
  "ready": false
}

oVirt, zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization (capov)

Команда создания провайдера oVirt, zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization (capov):

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/capov \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "name": "identityname",
  "VNICProfile": "VNI",
  "allowEditCSI": false,
  "cluster": "RHVLab",
  "connection": {
    "passwd": "password",
    "tls": {
      "cert": true,
      "certs": "",
      "insecure": true
    },
    "url": "https://rhv-mg.aaaaa.bbb.cc/ovirt-engine/api",
    "user": "name"
  },
  "datacenter": "datacenter",
  "templates": [
    { "template": "AstraLinux", "kubeVersion": "v1.34.1" }
  ],
  "templateNetInterface": "eth0",
  "csistorageDomainName": "hosted_storage",
  "IPAddressPoolName": "",
  "providerSubtype": "rosavirt",
  "infraProviderName": ""
}
EOF
) | jq -r

Пример ответа:

{
  "name": "identityname",
  "cluster": "RHVLab",
  "VNICProfile": "VNI",
  "allowEditCSI": false,
  "VMType": "server",
  "templateNetInterface": "eth0",
  "connection": {
    "url": "https://rhv-mg.aaaaa.bbb.cc/ovirt-engine/api",
    "user": "name",
    "passwd": "password",
    "tls": {
      "cert": true,
      "insecure": true
    }
  },
  "templates": [
    { "template": "AstraLinux", "kubeVersion": "v1.34.1" }
  ],
  "datacenter": "datacenter",
  "csistorageDomainName": "hosted_storage",
  "IPAddressPoolName": "",
  "providerSubtype": "rosavirt",
  "infraProviderName": ""
}

Basis Dynamix (capbd)

Команда создания провайдера Basis Dynamix (capbd):

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/capbd \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "name": "name",
  "accountName": "Shturval",
  "rgName": "dev-2.6",
  "templateNetInterface": "eth0",
  "connection": {
    "decordUrl": "https://mr4.digitalenergy.online/",
    "ssoUrl": "https://sso.digitalenergy.online",
    "appId": "хххххх",
    "appSecret": "dddddd",
    "skipSSLVerification": true
  },
  "templates": [
    { "template": "pfSASE", "kubeVersion": "v1.34.1" }
  ],
  "extNetName": "NAME",
  "vinsName": "res_group_internal",
  "haLoadBalancer": true
}
EOF
) | jq -r

Пример ответа:

{
  "name": "name",
  "accountName": "Shturval",
  "rgName": "dev-2.6",
  "templateNetInterface": "eth0",
  "connection": {
    "decordUrl": "https://mr4.digitalenergy.online/",
    "ssoUrl": "https://sso.digitalenergy.online",
    "appId": "хххххх",
    "appSecret": "dddddd",
    "skipSSLVerification": true
  },
  "templates": [
    { "template": "pfSASE", "kubeVersion": "v1.34.1" }
  ],
  "extNetName": "NAME",
  "vinsName": "res_group_internal",
  "haLoadBalancer": true
}

OpenStack, Selectel, VK Cloud (capos)

Команда создания провайдера OpenStack (capos):

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/capos \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "name": "identityname",
  "cloudconfig": {
    "config": {
      "auth": {
        "auth_url": "https://ххххх:1111/v3/",
        "project_domain_id": "36d4ecf",
        "project_id": "c3cf4f8101",
        "username": "username@example.ru",
        "user_domain_name": "users",
        "password": "mypassword"
      },
      "auth_type": "password",
      "verify": false,
      "identity_api_version": "3",
      "interface": "public",
      "region_name": "RegionOne"
    }
  },
  "nodeCIDR": "10.0.0.0/24",
  "sshKeyName": "sshKeyName",
  "cloudName": "vkcloud",
  "templateNetInterface": "eth0",
  "externalNetworkID": "ec8c6",
  "flavors": ["STD2-16-32", "STD2-8-20"],
  "templates": [
    { "template": "ubuntu24", "kubeVersion": "v1.33.1" }
  ],
  "volumeTypes": ["high-iops"],
  "managedSecurityGroups": "true",
  "enableCSI": false,
  "disablePortSecurity": "false",
  "dns": [""],
  "allowEditCSI": false,
  "availabilityZones": ["GZ1", "PA2"],
  "providerSubtype": "vkcloud"
}
EOF
) | jq -r

Пример ответа:

{
  "name": "identityname",
  "allowEditCSI": false,
  "cloudName": "vkcloud",
  "templateNetInterface": "eth0",
  "cloudconfig": {
    "config": {
      "auth": {
        "auth_url": "https://ххххх:1111/v3/",
        "project_domain_id": "36d4ecf",
        "project_id": "c3cf4f8101",
        "username": "username@example.ru",
        "user_domain_name": "users",
        "password": "mypassword"
      },
      "auth_type": "password",
      "identity_api_version": "3",
      "verify": false
    }
  },
  "templates": [
    { "template": "ubuntu24", "kubeVersion": "v1.33.1" }
  ],
  "externalNetworkID": "ec8c6",
  "sshKeyName": "sshKeyName",
  "flavors": ["STD2-16-32", "STD2-8-20"],
  "volumeTypes": ["high-iops"],
  "nodeCIDR": "10.0.0.0/24",
  "nodeSubnetDNS": null,
  "managedSecurityGroups": "true",
  "disablePortSecurity": "false",
  "rootVolumeAvailabilityZone": "",
  "availabilityZones": ["GZ1", "PA2"],
  "providerSubtype": "vkcloud"
}

Shturval v2 (capsmv2)

Команда создания провайдера Shturval v2 (capsmv2):

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/capsmv2 \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "name": "identityname",
  "IPAddressPoolName": "",
  "credentials": {
    "SSH": {
      "privateKey": "privateKey",
      "userName": "username"
    }
  },
  "hosts": [
    {
      "address": "10.10.10.10",
      "labelsSelector": {
        "role": "controlplane"
      },
      "credentials": null
    }
  ]
}
EOF
) | jq -r

Пример ответа:

{
  "name": "identityname",
  "hosts": [
    {
      "address": "10.10.10.10",
      "labelsSelector": {
        "role": "controlplane"
      },
      "credentials": null
    }
  ],
  "credentials": {
    "SSH": {
      "userName": "username",
      "privateKey": "privateKey"
    }
  },
  "IPAddressPoolName": "",
  "infraProviderName": ""
}

Yandex Cloud (capyc)

Команда создания провайдера Yandex Cloud (capyc):

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/capyc \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "allowedPlatformIDs": ["standard"],
  "connectInfo": {
    "folderId": "b1gcffn",
    "key": "{\n  \"id\": \"aj2u\",\n  \"service_account_id\": \"e49pbe\",\n  \"created_at\": \"2024-12-13T13:28:15.261795772Z\",\n  \"key_algorithm\": \"RSA_2048\",\n  \"public_key\": \"-----BEGIN PUBLIC KEY-----\\nMIIUEyYcDkOn\\nqTrn6lh52A\\nfQIDB\\n-----END PUBLIC KEY-----\\n\",\n  \"private_key\": \"PLEASE DO NOT REMOVE THIS LINE! Yandex.Cloud SA Key ID <aje76qbj2u>\\n-----BEGIN PRIVATE KEY-----\\nM58VMZ0=\\n-----END PRIVATE KEY-----\\n\"\n}"
  },
  "folderID": "b1gcffn",
  "identityName": "provideryandexname",
  "loadBalancerInternal": false,
  "loadBalancerType": "ALB",
  "networkID": "en5tl",
  "subnetID": "be2",
  "templates": [
    { "template": "fd82", "kubeVersion": "v1.33.1" }
  ],
  "zoneID": "zone-c",
  "volumeTypes": ["network-ssd"],
  "allowEditCSI": false
}
EOF
) | jq -r

Пример ответа:

{
  "identityName": "provideryandexname",
  "connectInfo": {
    "key": ""
  },
  "templateNetInterface": "",
  "templates": [
    { "template": "fd82", "kubeVersion": "v1.33.1" }
  ],
  "folderID": "b1gcffn",
  "networkID": "en5tl",
  "subnetID": "be2",
  "zoneID": "zone-c",
  "volumeTypes": ["network-ssd"],
  "loadBalancerType": "ALB",
  "loadBalancerInternal": false,
  "allowedPlatformIDs": ["standard"],
  "allowEditCSI": false
}

VMware vCloud Director (capcd)

Команда создания провайдера VMware vCloud Director (capcd):

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/capcd \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "connectInfo": {
    "username": "username",
    "password": "mypassword",
    "refreshToken": "",
    "org": "Shturval-Client-Cluster",
    "connectType": "login",
    "site": "https://example.ru"
  },
  "name": "identityname",
  "catalog": "shturval",
  "templates": [
    { "template": "Ubuntu_sthurvalv2.11.0", "kubeVersion": "v1.33.1" }
  ],
  "sizingPolicies": ["TKG"],
  "ovdc": "Shturval-Client-Cluster-v1cl4-vdc",
  "vipSubnetName": "",
  "network": "Network",
  "providerType": "vCloud Director"
}
EOF
) | jq -r

Пример ответа:

{
  "name": "identityname",
  "connectInfo": {
    "site": "https://example.ru",
    "org": "Shturval-Client-Cluster",
    "username": "username",
    "password": "mypassword",
    "refreshToken": ""
  },
  "ovdc": "Shturval-Client-Cluster-v1cl4-vdc",
  "network": "Network",
  "vipSubnet": "",
  "catalog": "shturval",
  "templates": [
    { "template": "Ubuntu_sthurvalv2.11.0", "kubeVersion": "v1.33.1" }
  ],
  "placementPolicy": "",
  "sizingPolicies": ["TKG"],
  "allowEditCSI": false,
  "IPAddressPoolName": ""
}

Провайдер можно удалить командой:

export PROVIDERNAME="provider-name"

curl -k -L --request DELETE $BACKENDPOINT/api/v1/platform/providers/{provider}/$PROVIDERNAME \
  --header "Authorization: Bearer $token"

Получить список кластеров

curl -k -s -L --request GET $BACKENDPOINT/api/v1/clusters --header "Authorization: Bearer $token" | jq -r

Пример фрагмента ответа:

{
  "items": [
    {
      "id": "shturval-new-cluster",
      "clusterName": "shturval-new-cluster",
      "clusterType": "platform",
      "annotations": [
        { "key": "shturval.tech/clustername", "value": "shturval-new-cluster" }
      ],
      "providerType": "capov",
      "providerConfigID": "capov-test",
      "apiEndpoint": "10.20.10.20:5555",
      "networks": [
        { "type": "Service CIDR", "network": "10.96.0.0/12", "netmask": "" },
        { "type": "Pod CIDR", "network": "172.16.0.0/16", "netmask": "" }
      ],
      "ingress": "*.shturval-new-cluster.ip-10-20-10-21.shturval.link",
      "argoCdIngress": "",
      "secure": false,
      "phase": "Provisioned",
      "conditions": [
        { "type": "Ready", "status": "True", "lastTransitionTime": "2024-05-27T07:44:37Z" },
        { "type": "ControlPlaneInitialized", "status": "True", "lastTransitionTime": "2024-05-27T07:44:37Z" },
        { "type": "ControlPlaneReady", "status": "True", "lastTransitionTime": "2024-05-27T07:44:37Z" },
        { "type": "InfrastructureReady", "status": "True", "lastTransitionTime": "2024-05-27T07:41:26Z" }
      ],
      "controlplaneNodesCount": 1,
      "controlplaneHealthyNodesCount": 3,
      "workersGroups": [
        { "groupName": "shturval-new-cluster-default", "workersScale": null, "workersCount": 3 },
        { "groupName": "shturval-new-cluster-infra", "workersScale": null, "workersCount": 0 }
      ],
      "UpdateReady": true
    }
  ],
  "count": 1
}

Создание кластера

Перед созданием кластера убедитесь, что для выбранного типа инфраструктуры уже создан провайдер. Запрос создания кластера ссылается на существующую конфигурацию провайдера; без неё создать кластер нельзя.

Метод и путь: POST $BACKENDPOINT/api/v1/platform/providers/clusters/{provider}

{provider}Провайдер
capvsVMware vSphere
capovoVirt, zVirt, HostVM, РЕД Виртуализация и ROSA Virtualization
capsmv2Shturval v2
caposOpenStack, Selectel, VK Cloud
capbdBasis Dynamix
capycYandex Cloud
capcdVMware vCloud Director

Тело запроса — JSON с секциями cluster и provider. Имя шаблона провайдера задаётся в поле identityName (vSphere, vCloud Director), providerName (oVirt, zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization, OpenStack, Selectel, VK Cloud, Basis Dynamix, Yandex Cloud) или name (Shturval v2).

Поля секции cluster

ПолеНазначение
clusterNameИмя кластера
apiEndpointIP API-сервера Kubernetes (для capvs, capov, capsmv2, capbd; для capos, capyc, capcd может быть пустым при внешнем балансировщике)
controlPlaneNodesCountЧисло узлов Control Plane
ingressvipVIP для Ingress при externalingresslb: false
ingressWildcard FQDN Ingress при externalingresslb: true (например, cluster.shturval.link)
podSubnet, serviceSubnetПодсети подов и сервисов (пример: 172.16.0.0/16, 10.96.0.0/12)
shturvalVersionВерсия платформы на кластере (например, 2.14.0)
enabledServicesСписок включаемых сервисов (чарты)
disabledServicesСписок отключаемых сервисов или ["all"] — только критически важные
ingressControllerTypeКонтроллер внешнего HTTP-трафика. nginx — модуль управления внешними подключениями (shturval-ingress-controller). gateway — Gateway API на Cilium. По умолчанию nginx. Если поле в запросе не заполнено, платформа записывает nginx. При gateway модуль shturval-ingress-controller устанавливается в режиме absent
externalKubeAPILB, externalingresslbВнешний балансировщик для API и Ingress
securefalse — самоподписной сертификат Ingress
acmeRootCert, ACMEURLПараметры ACME-сертификата (oVirt, zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization, Shturval v2)
cacert, cakeyПромежуточный сертификат (OpenStack, Selectel, VK Cloud, Yandex Cloud — в варианте с критическими сервисами)
mgmtClusterfalse для клиентского кластера
deletePersistentVolumesДля oVirt, vSphere, OpenStack, Selectel, VK Cloud, vCloud Director, Yandex Cloud. true — удалить PV перед удалением кластера, false — не удалять. Если поле не передано, берётся политика профиля кластера. Подробнее: Зачистка PV при удалении кластера

Управление сервисами

  • Явный набор сервисов: disabledServices: [] и перечень в enabledServices.
  • Только критические сервисы: для любого провайдера укажите disabledServices: ["all"] и не передавайте enabledServices; остальные секции cluster и provider заполните по примеру выбранного провайдера.

При успешном создании ответ может содержать пересчитанные списки enabledServices и disabledServices, а также поле CreatedByUser / createdByUser. Списки сервисов платформа также приводит в соответствие с ingressControllerType: при gateway модуль shturval-ingress-controller устанавливается в режиме absent.

Поля секции provider

  • controlplaneNodeConfig / controlPlaneNodeConfig — конфигурация Control Plane (nodeConfig с groupName и roles);
  • workerNodeConfigs — группы default и infra с workersCount и ролями node-role.kubernetes.io/workers, node-role.kubernetes.io/infra;
  • enableCSI — для VMware vSphere, oVirt, zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization, OpenStack, Selectel, VK Cloud, vCloud Director, Yandex Cloud (в примерах false). Поле доступно, если в экземпляре провайдера allowEditCSI — true.

Конфигурация узлов зависит от провайдера: capvsNodeConfig, capovNodeConfig, caposNodeConfig, capbdNodeConfig, capycNodeConfig, capcdNodeConfig; для Shturval v2 — селекторы controlPlaneSelector и workerSelector с метками role.

VMware vSphere (capvs)

Переменные и запрос с полным набором сервисов и самоподписным сертификатом (secure: false):

export CLUSTERNAME="capvs-new-cluster"
export PROVIDERTEMPLATENAME="capvs-template-name"

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/clusters/capvs \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "cluster": {
    "apiEndpoint": "10.20.30.40",
    "clusterName": "$CLUSTERNAME",
    "controlPlaneNodesCount": 1,
    "disabledServices": [],
    "enabledServices": ["shturval-cert-manager-crds","shturval-vip-provider","shturval-update-crds","shturval-monitoring-crds","shturval-local-csi","shturval-policy-manager-crds","shturval-vip","shturval-node-config-crds","shturval-services","shturval-services-crds","shturval-caching-dns","shturval-cert-manager","shturval-update","shturval-networking","shturval-node-config"],
    "externalKubeAPILB": false,
    "externalingresslb": false,
    "ingress": "",
    "ingressvip": "10.20.30.42",
    "podSubnet": "172.16.0.0/16",
    "secure": false,
    "serviceSubnet": "10.96.0.0/12",
    "shturvalVersion": "2.14.0",
    "mgmtCluster": false
  },
  "provider": {
    "controlplaneNodeConfig": {
      "capvsNodeConfig": { "diskGiB": 60, "memoryMiB": 1200, "numCPUs": 4 },
      "nodeConfig": {
        "groupName": "control-plane",
        "roles": [{ "name": "node-role.kubernetes.io/control-plane" }]
      }
    },
    "enableCSI": false,
    "identityName": "$PROVIDERTEMPLATENAME",
    "workerNodeConfigs": [
      {
        "capvsNodeConfig": { "diskGiB": 60, "memoryMiB": 1200, "numCPUs": 4 },
        "nodeConfig": {
          "groupName": "default",
          "roles": [{ "name": "node-role.kubernetes.io/workers" }]
        },
        "workersCount": 3
      },
      {
        "capvsNodeConfig": { "diskGiB": 60, "memoryMiB": 1200, "numCPUs": 4 },
        "nodeConfig": {
          "groupName": "infra",
          "roles": [{ "name": "node-role.kubernetes.io/infra" }]
        },
        "workersCount": 3
      }
    ]
  }
EOF
) | jq -r

Для варианта только с критическими сервисами используйте общее правило из раздела Управление сервисами; для группы infra можно задать "workersCount": 0.

oVirt, zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization (capov)

ACME-сертификат задаётся полями acmeRootCert и ACMEURL в секции cluster. Шаблон провайдера — providerName. Конфигурация узлов — capovNodeConfig (cpu, memory.sizeMB, osDiskSizeGB).

export CLUSTERNAME="capov-new-cluster"
export PROVIDERTEMPLATENAME="capov-template-name"

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/clusters/capov \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "cluster": {
    "apiEndpoint": "10.20.30.40",
    "clusterName": "$CLUSTERNAME",
    "controlPlaneNodesCount": 1,
    "disabledServices": [],
    "enabledServices": ["shturval-cert-manager-crds","shturval-vip-provider","shturval-update-crds","shturval-monitoring-crds","shturval-local-csi","shturval-policy-manager-crds","shturval-vip","shturval-node-config-crds","shturval-services","shturval-services-crds","shturval-caching-dns","shturval-cert-manager","shturval-update","shturval-networking","shturval-node-config"],
    "externalKubeAPILB": false,
    "externalingresslb": false,
    "ingress": "",
    "ingressvip": "10.20.30.42",
    "podSubnet": "172.16.0.0/16",
    "secure": false,
    "serviceSubnet": "10.96.0.0/12",
    "shturvalVersion": "2.14.0",
    "acmeRootCert": "acmeRootCert",
    "ACMEURL": "https://issuer.ip-xx-xx-xx-xx.shturval.link:9443/acme/acme/directory",
    "mgmtCluster": false
  },
  "provider": {
    "controlplaneNodeConfig": {
      "capovNodeConfig": {
        "cpu": { "cores": 4, "sockets": 1, "threads": 1 },
        "memory": { "sizeMB": 1200 },
        "osDiskSizeGB": 60
      },
      "nodeConfig": {
        "groupName": "control-plane",
        "roles": [{ "name": "node-role.kubernetes.io/control-plane" }]
      }
    },
    "enableCSI": false,
    "providerName": "$PROVIDERTEMPLATENAME",
    "workerNodeConfigs": [
      {
        "capovNodeConfig": {
          "cpu": { "cores": 4, "sockets": 1, "threads": 1 },
          "memory": { "sizeMB": 1200 },
          "osDiskSizeGB": 60
        },
        "nodeConfig": {
          "groupName": "default",
          "roles": [{ "name": "node-role.kubernetes.io/workers" }]
        },
        "workersCount": 3
      },
      {
        "capovNodeConfig": {
          "cpu": { "cores": 4, "sockets": 1, "threads": 1 },
          "memory": { "sizeMB": 1200 },
          "osDiskSizeGB": 60
        },
        "nodeConfig": {
          "groupName": "infra",
          "roles": [{ "name": "node-role.kubernetes.io/infra" }]
        },
        "workersCount": 3
      }
    ]
  }
EOF
) | jq -r

Shturval v2 (capsmv2)

Запрос без флага -k у curl. Шаблон — поле name. Узлы выбираются селекторами matchLabels.role: controlplane, workers, infra.

export CLUSTERNAME="capsmv2-new-cluster"
export PROVIDERTEMPLATENAME="capsmv2-template-name"

curl -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/clusters/capsmv2 \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "cluster": {
    "apiEndpoint": "10.20.30.40",
    "clusterName": "$CLUSTERNAME",
    "disabledServices": [],
    "enabledServices": ["shturval-local-csi","shturval-services","shturval-update","shturval-vip","shturval-monitoring-crds","shturval-caching-dns","shturval-node-config","shturval-services-crds","shturval-cert-manager-crds","shturval-cert-manager","shturval-node-config-crds","shturval-policy-manager-crds","shturval-networking","shturval-vip-provider","shturval-update-crds"],
    "externalKubeAPILB": false,
    "externalingresslb": false,
    "ingress": "",
    "controlPlaneNodesCount": 1,
    "ingressvip": "10.20.30.42",
    "podSubnet": "172.16.0.0/16",
    "secure": false,
    "serviceSubnet": "10.96.0.0/12",
    "shturvalVersion": "2.14.0",
    "acmeRootCert": "acmeRootCert",
    "ACMEURL": "https://issuer.ip-xx-xx-xx-xx.shturval.link:9443/acme/acme/directory",
    "mgmtCluster": false
  },
  "provider": {
    "controlPlaneNodeConfig": {
      "controlPlaneSelector": {
        "matchExpressions": [],
        "matchLabels": { "role": "controlplane" }
      },
      "nodeConfig": {
        "groupName": "control-plane",
        "roles": [{ "name": "node-role.kubernetes.io/control-plane" }]
      }
    },
    "name": "$PROVIDERTEMPLATENAME",
    "workerNodeConfigs": [
      {
        "nodeConfig": {
          "groupName": "default",
          "roles": [{ "name": "node-role.kubernetes.io/workers" }]
        },
        "workersCount": 3,
        "workerSelector": {
          "matchExpressions": [],
          "matchLabels": { "role": "workers" }
        }
      },
      {
        "nodeConfig": {
          "groupName": "infra",
          "roles": [{ "name": "node-role.kubernetes.io/infra" }]
        },
        "workersCount": 0,
        "workerSelector": {
          "matchExpressions": [],
          "matchLabels": { "role": "infra" }
        }
    ]
  }
EOF
) | jq -r

OpenStack, Selectel, VK Cloud (capos)

externalKubeAPILB и externalingresslb — true, ingressvip — пустая строка. Промежуточный сертификат: cacert, cakey. Узлы — caposNodeConfig (openstackFlavorName, volumeType, volumeSize, availabilityZone). Для worker-групп flavor задаётся переменной $OPENSTACKFLAVORNAME.

export CLUSTERNAME="capos-new-cluster"
export PROVIDERTEMPLATENAME="capos-template-name"

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/clusters/capos \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "cluster": {
    "clusterName": "$CLUSTERNAME",
    "disabledServices": [],
    "enabledServices": ["shturval-monitoring-crds","shturval-vip","shturval-services-crds","shturval-caching-dns","shturval-cert-manager","shturval-update-crds","shturval-services","shturval-update","shturval-networking","shturval-node-config-crds","shturval-node-config","shturval-cert-manager-crds","shturval-vip-provider","shturval-local-csi","shturval-policy-manager-crds"],
    "externalKubeAPILB": true,
    "externalingresslb": true,
    "ingress": "",
    "controlPlaneNodesCount": 1,
    "ingressvip": "",
    "podSubnet": "172.16.0.0/16",
    "secure": false,
    "serviceSubnet": "10.96.0.0/12",
    "shturvalVersion": "2.14.0",
    "cacert": "cacert",
    "cakey": "cakey",
    "mgmtCluster": false
  },
  "provider": {
    "controlplaneNodeConfig": {
      "caposNodeConfig": {
        "openstackFlavorName": "STD3-4-8",
        "volumeType": "ceph-hdd",
        "volumeSize": 60,
        "availabilityZone": "ME1"
      },
      "nodeConfig": {
        "groupName": "control-plane",
        "roles": [{ "name": "node-role.kubernetes.io/control-plane" }]
      }
    },
    "providerName": "$PROVIDERTEMPLATENAME",
    "enableCSI": false,
    "workerNodeConfigs": [
      {
        "nodeConfig": {
          "groupName": "default",
          "roles": [{ "name": "node-role.kubernetes.io/workers" }]
        },
        "workersCount": 3,
        "caposNodeConfig": {
          "openstackFlavorName": "$OPENSTACKFLAVORNAME",
          "volumeSize": 60,
          "volumeType": "ceph-hdd",
          "availabilityZone": "ME1"
        }
      },
      {
        "nodeConfig": {
          "groupName": "infra",
          "roles": [{ "name": "node-role.kubernetes.io/infra" }]
        },
        "workersCount": 0,
        "caposNodeConfig": {
          "openstackFlavorName": "$OPENSTACKFLAVORNAME",
          "volumeSize": 60,
          "volumeType": "ceph-hdd",
          "availabilityZone": "ME1"
        }
    ]
  }
EOF
) | jq -r

Basis Dynamix (capbd)

Для Control Plane в capbdNodeConfig.networkInterfaces указываются netType и networkName (переменные $NETTYPE, $NETWORKNAME). externalingresslb: true, ingressvip отличается от VMware vSphere (пример: 10.20.30.41).

export CLUSTERNAME="capbd-new-cluster"
export PROVIDERTEMPLATENAME="capbd-template-name"
export NETTYPE="net-type"
export NETWORKNAME="networkname"

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/clusters/capbd \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "cluster": {
    "apiEndpoint": "10.20.30.40",
    "clusterName": "$CLUSTERNAME",
    "disabledServices": [],
    "enabledServices": ["shturval-node-config-crds","shturval-backup","shturval-services-crds","shturval-services","shturval-rollouts-crds","shturval-descheduler","shturval-vip-provider","shturval-ingress-controller","shturval-policy-manager-crds","shturval-networking","shturval-metrics-collector","shturval-monitoring-crds","shturval-scanner","shturval-caching-dns","shturval-vip","shturval-node-config","shturval-cert-expiration","shturval-update-crds","shturval-backup-crds","shturval-cd-crds","shturval-cert-manager-crds","shturval-cert-manager","shturval-local-csi","shturval-update","shturval-scanner-crds","shturval-policy-manager"],
    "externalKubeAPILB": false,
    "externalingresslb": true,
    "ingress": "",
    "controlPlaneNodesCount": 1,
    "ingressvip": "10.20.30.41",
    "podSubnet": "172.16.0.0/16",
    "secure": false,
    "serviceSubnet": "10.96.0.0/12",
    "shturvalVersion": "2.14.0",
    "mgmtCluster": false
  },
  "provider": {
    "controlplaneNodeConfig": {
      "capbdNodeConfig": {
        "cpu": 4,
        "memory": 12000,
        "networkInterfaces": [{ "netType": "$NETTYPE", "networkName": "$NETWORKNAME" }],
        "osDiskSizeGB": 60
      },
      "nodeConfig": {
        "groupName": "control-plane",
        "roles": [{ "name": "node-role.kubernetes.io/control-plane" }]
      }
    },
    "providerName": "$PROVIDERTEMPLATENAME",
    "workerNodeConfigs": [
      {
        "nodeConfig": {
          "groupName": "default",
          "roles": [{ "name": "node-role.kubernetes.io/workers" }]
        },
        "workersCount": 3,
        "capbdNodeConfig": { "cpu": 4, "memory": 12000, "osDiskSizeGB": 60 }
      },
      {
        "nodeConfig": {
          "groupName": "infra",
          "roles": [{ "name": "node-role.kubernetes.io/infra" }]
        },
        "workersCount": 3,
        "capbdNodeConfig": { "cpu": 4, "memory": 12000, "osDiskSizeGB": 60 }
      }
    ]
  }
EOF
) | jq -r

Ответ при создании может вернуть краткое описание кластера с phase: "Pending" и сгенерированным ingress вида *.capbd-new-cluster.ip-10-20-30-41.shturval.link.

Yandex Cloud (capyc)

externalKubeAPILB и externalingresslb — true, ingress — FQDN (например, cluster.shturval.link), ingressvip — пустая строка. Узлы — capycNodeConfig (cpuCores, memorySize, platformID, volumeType, volumeSize). enableCSI включает shturval-capy-csi; при allowEditCSI: false в экземпляре значение true отклоняется. deletePersistentVolumes — удаление PV при удалении кластера; если поле не передано, берётся политика профиля.

export CLUSTERNAME="capyc-new-cluster"
export PROVIDERTEMPLATENAME="capyc-template-name"

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/clusters/capyc \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "cluster": {
    "clusterName": "$CLUSTERNAME",
    "disabledServices": [],
    "enabledServices": ["shturval-cert-manager-crds","shturval-vip-provider","shturval-update-crds","shturval-monitoring-crds","shturval-local-csi","shturval-policy-manager-crds","shturval-vip","shturval-node-config-crds","shturval-services","shturval-services-crds","shturval-caching-dns","shturval-cert-manager","shturval-update","shturval-networking","shturval-node-config"],
    "externalKubeAPILB": true,
    "externalingresslb": true,
    "ingress": "cluster.shturval.link",
    "controlPlaneNodesCount": 1,
    "ingressvip": "",
    "podSubnet": "172.16.0.0/16",
    "secure": false,
    "serviceSubnet": "10.96.0.0/12",
    "shturvalVersion": "2.14.0",
    "deletePersistentVolumes": false,
    "mgmtCluster": false
  },
  "provider": {
    "controlplaneNodeConfig": {
      "capycNodeConfig": {
        "cpuCores": 4,
        "memorySize": "800Mi",
        "platformID": "standard",
        "volumeType": "network-ssd",
        "volumeSize": "40Gi"
      },
      "nodeConfig": {
        "groupName": "control-plane",
        "roles": [{ "name": "node-role.kubernetes.io/control-plane" }]
      }
    },
    "providerName": "$PROVIDERTEMPLATENAME",
    "enableCSI": false,
    "workerNodeConfigs": [
      {
        "nodeConfig": {
          "groupName": "default",
          "roles": [{ "name": "node-role.kubernetes.io/workers" }]
        },
        "workersCount": 1,
        "capycNodeConfig": {
          "platformID": "standard",
          "volumeType": "network-ssd",
          "volumeSize": "40Gi",
          "memorySize": "800Mi",
          "cpuCores": 4
        }
      },
      {
        "nodeConfig": {
          "groupName": "infra",
          "roles": [{ "name": "node-role.kubernetes.io/infra" }]
        },
        "workersCount": 0,
        "capycNodeConfig": {
          "platformID": "standard",
          "volumeType": "network-ssd",
          "volumeSize": "40Gi",
          "memorySize": "800Mi",
          "cpuCores": 4
        }
    ]
  }
EOF
) | jq -r

VMware vCloud Director (capcd)

Путь API — capcd. Шаблон — identityName. Узлы — capcdNodeConfig (diskSize, sizingPolicy). Дополнительные поля провайдера: kubeAPIVIPSubnet, serviceVIPSubnet.

export CLUSTERNAME="capvcd-new-cluster"
export PROVIDERTEMPLATENAME="capvcd-template-name"

curl -k -s -L --request POST $BACKENDPOINT/api/v1/platform/providers/clusters/capcd \
  --header "Authorization: Bearer $token" \
  --data @<(cat <<EOF
{
  "cluster": {
    "apiEndpoint": "",
    "clusterName": "$CLUSTERNAME",
    "disabledServices": [],
    "enabledServices": ["shturval-cert-manager-crds","shturval-vip-provider","shturval-update-crds","shturval-monitoring-crds","shturval-local-csi","shturval-policy-manager-crds","shturval-vip","shturval-node-config-crds","shturval-services","shturval-services-crds","shturval-caching-dns","shturval-cert-manager","shturval-update","shturval-networking","shturval-node-config"],
    "externalKubeAPILB": true,
    "externalingresslb": true,
    "ingress": "cluster.shturval.link",
    "controlPlaneNodesCount": 1,
    "ingressvip": "",
    "podSubnet": "172.16.0.0/16",
    "secure": false,
    "serviceSubnet": "10.96.0.0/12",
    "shturvalVersion": "2.14.0",
    "clusterConfigProfileName": "",
    "mgmtCluster": false
  },
  "provider": {
    "enableCSI": false,
    "identityName": "$PROVIDERTEMPLATENAME",
    "kubeAPIVIPSubnet": "",
    "serviceVIPSubnet": "",
    "controlplaneNodeConfig": {
      "capcdNodeConfig": { "diskSize": "50Gi", "sizingPolicy": "TKG" },
      "nodeConfig": {
        "groupName": "control-plane",
        "roles": [{ "name": "node-role.kubernetes.io/control-plane" }]
      }
    },
    "workerNodeConfigs": [
      {
        "nodeConfig": {
          "groupName": "default",
          "roles": [{ "name": "node-role.kubernetes.io/workers" }]
        },
        "workersCount": 2,
        "capcdNodeConfig": { "diskSize": "50Gi", "sizingPolicy": "TKG" }
      },
      {
        "nodeConfig": {
          "groupName": "infra",
          "roles": [{ "name": "node-role.kubernetes.io/infra" }]
        },
        "workersCount": 0,
        "capcdNodeConfig": { "diskSize": "50Gi", "sizingPolicy": "TKG" }
      }
    ]
  }
EOF
) | jq -r

Удаление кластера

export CLUSTERNAME="clustername"

curl -k -L --request DELETE $BACKENDPOINT/api/v1/clusters/$CLUSTERNAME --header "Authorization: Bearer $token"