Как развернуть или удалить кластер без 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} Провайдер
capvs VMware vSphere
capov oVirt, zVirt, HostVM, РЕД Виртуализация и ROSA Virtualization
capsmv2 Shturval v2
capos OpenStack, Selectel, VK Cloud
capbd Basis Dynamix
capyc Yandex Cloud
capcd VMware 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 Имя кластера
apiEndpoint IP API-сервера Kubernetes (для capvs, capov, capsmv2, capbd; для capos, capyc, capcd может быть пустым при внешнем балансировщике)
controlPlaneNodesCount Число узлов Control Plane
ingressvip VIP для Ingress при externalingresslb: false
ingress Wildcard 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
secure false — самоподписной сертификат Ingress
acmeRootCert, ACMEURL Параметры ACME-сертификата (oVirt, zVirt, HostVM, РЕД Виртуализация, ROSA Virtualization, Shturval v2)
cacert, cakey Промежуточный сертификат (OpenStack, Selectel, VK Cloud, Yandex Cloud — в варианте с критическими сервисами)
mgmtCluster false для клиентского кластера

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

  • Явный набор сервисов: 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 и externalingresslbtrue, 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 и externalingresslbtrue, 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"