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