main.tf
Rama main · réplica de lectura del repositorio original.
terraform {
required_version = ">=1.9"
required_providers {
tailscale = {
source = "tailscale/tailscale"
version = "0.29.3"
}
helm = {
source = "hashicorp/helm"
version = "~> 3.0"
}
kubernetes = {
source = "hashicorp/kubernetes"
version = ">=2.31.0"
}
cloudflare = {
source = "cloudflare/cloudflare"
version = "~> 5.0"
}
corefunc = {
source = "northwood-labs/corefunc"
version = "~> 2.0"
}
}
}
provider "tailscale" {
oauth_client_id = var.tailnet_oauth_client_id
oauth_client_secret = var.tailnet_oauth_client_secret
}
provider "cloudflare" {
api_token = var.cloudflare_token
}
locals {
cluster_name = "k8rn"
pod_subnets = {
ipv6 = "fdd2:14fe:fb0::/52", # randomly generated
ipv4 = "10.244.0.0/16",
}
openebs_diskpool_volume_name = "openebs-diskpool"
openebs_diskpool_partition_label = "r-${local.openebs_diskpool_volume_name}"
}
module "infra" {
source = "./infra"
talos_version = var.talos_version
cluster_name = local.cluster_name
cluster_service_account_issuer = var.cluster_service_account_issuer
cluster_oidc_issuer_host = var.cluster_oidc_issuer_host
cluster_oidc_client_id = var.cluster_oidc_client_id
image_cache_ip = var.image_cache_ip
nodes = var.nodes
bootstrap_node = var.bootstrap_node
tailnet_name = var.tailnet_name
mayastor_io_engine_nodes = var.mayastor_io_engine_nodes
openebs_diskpool_volume_name = local.openebs_diskpool_volume_name
stable_secret = var.stable_secret
pod_subnets = [
local.pod_subnets.ipv6,
local.pod_subnets.ipv4,
]
service_subnets = [
"fdd2:14fe:fb0:1000::/108", # randomly generated
"10.96.0.0/12",
]
dns_loadbalancer_domain = var.dns_loadbalancer_domain
kms_endpoint = var.kms_endpoint
cloudflare_zone = var.cloudflare_zone
}
locals {
k8s_config = length(module.infra.kubeconfig) != 0 ? {
host = module.infra.kubeconfig.kubernetes_client_configuration.host
client_certificate = base64decode(module.infra.kubeconfig.kubernetes_client_configuration.client_certificate)
client_key = base64decode(module.infra.kubeconfig.kubernetes_client_configuration.client_key)
cluster_ca_certificate = base64decode(module.infra.kubeconfig.kubernetes_client_configuration.ca_certificate)
} : {
host = null
client_certificate = null
client_key = null
cluster_ca_certificate = null
}
}
provider "kubernetes" {
host = local.k8s_config.host
client_certificate = local.k8s_config.client_certificate
client_key = local.k8s_config.client_key
cluster_ca_certificate = local.k8s_config.cluster_ca_certificate
}
provider "helm" {
kubernetes = {
host = local.k8s_config.host
client_certificate = local.k8s_config.client_certificate
client_key = local.k8s_config.client_key
cluster_ca_certificate = local.k8s_config.cluster_ca_certificate
}
}
locals {
active_nodes = {
for name, node in var.nodes
: name => node if contains(node.tags, "control_plane") || contains(node.tags, "worker")
}
num_openebs_etcd_nodes = length([
for node in local.active_nodes
: node if !contains(node.tags, "worker")
])
node_labels = {
for name, node in local.active_nodes
: name => merge(
contains(node.tags, "worker") ? { "node-role.kubernetes.io/worker" : "" } : {},
)
}
# Just use `registerWithTaints` but leaving this functionality
# in case taints need to change after node registration
node_taints = {}
}
module "k8s" {
source = "./k8s"
depends_on = [module.infra.kubeconfig]
github_repo = var.github_repo
lets_encrypt_email = var.lets_encrypt_email
services_hostname_suffix = var.services_hostname_suffix
cluster_oidc_issuer_host = var.cluster_oidc_issuer_host
flux_ssh_private_key = var.flux_ssh_private_key
flux_sops_age_key = var.flux_sops_age_key
openebs_etcd_replicaCount = local.num_openebs_etcd_nodes >= 3 ? 3 : 1
openebs_diskpool_partition_label = local.openebs_diskpool_partition_label
restic_remote_password = var.restic_remote_password
local_cidr = {
ipv4 = "192.168.0.1/23"
ipv6 = "fd4b:7c9f:5791:9001::/64"
}
pod_cidr = {
ipv4 = local.pod_subnets.ipv4
ipv6 = local.pod_subnets.ipv6
}
node_labels = {
for name, labels in local.node_labels
: name => labels if length(labels) > 0
}
node_taints = {
for name, taints in local.node_taints
: name => taints if length(taints) > 0
}
kms_endpoint = var.kms_endpoint
pgp_commit_keys = var.pgp_commit_keys
ssh_commit_keys = var.ssh_commit_keys
}
module "kubelet_server_certs" {
source = "./kubelet_server_certs"
depends_on = [module.infra.k8s]
nodes = toset(nonsensitive(module.infra.talos_client_configuration.nodes))
endpoint = module.infra.talos_client_configuration.endpoints[0]
machine_configuration = module.infra.talos_machine_configuration
client_configuration = module.infra.talos_client_configuration.client_configuration
}