Skip to content

Commit 1159d45

Browse files
committed
feat: add autoscaler worker machine config for 0-worker clusters
When no worker nodes are defined, generates a worker machine config template using the same cluster secrets and Hetzner-specific patches. This enables cluster-autoscaler to create workers that correctly join the cluster without requiring a seed worker in terraform. The autoscaler_worker data source only activates when worker_count == 0. When workers exist, use the existing worker machine config output.
1 parent 405cb17 commit 1159d45

3 files changed

Lines changed: 96 additions & 0 deletions

File tree

outputs.tf

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,9 @@ output "talos_worker_ids" {
4848
description = "Server IDs of the hetzner talos workers machines"
4949
value = { for id, server in hcloud_server.workers : id => server.id }
5050
}
51+
52+
output "autoscaler_worker_machine_config" {
53+
description = "Worker machine configuration for autoscaler use (generated when no workers are defined)"
54+
value = length(data.talos_machine_configuration.autoscaler_worker) > 0 ? data.talos_machine_configuration.autoscaler_worker[0].machine_configuration : ""
55+
sensitive = true
56+
}

talos.tf

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,19 @@ locals {
162162
client_key = base64decode(talos_cluster_kubeconfig.this[0].kubernetes_client_configuration.client_key)
163163
}
164164
}
165+
166+
# Generate a worker machine config template for autoscaler use.
167+
# This produces a valid worker config even when no worker nodes are defined,
168+
# using the same machine secrets and cluster configuration as real workers.
169+
data "talos_machine_configuration" "autoscaler_worker" {
170+
count = local.worker_count == 0 ? 1 : 0
171+
talos_version = var.talos_version
172+
cluster_name = var.cluster_name
173+
cluster_endpoint = local.cluster_endpoint_url_internal
174+
kubernetes_version = var.kubernetes_version
175+
machine_type = "worker"
176+
machine_secrets = talos_machine_secrets.this.machine_secrets
177+
config_patches = concat([yamlencode(local.autoscaler_worker_yaml)], var.talos_worker_extra_config_patches)
178+
docs = false
179+
examples = false
180+
}

talos_patch_worker.tf

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,77 @@ locals {
8888
}
8989
}
9090
}
91+
92+
# Worker YAML template for autoscaler (used when no real workers exist).
93+
# Same config patches as real workers but without node-specific values.
94+
autoscaler_worker_yaml = {
95+
machine = {
96+
install = {
97+
image = "ghcr.io/siderolabs/installer:${var.talos_version}"
98+
}
99+
certSANs = local.cert_SANs
100+
kubelet = {
101+
extraArgs = merge(
102+
{
103+
"cloud-provider" = "external"
104+
"rotate-server-certificates" = true
105+
},
106+
var.kubelet_extra_args
107+
)
108+
nodeIP = {
109+
validSubnets = [
110+
local.node_ipv4_cidr
111+
]
112+
}
113+
}
114+
network = {
115+
extraHostEntries = local.extra_host_entries
116+
kubespan = {
117+
enabled = var.enable_kube_span
118+
advertiseKubernetesNetworks : false
119+
mtu : 1370
120+
}
121+
}
122+
kernel = {
123+
modules = var.kernel_modules_to_load
124+
}
125+
sysctls = merge(
126+
{
127+
"net.core.somaxconn" = "65535"
128+
"net.core.netdev_max_backlog" = "4096"
129+
},
130+
var.sysctls_extra_args
131+
)
132+
features = {
133+
hostDNS = {
134+
enabled = true
135+
forwardKubeDNSToHost = true
136+
resolveMemberNames = true
137+
}
138+
}
139+
time = {
140+
servers = [
141+
"ntp1.hetzner.de",
142+
"ntp2.hetzner.com",
143+
"ntp3.hetzner.net",
144+
"time.cloudflare.com"
145+
]
146+
}
147+
nodeLabels = {}
148+
registries = var.registries
149+
}
150+
cluster = {
151+
network = {
152+
dnsDomain = var.cluster_domain
153+
podSubnets = [
154+
local.pod_ipv4_cidr
155+
]
156+
serviceSubnets = [
157+
local.service_ipv4_cidr
158+
]
159+
cni = {
160+
name = "none"
161+
}
162+
}
163+
}
164+
}

0 commit comments

Comments
 (0)