Skip to content

frostmoln_kubernetes_node_pool (Resource) ​

Manages an additional node pool on a managed Kubernetes cluster. The cluster's INITIAL node pool is owned by the frostmoln_kubernetes_cluster resource (its initial_node_pool block) and cannot be managed here. A cluster must keep at least one node pool — deleting the last one is refused by the API.

Authoritative scope — who owns what on this resource, declared in internal/scopedecl and machine-checked against the schema.

Enacted and reconciled — every configurable attribute not listed below: the platform applies it, and a refresh reads the truth back.

Create-immutable — cluster_id: the pool belongs to its cluster; moving it is a different pool.

Create-immutable — flavor_id: the platform does not re-flavor a pool in place.

Create-immutable — name: the pool's name is its identity within the cluster.

Example Usage ​

terraform
data "frostmoln_kubernetes_flavors" "available" {}

# An additional node pool on an existing managed Kubernetes cluster. The
# cluster's initial pool is owned by the frostmoln_kubernetes_cluster resource
# (its initial_node_pool block) — this resource manages extra pools only.
resource "frostmoln_kubernetes_node_pool" "workers" {
  cluster_id = frostmoln_kubernetes_cluster.main.id
  name       = "workers" # optional — a "pool-<8 hex>" name is generated when omitted
  flavor_id  = data.frostmoln_kubernetes_flavors.available.flavors[0].id
  node_count = 2 # scaled in-place; name/flavor changes replace the pool

  # Resource tags, not Kubernetes node labels: they never reach a node. A pool
  # does not inherit the cluster's tags.
  tags = {
    env = "prod"
  }
}

Schema ​

Required ​

  • cluster_id (String) The ID of the Kubernetes cluster this pool belongs to.
  • flavor_id (String) The node flavor ID (see the frostmoln_kubernetes_flavors data source). Pools cannot change flavor — changing it REPLACES the pool.

Optional ​

  • name (String) The name of the node pool: a lowercase DNS label (a-z, 0-9, non-leading/trailing hyphens) of at most 18 characters — it becomes part of each node's hostname. Defaults to a generated "pool-<8 hex>" name. Pools cannot be renamed — changing it REPLACES the pool. Pool names are unique per cluster, so an explicitly named pool cannot use lifecycle { create_before_destroy = true } — the replacement create conflicts with the still-live pool.
  • node_count (Number) The number of worker nodes in the pool (1-100). Scaled in-place. Omitting it manages the pool at 1 node — an out-of-band scale will be reverted on the next apply.
  • tags (Map of String) Resource tags on the node pool: your own key/value metadata for search and filtering, stored by the platform only. They are NOT Kubernetes node labels and never reach a node. At most 32 keys including the tenant's default tags, which the platform merges in at create; a key is 1-64 bytes matching ^[a-zA-Z0-9]([a-zA-Z0-9._:/-]*[a-zA-Z0-9])?$, a value at most 256 bytes; keys beginning frostmoln_ or frostmoln- (any case) are reserved. Changing them updates the pool in place and touches no node. A pool added here does not inherit the cluster's tags. (The cluster's INITIAL pool, which this resource cannot manage, got a one-time copy of the cluster's tags at create; see frostmoln_kubernetes_cluster.) Merged with the provider's default_tags on every write (a key set here wins). Holds only the keys this configuration sets; the full set is in tags_all.
  • timeouts (Block, Optional) (see below for nested schema)

Read-Only ​

  • created_at (String) The timestamp when the node pool was created.
  • failed_step (String) The provisioning phase the node pool failed in: one of validation, control_plane, api_endpoint, addons, node_pool or provisioning. Set only when status is error, and may be absent even then.
  • id (String) The unique identifier of the node pool.
  • status (String) The current status of the node pool.
  • status_message (String) A human-readable description of why the node pool failed. Set only when status is error.
  • status_reason (String) Why the node pool failed, as a failure class (e.g. QuotaExceeded). Set only when status is error.
  • tags_all (Map of String) Every tag the platform holds on this resource: the provider's default_tags, this resource's own tags (which win on a shared key), and any key set outside Terraform — in the portal, by the fm CLI, or stamped by the platform. Keys set outside Terraform appear only here and are kept on every apply, never removed.
  • updated_at (String) The timestamp when the node pool was last updated.

Nested Schema for timeouts ​

Optional:

  • create (String) How long the provider waits for the create operation to converge before giving up (e.g. "45m", "2h").
  • delete (String) How long the provider waits for the delete to complete before giving up (e.g. "30m").
  • update (String) How long the provider waits for an update (resize, in-place change) to converge before giving up (e.g. "30m").

Import ​

Import is supported using the following syntax:

The terraform import command can be used, for example:

shell
# Import with the composite ID {cluster_id}/{pool_id}. The cluster's INITIAL
# pool cannot be imported here — it is owned by frostmoln_kubernetes_cluster.
terraform import frostmoln_kubernetes_node_pool.workers 51455a51-db3d-4231-ac27-4fee2553c15f/9f6b1a7e-9a30-4a6a-8f2e-1f1c9be2b6d1