138 lines
5.6 KiB
Terraform
138 lines
5.6 KiB
Terraform
# Generate Talos machine configurations
|
|
|
|
locals {
|
|
pod_cidr = var.cluster_config.pod_subnets[0]
|
|
service_cidr = var.cluster_config.service_subnets[0]
|
|
controlplane_ip = var.cluster_config.controlplane_ip
|
|
cluster_dns_ip = "10.96.0.10"
|
|
kubelet_image = "ghcr.io/siderolabs/kubelet:${var.kubernetes_version}"
|
|
kube_apiserver_img = "registry.k8s.io/kube-apiserver:${var.kubernetes_version}"
|
|
controller_mgr_img = "registry.k8s.io/kube-controller-manager:${var.kubernetes_version}"
|
|
kube_proxy_img = "registry.k8s.io/kube-proxy:${var.kubernetes_version}"
|
|
scheduler_img = "registry.k8s.io/kube-scheduler:${var.kubernetes_version}"
|
|
|
|
# Use Image Factory generated URL with Longhorn extensions (iscsi-tools, util-linux-tools)
|
|
factory_image = data.talos_image_factory_urls.longhorn_installer.urls.installer
|
|
}
|
|
|
|
# Control plane machine configurations
|
|
resource "local_file" "controlplane_configs" {
|
|
for_each = var.controlplane_configs
|
|
|
|
filename = "${path.module}/../cluster-config/${each.key}.yaml"
|
|
|
|
content = templatefile("${path.module}/templates/controlplane.tftpl", {
|
|
version = "v1alpha1"
|
|
hostname = each.value.hostname
|
|
token = var.machine_token
|
|
ca_crt = var.machine_ca_crt
|
|
ca_key = var.machine_ca_key
|
|
lan_ip = each.value.lan_ip
|
|
lan_subnet = each.value.lan_subnet
|
|
lan_gateway = each.value.lan_gateway
|
|
kubelet_image = local.kubelet_image
|
|
cluster_dns_ip = local.cluster_dns_ip
|
|
install_disk = each.value.install_disk
|
|
factory_image = local.factory_image
|
|
talos_version = var.talos_version
|
|
longhorn_disks = each.value.longhorn_disks
|
|
dns_servers = var.cluster_config.dns_servers
|
|
forgejo_registry_ip = var.forgejo_registry_ip
|
|
forgejo_hostname = var.forgejo_hostname
|
|
zone = each.value.zone
|
|
allow_scheduling = each.value.allow_scheduling
|
|
|
|
# Cloudflare Tunnel cert SANs (talos :50000 and kube-apiserver :6443)
|
|
cloudflare_talos_sans = each.value.cloudflare_talos_sans
|
|
cloudflare_apiserver_sans = each.value.cloudflare_apiserver_sans
|
|
|
|
# Cluster config
|
|
cluster_id = var.cluster_id
|
|
cluster_secret = var.cluster_secret
|
|
controlplane_ip = local.controlplane_ip
|
|
cluster_name = var.cluster_name
|
|
pod_subnets = var.cluster_config.pod_subnets
|
|
service_subnets = var.cluster_config.service_subnets
|
|
dns_domain = var.cluster_config.dns_domain
|
|
bootstrap_token = var.bootstrap_token
|
|
|
|
# Kubernetes certs
|
|
kubernetes_ca_crt = var.kubernetes_ca_crt
|
|
kubernetes_ca_key = var.kubernetes_ca_key
|
|
etcd_ca_crt = var.etcd_ca_crt
|
|
etcd_ca_key = var.etcd_ca_key
|
|
aggregator_ca_crt = var.aggregator_ca_crt
|
|
aggregator_ca_key = var.aggregator_ca_key
|
|
service_account_key = var.service_account_key
|
|
secretbox_encryption_secret = var.secretbox_encryption_secret
|
|
|
|
# Component images
|
|
kube_apiserver_img = local.kube_apiserver_img
|
|
controller_mgr_img = local.controller_mgr_img
|
|
kube_proxy_img = local.kube_proxy_img
|
|
scheduler_img = local.scheduler_img
|
|
})
|
|
}
|
|
|
|
# Worker machine configurations
|
|
resource "local_file" "worker_configs" {
|
|
for_each = var.worker_configs
|
|
|
|
filename = "${path.module}/../cluster-config/worker-${each.key}.yaml"
|
|
|
|
content = templatefile("${path.module}/templates/worker.tftpl", {
|
|
version = "v1alpha1"
|
|
hostname = each.value.hostname
|
|
token = var.machine_token
|
|
ca_crt = var.machine_ca_crt
|
|
ca_key = var.machine_ca_key
|
|
lan_ip = each.value.lan_ip
|
|
lan_subnet = each.value.lan_subnet
|
|
lan_gateway = each.value.lan_gateway
|
|
kubelet_image = local.kubelet_image
|
|
cluster_dns_ip = local.cluster_dns_ip
|
|
install_disk = each.value.install_disk
|
|
factory_image = each.value.factory_image != null ? each.value.factory_image : (each.value.gpu_count > 0 ? data.talos_image_factory_urls.gpu_installer.urls.installer : local.factory_image)
|
|
talos_version = var.talos_version
|
|
dns_servers = var.cluster_config.dns_servers
|
|
forgejo_registry_ip = var.forgejo_registry_ip
|
|
forgejo_hostname = var.forgejo_hostname
|
|
zone = each.value.zone
|
|
gpu_count = each.value.gpu_count
|
|
extra_disks = each.value.extra_disks
|
|
|
|
# Cluster config
|
|
cluster_id = var.cluster_id
|
|
cluster_secret = var.cluster_secret
|
|
controlplane_ip = local.controlplane_ip
|
|
cluster_name = var.cluster_name
|
|
pod_subnets = var.cluster_config.pod_subnets
|
|
service_subnets = var.cluster_config.service_subnets
|
|
dns_domain = var.cluster_config.dns_domain
|
|
bootstrap_token = var.bootstrap_token
|
|
|
|
# Kubernetes certs
|
|
kubernetes_ca_crt = var.kubernetes_ca_crt
|
|
kubernetes_ca_key = var.kubernetes_ca_key
|
|
aggregator_ca_crt = var.aggregator_ca_crt
|
|
aggregator_ca_key = var.aggregator_ca_key
|
|
service_account_key = var.service_account_key
|
|
secretbox_encryption_secret = var.secretbox_encryption_secret
|
|
})
|
|
}
|
|
|
|
# Output paths for reference
|
|
output "controlplane_config_paths" {
|
|
value = {
|
|
for k, v in local_file.controlplane_configs : k => v.filename
|
|
}
|
|
description = "Paths to generated controlplane configs"
|
|
}
|
|
|
|
output "worker_config_paths" {
|
|
value = {
|
|
for k, v in local_file.worker_configs : k => v.filename
|
|
}
|
|
description = "Paths to generated worker configs"
|
|
}
|