【问题标题】:setup letsencrypt ClusterIssuer with terraformsetupletsencrypt ClusterIssuer with terraform
【发布时间】:2021-10-01 07:22:15
【问题描述】:

我有一个 terraform 配置,可以在 GCP 上创建一个 kubernetes(GKE),使用 Helm 安装 ingress 和 cert-manager。 唯一缺少的部分是letsencrypt ClusterIssuer(当我手动部署letsencrypt.yaml时一切正常)。

我的 Terraform 配置:

# provider
provider "kubernetes" {
  host                   = google_container_cluster.runners.endpoint
  cluster_ca_certificate = base64decode(google_container_cluster.runners.master_auth.0.cluster_ca_certificate)
  token                  = data.google_client_config.current.access_token
}

provider "helm" {
  kubernetes {
      host                   = google_container_cluster.runners.endpoint
      cluster_ca_certificate = base64decode(google_container_cluster.runners.master_auth.0.cluster_ca_certificate)
      token                  = data.google_client_config.current.access_token
  }
}

# create namespace for ingress controller
resource "kubernetes_namespace" "ingress" {
  metadata {
    name = "ingress"
  }
}
# deploy ingress controller
resource "helm_release" "ingress" {
  name       = "ingress"
  namespace = kubernetes_namespace.ingress.metadata[0].name

  repository = "https://kubernetes.github.io/ingress-nginx"
  chart      = "ingress-nginx"

  values = [
    "${file("./helm_values/ingress.yaml")}"
  ]
  set {
    name  = "controller.service.loadBalancerIP"
    value = google_compute_address.net_runner.address
  }
}

#create namespace for cert mananger
resource "kubernetes_namespace" "cert" {
  metadata {
    name = "cert-manager"
  }
}

#deploy cert maanger
resource "helm_release" "cert" {
  name       = "cert-manager"
  namespace = kubernetes_namespace.cert.metadata[0].name
  repository = "https://charts.jetstack.io"
  chart      = "cert-manager"
  depends_on = ["helm_release.ingress"]
  set {
    name  = "version"
    value = "v1.4.0"
  }
  set {
    name  = "installCRDs"
    value = "true"
  }
}

我的letsencrypt.yaml:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: example@example.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx

知道如何使用 terraform 部署 ClusterIssuer?

【问题讨论】:

    标签: ssl kubernetes terraform cert-manager


    【解决方案1】:

    您可以直接将YAML文件应用到集群

    provisioner "local-exec" {
        command = <<EOT
    cat <<EOF | kubectl --server=${aws_eks_cluster.demo.endpoint} --insecure-skip-tls-verify=true --token=${data.aws_eks_cluster_auth.demo.token} create -f -
    apiVersion: certmanager.k8s.io/v1alpha1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory
        email: mymail@gmail.com
        privateKeySecretRef:
          name: letsencrypt
        http01: {}
    EOF
    EOT
      }
    

    或者你也可以使用 TF provider 来应用 YAML 文件

    https://registry.terraform.io/providers/gavinbunney/kubectl/latest/docs#installation

    更新

    如果您尚未将 Kubernetes 提供程序设置为 authenticate,您可以使用 from : https://registry.terraform.io/providers/hashicorp/kubernetes/latest/docs

    provider "kubernetes" {
      config_path    = "~/.kube/config"
      config_context = "my-context"
    }
    
    resource "kubernetes_namespace" "example" {
      metadata {
        name = "my-first-namespace"
      }
    }
    

    【讨论】:

    • 在我提交问题之前,我尝试了 local-exec,但在对我的集群进行身份验证时遇到了错误。现在,我创建了一个 helm 图表并使用了 helm 提供程序。
    • 您也可以使用 Kubernetes 来代替 helm 提供者进行身份验证,registry.terraform.io/providers/hashicorp/kubernetes/latest/… 答案也相同
    【解决方案2】:

    我最近使用 Terraform 工具 tfk8s 迁移 yaml 文件最成功。你也可以使用Terraform yamldecode.

    1. 在使用该工具之前测试您的 yaml 文件并确保它们完全符合您的要求。
    2. 使用 tfk8s,运行 tfk8s cluster-issuer.yaml -o cluster-issuer.tf 这将创建一个有效的 kubernetes_manifest 资源。

    这是我的整个 terraform 脚本的示例,它与 CRD 和 ClusterIssuer 一起安装。

    resource "helm_release" "cert-manager" {
      name       = "cert-manager"
      repository = "https://charts.jetstack.io"
      chart      = "cert-manager"
      version    = "1.7.1"
    
      namespace        = "cert-manager"
      create_namespace = true
    
      #values = [file("cert-manager-values.yaml")]
    
      set {
        name  = "installCRDs"
        value = "true"
      }
    
    }
    
    resource "kubernetes_manifest" "clusterissuer_letsencrypt_prod" {
      manifest = {
        "apiVersion" = "cert-manager.io/v1"
        "kind" = "ClusterIssuer"
        "metadata" = {
          "name" = "letsencrypt-prod"
        }
        "spec" = {
          "acme" = {
            "email" = "myemail@email.com"
            "privateKeySecretRef" = {
              "name" = "letsencrypt-prod"
            }
            "server" = "https://acme-v02.api.letsencrypt.org/directory"
            "solvers" = [
              {
                "http01" = {
                  "ingress" = {
                    "class" = "nginx"
                  }
                }
              },
            ]
          }
        }
      }
    }
    

    注意此工具创建资源类型kubernetes_manifest,Terraform 文档声明它不是stable resource to use with an initial apply command。换句话说,先创建集群等,然后添加文件并再次应用。否则,您需要手动将每个 kubernetes_manifest 迁移到其自己的专用资源类型(部署、服务等)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      • 1970-01-01
      • 2020-02-13
      • 2021-04-22
      • 2022-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多