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
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 uselifecycle { 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 beginningfrostmoln_orfrostmoln-(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'sdefault_tagson every write (a key set here wins). Holds only the keys this configuration sets; the full set is intags_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 ofvalidation,control_plane,api_endpoint,addons,node_poolorprovisioning. Set only whenstatusiserror, 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 whenstatusiserror.status_reason(String) Why the node pool failed, as a failure class (e.g.QuotaExceeded). Set only whenstatusiserror.tags_all(Map of String) Every tag the platform holds on this resource: the provider'sdefault_tags, this resource's owntags(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:
# 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