Skip to content

Create a node pool

POST
/api/v1/organizations/{orgID}/clusters/{clusterID}/nodepools
curl --request POST \
--url https://api.aetherplatform.cloud/api/v1/organizations/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/clusters/2489E9AD-2EE2-8E00-8EC9-32D5F69181C0/nodepools \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "name": "example", "vcpus": 1, "memory_gb": 1, "disk_gb": 1, "min_nodes": 1, "max_nodes": 1, "desired_nodes": 1, "min_vcpus": 1, "max_vcpus": 1, "min_memory_gb": 1, "max_memory_gb": 1, "node_labels": { "additionalProperty": "example" }, "node_taints": [ { "key": "example", "value": "example", "effect": "NoSchedule" } ], "drain_timeout_seconds": 1, "scale_down_delay_seconds": 1, "scale_down_utilization_percent": 1 }'

Creates a node pool. Autoscaling is permitted; when min_nodes, desired_nodes, and max_nodes are equal the pool is fixed-size. Omitted bounds default to desired_nodes (which defaults to 1). Returns 202 while the pool provisions.

orgID
required
string format: uuid

Organization UUID.

clusterID
required
string format: uuid

Cluster UUID.

Media typeapplication/json
object
name
required
string
vcpus
required
integer
>= 1 <= 128
memory_gb
required
integer
>= 1 <= 512
disk_gb
required
integer
>= 1 <= 2048
min_nodes
integer | null
max_nodes
integer | null
desired_nodes
integer | null
min_vcpus

Optional per-pool CPU autoscaling budget (total pool vCPUs); max > min ⇒ autoscaling. A non-zero minimum must cover at least one node; set BOTH min_vcpus and min_memory_gb to 0 (with the maxima set) to let the pool scale to zero nodes.

integer | null
max_vcpus

Optional per-pool CPU autoscaling budget (total pool vCPUs); max > min ⇒ autoscaling.

integer | null
>= 1
min_memory_gb

Optional per-pool memory autoscaling budget (total pool GB); max > min ⇒ autoscaling. A non-zero minimum must cover at least one node; set BOTH min_vcpus and min_memory_gb to 0 (with the maxima set) to let the pool scale to zero nodes.

integer | null
max_memory_gb

Optional per-pool memory autoscaling budget (total pool GB); max > min ⇒ autoscaling.

integer | null
>= 1
node_labels

Labels applied to the pool’s nodes at bootstrap. Reserved key prefixes (aether.cloud/, kubernetes.io/, k8s.io/, node-role.kubernetes.io/, node.kubernetes.io/) are rejected.

object
key
additional properties
string
node_taints

Taints applied to the pool’s nodes at bootstrap (create-only; immutable thereafter). Reserved key prefixes (aether.cloud/, kubernetes.io/, k8s.io/, node-role.kubernetes.io/, node.kubernetes.io/) are rejected, and a cluster must retain at least one pool with no NoSchedule/NoExecute taint.

Array<object>
object
key
required
string
value
string
effect
required
string
Allowed values: NoSchedule PreferNoSchedule NoExecute
drain_timeout_seconds

How long to drain a node in this pool before deleting it anyway. Omit it (or send null) to use the platform default of 600s — the pool then tracks that default rather than being pinned to today’s value. 0 is rejected: it means “wait forever” to the underlying machinery, and one pod that refuses to evict would hang the pool’s teardown indefinitely.

integer | null
>= 30 <= 3600
scale_down_delay_seconds

How long a node in this pool must stay underutilised before the autoscaler removes it. Omit it (or send null) to use the platform default of 600s — the pool then tracks that default rather than being pinned to today’s value. This acts on the scale-down DECISION, while drain_timeout_seconds bounds the removal once it is decided. Accepted on any pool, but only autoscaling pools have an autoscaler node group, so on a fixed pool it is inert.

integer | null
>= 60 <= 3600
scale_down_utilization_percent

A node counts as underutilised when its CPU and memory requests are both below this share of allocatable capacity. Omit it (or send null) to use the platform default of 50.

integer | null
>= 10 <= 90

