如何使用Terraform资源为K8s(AKS)颁发letencrypt证书?

时间:2019-08-14 17:59:18

标签: kubernetes terraform lets-encrypt azure-kubernetes terraform-provider-azure

摘要

我无法为天蓝色aksure上的Terraform kubernetes群集颁发有效证书。已成功创建域和证书(根据crt.sh创建了证书),但是该证书未应用于我的域,并且我的浏览器报告“ Kubernetes Ingress Controller伪证书”作为已应用的证书。

将terraform文件从一组有效的yaml文件(可以很好地颁发证书)转换为我的最佳技能。参见我的Terraform代码here

更新!在最初的问题中,我也无法创建证书。这是通过使用here中的“ tls_cert_request”资源解决的。更改包含在下面的更新代码中。

有些东西我已经签出,发现不是问题

  • 从acme letsencrypt颁发的证书数量不超过登台或生产的速率限制。
  • 我通过登台或生产证书服务器都收到相同的“假证书”错误。

以下是我目前正在调查的一些区域,可能是该错误的来源。

  • 我看不到letencrypt yaml输入“ privateKeySecretRef”的等效形式,因此我的部署入口“ certmanager.k8s.io/cluster-issuer”的值应该是什么。

如果有人有其他建议,我将不胜感激(因为这已经困扰了我很长时间了!)

证书资源

provider "acme" {
  server_url = var.context.cert_server
}

resource "tls_private_key" "reg_private_key" {
  algorithm = "RSA"
}

resource "acme_registration" "reg" {
  account_key_pem = tls_private_key.reg_private_key.private_key_pem
  email_address = var.context.email
}

resource "tls_private_key" "cert_private_key" {
  algorithm = "RSA"
}

resource "tls_cert_request" "req" {
  key_algorithm   = "RSA"
  private_key_pem = tls_private_key.cert_private_key.private_key_pem
  dns_names       = [var.context.domain_address]

  subject {
    common_name = var.context.domain_address
  }
}

resource "acme_certificate" "certificate" {
  account_key_pem = acme_registration.reg.account_key_pem
  certificate_request_pem = tls_cert_request.req.cert_request_pem

  dns_challenge {
    provider = "azure"
    config = {
      AZURE_CLIENT_ID = var.context.client_id
      AZURE_CLIENT_SECRET = var.context.client_secret
      AZURE_SUBSCRIPTION_ID = var.context.azure_subscription_id
      AZURE_TENANT_ID = var.context.azure_tenant_id
      AZURE_RESOURCE_GROUP = var.context.azure_dns_rg
    }
  }
}

Pypiserver入口资源

resource "kubernetes_ingress" "pypi" {
  metadata {
    name = "pypi"
    namespace = kubernetes_namespace.pypi.metadata[0].name

    annotations = {
      "kubernetes.io/ingress.class" = "inet"
      "kubernetes.io/tls-acme" = "true"
      "certmanager.k8s.io/cluster-issuer" = "letsencrypt-prod"
      "ingress.kubernetes.io/ssl-redirect" = "true"
    }
  }

  spec {
    tls {
      hosts = [var.domain_address]
    }
    rule {
      host = var.domain_address

      http {
        path {
          path = "/"

          backend {
            service_name = kubernetes_service.pypi.metadata[0].name
            service_port = "http"
          }
        }
      }
    }
  }
}

让我知道是否需要更多信息,我将使用遗漏的内容更新我的问题文本。最后,我将让terraform代码git repo保持运转并为他人提供帮助。

1 个答案:

答案 0 :(得分:0)

我的问题的答案是我必须在群集中包括一个证书管理器,据我所知,没有本地的Terraform资源可以创建它。我最终将Helm用作入口和证书管理器。

设置最终比我最初想象的要复杂一些,就目前而言,它需要运行两次。这是由于未更新kubeconfig(必须再次应用“ set KUBECONFIG = .kubeconfig”,然后再运行“ terraform apply”)。因此,它并不漂亮,但它是“有效”的最小示例,可以使您的部署正常运行。

肯定有几种使用本地terraform资源简化pypi部署部分的方法,并且很容易解决了kubeconfig未被更新的问题。但是我还没有时间进一步调查。

如果有人有技巧为k8s集群提供更优雅,更实用且(可能最重要的)安全的最小地形设置,我想听听!

无论如何,对于感兴趣的人,可以找到here