Установка Kubernetes CertManager через Terraform

Как установить и настроить kubernetes cert-manager через конфигурацию terraform?

Не могу понять как сделать автоматизацию развёртки через helm, сам kubernetes и helm установлены через providers

provider "kubernetes" {
  config_path = "~/.kube/config"
}

provider "helm" {
  kubernetes {
    config_path = "~/.kube/config"
  }
}

Ответы (2 шт):

Автор решения: Komdosh

Используйте ресурс helm_release

// Создаём отдельный namespace
resource "kubernetes_namespace" "cert" { 
  metadata {
    name = "cert-manager"
  }
}

// установка с помощью helm
resource "helm_release" "cert" {
  name = "cert-manager" // название пакета
  namespace = "cert-manager"
  repository = "https://charts.jetstack.io" // helm репозиторий

  set {
    name = "version"
    value = "v1.5.2"
  }
  set {
    name = "installCRDs" // CRD - Custom Resource Definitions, требуется этим helm пакетом, он установит в кластер дополнительные ресурсы сертификатов и т. п.
    value = "true"
  }
}

resource "null_resource" "certissuer" {
  depends_on = [
    helm_release.cert // запустить ресурс после инициализации cert-manager
  ]
  provisioner "local-exec" {
    when    = destroy
    command = <<-EOD
kubectl delete ClusterIssuer certissuer
EOD
  }

  provisioner "local-exec" {
    command = <<EOT
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: certissuer
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: "YOUR@EMAIL"
    privateKeySecretRef:
      name: cert-manager // ссылка на Secret куда сохранить сертификат
    solvers:
        - http01:
            ingress:
              class: nginx
EOF
EOT
  }
}

При конфигурировании ClusterIssuer обратитесь к документации https://cert-manager.io/docs/configuration/acme/

→ Ссылка
Автор решения: Narnik Gamarnik

Самый простой вариант:

resource "google_compute_managed_ssl_certificate" "default" {
  name = "test-cert"

  managed {
    domains = ["sslcert.tf-test.club."]
  }
}

Более надёжный вариант:

resource "random_id" "certificate" {
  byte_length = 4
  prefix      = "issue6147-cert-"

  keepers = {
    domains = join(",", local.managed_domains)
  }
}

resource "google_compute_managed_ssl_certificate" "cert" {
  name     = random_id.certificate.hex

  lifecycle {
    create_before_destroy = true
  }

  managed {
    domains = local.managed_domains
  }
}

Больше примеров по ссылке.

→ Ссылка