Как развернуть или удалить кластер без 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"]
}
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"]
}

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"] — только критически важные
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 для клиентского кластера

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

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

При успешном создании ответ может содержать пересчитанные списки enabledServices и disabledServices, а также поле CreatedByUser / createdByUser.

Поля секции 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 (в примерах false).

Конфигурация узлов зависит от провайдера: 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).

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",
    "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",
    "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"