Ctrl K
ComunidadGuías…

main.tf

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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
}