Node pool accepted for provisioning.

Media typeapplication/json
object
id
required
string format: uuid
cluster_id
required
string format: uuid
name
required
string
vcpus
required
integer
memory_gb
required
integer
disk_gb
required
integer
min_nodes
required
integer
max_nodes
required
integer
desired_nodes
required
integer
min_vcpus

Optional per-pool CPU autoscaling budget (total pool vCPUs); max > min ⇒ autoscaling. A non-zero minimum must cover at least one node; set BOTH min_vcpus and min_memory_gb to 0 (with the maxima set) to let the pool scale to zero nodes.

integer
max_vcpus

Optional per-pool CPU autoscaling budget (total pool vCPUs); max > min ⇒ autoscaling.

integer
min_memory_gb

Optional per-pool memory autoscaling budget (total pool GB); max > min ⇒ autoscaling. A non-zero minimum must cover at least one node; set BOTH min_vcpus and min_memory_gb to 0 (with the maxima set) to let the pool scale to zero nodes.

integer
max_memory_gb

Optional per-pool memory autoscaling budget (total pool GB); max > min ⇒ autoscaling.

integer
node_labels

Labels applied to the pool’s nodes at bootstrap.

object
key
additional properties
string
node_taints

Taints applied to the pool’s nodes at bootstrap (set at create; immutable).

Array<object>
object
key
required
string
value
string
effect
required
string
Allowed values: NoSchedule PreferNoSchedule NoExecute
drain_timeout_seconds

How long the platform drains a node in this pool before deleting it anyway. Omitted when the pool has none configured, which means the platform default of 600s applies (and keeps applying if that default changes).

integer
>= 30 <= 3600
scale_down_delay_seconds

How long a node in this pool must stay underutilised before the autoscaler removes it. Omitted when the pool has none configured, which means the platform default of 600s applies (and keeps applying if that default changes). Acts on the scale-down DECISION; drain_timeout_seconds bounds the removal once it is decided. Only autoscaling pools have an autoscaler node group, so on a fixed pool the value is stored and reported but has no effect.

integer
>= 60 <= 3600
scale_down_utilization_percent

A node counts as underutilised when its CPU and memory requests are both below this share of allocatable capacity. Omitted when the pool has none configured, which means the platform default of 50 applies.

integer
>= 10 <= 90
current_nodes
required
integer
first_ready_at
string | null format: date-time
status
required
string
Allowed values: provisioning ready scaling deleting failed
status_message
string | null
created_at
required
string format: date-time
updated_at
required
string format: date-time
Example
{
"node_taints": [
{
"effect": "NoSchedule"
}
],
"status": "provisioning"
}

Invalid request. Includes no_schedulable_pool when the new pool’s taints would leave the cluster with no pool that can schedule workloads (a cluster must retain at least one pool with no NoSchedule/NoExecute taint).

Media typeapplication/json
object
error
required
object
code
required

A stable, machine-readable error code.

string
message
required
string
details
Array<object>
object
field
required
string
code
required
string
message
required
string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}
}

Missing or invalid credentials.

Media typeapplication/json
object
error
required
object
code
required

A stable, machine-readable error code.

string
message
required
string
details
Array<object>
object
field
required
string
code
required
string
message
required
string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}
}

The requested resource was not found.

Media typeapplication/json
object
error
required
object
code
required

A stable, machine-readable error code.

string
message
required
string
details
Array<object>
object
field
required
string
code
required
string
message
required
string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}
}

The resource already exists or conflicts with current state.

Media typeapplication/json
object
error
required
object
code
required

A stable, machine-readable error code.

string
message
required
string
details
Array<object>
object
field
required
string
code
required
string
message
required
string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}
}

Request validation failed.

Media typeapplication/json
object
error
required
object
code
required

A stable, machine-readable error code.

string
message
required
string
details
Array<object>
object
field
required
string
code
required
string
message
required
string
Examplegenerated
{
"error": {
"code": "example",
"message": "example",
"details": [
{
"field": "example",
"code": "example",
"message": "example"
}
]
}
}