该笔记将记录:在 Kubernetes Cluster 中,如何使用 Cert Manager 来管理 Let’s Encrypt 证书,以及相关问题的处理方法。在 Kubernetes Cluster 中,部署 cert-manager 组件,并用其来申请证书的方法,以及相关问题处理;
认识
官网:https://cert-manager.io/
文档:https://cert-manager.io/docs/
仓库:https://github.com/cert-manager/cert-manager
以前,我们使用 ACME 脚本来申请 Let’s Encrypt 证书,享受着免费证书和脚本自动化的便利,部署 HTTPS 是那么简单。现在,我们切换到 Kubernetes 环境后,我们该怎样处理呢?最简单最直接的方法就是继续使用 ACME 申请证书,然后使用这个证书创建 Secret 对象,最后在 Ingress 中应用该 Secret 对象。但是 Let’s Encrypt 证书三个月到期,届时我们则需要继续证书续期,然后更新 Secret 信息,这绝对是项繁琐且易失误的工作。
我们能够将 ACME 搬到 Kubernetes 集群中,实现证书的管理。但是,现在已有 cert-manager 组件,它将负责完成证书申请、自动续期等等系列任务,让我们从繁琐的工作中解脱出来。
简而言之,我们使用 Certbot 工具向 Let’s Encrypt 免费申请并自动续期证书。在 Kubernetes Cluster 中,我们使用 cert-manager 组件来实现同样的诉求。
组成
整体架构以及各资源的作用

—— 该部分将介绍在 cert-manager 中需要知晓的基本概念及其技术架构。
Certificate -> CertificateRequest -> Order -> Challenge
Issuer
在 cert-manager 中,术语 Issuer 能够理解为“证书颁发机构(CA)”。支持以下类型:
1)SelfSigned,自签名证书;
2)CA,此类似代表证书及私钥在集群中的证书颁发机构;
3)Vault,第三方证书颁发机构;
4)Venafi,第三方证书颁发机构;
5)ACME,使用 ACME 协议获取证书。当然不限于 Let’s Encrypt 机构;
5)External,除了上述类型外,通过该方法能够自定义证书机构,以处理 CertificateRequest 资源;
Issuer 分为两种:命名空间级别的 Issuer 资源;集群级别的 ClusterIssuer 资源;
Certificate
当定义 CA(Issuer)之后,便能够申请证书,此时使用 Certificate 资源。
该对象引用 Issuer 或 ClusterIssuer 资源:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: acme-crt
spec:
secretName: acme-crt-secret
dnsNames:
- foo.example.com
- bar.example.com
issuerRef:
name: letsencrypt-prod
# We can reference ClusterIssuers by changing the kind here.
# The default value is Issuer (i.e. a locally namespaced Issuer)
kind: Issuer
group: cert-manager.io
CertificateRequest
当创建 Certificate 资源,cert-manager 将创建 CertificateRequest 资源来申请证书。
注意事项:通常 CertificateRequest 资源无需我们手动创建,也不应该由用户手动创建。
Order and Challenge
Order 与 Challenge 资源是为了完成“ACME 质询”而引入的资源。
ACME issuer 将使用 Order 资源来管理签发的 TLS 证书的生命周期。Order 资源为该 “acme order(订单?)” 封装多个“ACME 质询”,因此将管理一个或多个 Challenge 资源。
ACME issuer 将使用 Challenge 资源来管理“必须完成的 ACME 质询”的生命周期,以验证域名的所有权。
注意事项:
1)Order 资源永远都无需我们手动创建;
其他术语
OLM – Operator Lifecycle Manager,根据 Google: k8s what is olm 结果输出比例,该术语目前(09/17/2021)与 OpenShift 有关,因此我们的场景无需理会该内容。
性质
1)简化证书管理,实现证书申请与自动化需其;
2)具有与多个证书颁发机构(CA)进行交互的标准化 API;
3)证书的管理更加安全;
4)支持 ACME(Let’s Encrypt),HashiCorp Vault,Venafi,自签名,内部 CA;
5)可扩展以支持其他 CA;
构建
安装 cert-manager 组件 | 该笔记将记录:在 Kubernetes Cluster 中,部署 cert-manager 组件来申请证书,以及相关问题的解决办法。
版本选择
参考文档,以获取详细细节:https://cert-manager.io/docs/releases/
1.18 | Kubernetes 1.29 → 1.33 / 4.16 → 4.18 | 1.29 → 1.33
1.17 | Kubernetes 1.29 → 1.33 / 4.16 → 4.18 | 1.29 → 1.32
部署方式
官方提供多种安装方式,从最早的 kubectl appply 方式,再到 kubectl cert-manager 扩展,再到现在(04/01/2022)的 cmctl 专用命令行工具。
最开始我们采用 cmctl 部署,但是后续我们将不再采用 cmctl 工具进行部署,原因是:
- 官方暂且未提供通过 cmctl 升级 cert-manager 的方法;
- 在升级实践中,仍旧需要通过 HELM 进行升级,而且需要单独升级 CRD 资源;
现在(05/26/23),我们多以 Helm 进行部署,以便于相关配置文件的管理及维护;
Installing with Helm | https://cert-manager.io/docs/installation/helm/
服务升级
Upgrading from v0.15 to v0.16 | cert-manager
应用
1)在 Ingress 中,自动申请证书,以提供 HTTPS 连接
kube-cert-manager 与 kube-lego 是相同的项目,但是现在都处于维护模式,推荐使用 cert-manager 项目。
申请 Let’s Encrypt 证书
前面步骤演示如何部署 cert-manager 组件,并成功地完成申请自签名证书的办法,但这并不是我们的实际应用场景;
我们希望通过 cert-manager 组件,在集群内完成 Let’s Encrypt 证书申请和管理;
DNS-01 | 参考 Solutions to Scenarios (04):Request Certificate (alidns) 笔记,获取该问题的解决方案;
HTTP-01 | HTTP01 – cert-manager Documentation
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-account-key
solvers:
- http01:
ingress:
class: nginx
在 ACK 中,鉴于集群网络特性,需要修改 nginx-ingress-lb 这个 svc 的 internalTrafficPolicy 改成 Cluster,否则 Order 的 selftest 将失败;
改进
中心化的证书管理 Centralized Secret Management
Let’s Ecnrypt 证书频率限制;
参考 Using wildcard certificates with cert-manager in Kubernetes and replicating across all namespaces 文章,以获得详细说明。
其大致过程如下:
1)通过 Issuer 资源,集中申请泛域名证书,保存在 cert-manager 命名空间;
2)通过 kubernetes-replicator(或其他同类)服务,进行 Secret 资源复制;
3)在 Ingress 中,引用该 Secret 资源;
参考
Welcome to cert-manager
PalmStoneGames/kube-cert-manager: Manage Lets Encrypt certificates for a Kubernetes cluster.
jetstack/kube-lego: DEPRECATED: Automatically request certificates for Kubernetes Ingress resources from Let’s Encrypt
cert-manager/Issuer/Supported Issuers
Concepts | cert-manager