「Kubernetes」- 使用 cert-manager 申请 Let’s Encrypt 证书

配置案例

HTTP01 – cert-manager Documentation

通过 HTTP-01 质询,也能够完成证书申请,其优点是部署简单。

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt
spec:
  acme:
    preferredChain: ""
    privateKeySecretRef:
      name: letsencrypt-issuer-account-key
    server: https://acme-v02.api.letsencrypt.org/directory
    solvers:
    - http01:
        ingress:
          ingressClassName: nginx

注意事项
1)当域名所有权时,Cert Manager 会创建 Pod 来访问域名,流量是从 Pod ⇔ Ingress ⇔ Pod,所以需要确认网络联通。

场景 | 多个 Ingress 控制器

在我们的场景中,集群存在多个 Nginx Ingress Controller 实例,其服务与不同的业务场景。

在申请证书时,我们需要确保 Cert Manager 使用正确的 Ingress Class 来完成质询。

原因在于,如果 Ingress 使用错误的 Ingress Class <B> 参数,则相关的 nginx 配置将写入错误的 Ingress Controller <B> 之上。但是域名是解析 Ingress Controller <A> 的,所以无法正常访问,进而无法完成 HTTP 质询。

我们使用多个不同的 Cluster Issuer 来处理该问题:

---
...
spec:
  acme:
    solvers:
    - http01:
        ingress:
          ingressClassName: nginx-01
          ingressTemplate:
            metadata:
              annotations:
                nginx.ingress.kubernetes.io/ssl-redirect: "false"
...
---
...
spec:
  acme:
    solvers:
    - http01:
        ingress:
          ingressClassName: nginx-02
          ingressTemplate:
            metadata:
              annotations:
                nginx.ingress.kubernetes.io/ssl-redirect: "false"
...

参数 ingressClassName 用于指定创建 Ingress 时使用的 Ingress Class 名称。

注意,参数 solvers 是个数组,其中能够配置多个 solver 实例。其表示可通过任意 solver 来完成质询。