cert-manager 详解:自动管理 Kubernetes 证书
cert-manager 是 Kubernetes 的一个 证书管理工具,用于自动化 TLS 证书的颁发、续订和注入,支持 Let’s Encrypt、HashiCorp Vault、Venafi 等多种证书颁发机构(CA)。它的核心作用是 让 Kubernetes 集群的证书管理变得自动化、可靠且安全。
1. cert-manager 的核心作用
| 功能 | 说明 |
|---|---|
| 自动申请证书 | 从 Let’s Encrypt、私有 CA 等自动获取 TLS 证书 |
| 自动续订证书 | 在证书过期前自动续订,避免服务中断 |
| 证书注入 | 自动将证书存储到 Secret,供 Ingress、Service 等使用 |
| 多 CA 支持 | 支持 Let’s Encrypt、HashiCorp Vault、Venafi、自签名证书等 |
| DNS 验证 | 支持 ACME DNS-01 和 HTTP-01 挑战,适用于私有集群 |
| 多集群管理 | 可集中管理多个 Kubernetes 集群的证书 |
2. cert-manager 的核心概念
cert-manager 通过 CRD(Custom Resource Definitions) 定义证书管理逻辑:
| CRD 资源 | 作用 |
|---|---|
Issuer** / **ClusterIssuer | 定义证书颁发机构(CA),如 Let’s Encrypt |
Certificate | 定义要申请的证书(域名、有效期等) |
CertificateRequest | 证书申请请求(通常由 Certificate 自动创建) |
Order | ACME 订单(用于 Let’s Encrypt 证书申请) |
Challenge | ACME 挑战(用于域名所有权验证) |
3. cert-manager 的安装
(1)使用 Helm 安装
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.14.4 \
--set installCRDs=true说明:
installCRDs=true:自动安装 cert-manager 所需的 CRD。--namespace cert-manager:推荐单独命名空间。
(2)验证安装
kubectl get pods -n cert-manager预期输出:
NAME READY STATUS RESTARTS AGE
cert-manager-5c6866597-zw7kh 1/1 Running 0 2m
cert-manager-cainjector-577f6d9fd7-tr4l7 1/1 Running 0 2m
cert-manager-webhook-786b59d8b8-94z6h 1/1 Running 0 2m4. cert-manager 的典型使用场景
场景 1:自动申请 Let’s Encrypt 证书
(1)创建 ClusterIssuer(适用于整个集群)
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: admin@example.com # 替换为你的邮箱
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
- http01:
ingress:
class: nginx # 使用 nginx Ingress说明:
server: Let’s Encrypt 生产环境(https://acme-staging-v02.api.letsencrypt.org/directory是测试环境)。http01: 使用 HTTP-01 挑战(需要 Ingress 可被公网访问)。- 如果使用 DNS 验证(如 Cloudflare、AWS Route53),需配置
dns01。
**(2)创建 **Certificate
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-com-tls # 证书存储的 Secret 名称
duration: 90d # 证书有效期(默认 90 天)
renewBefore: 15d # 提前 15 天续订
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- example.com
- www.example.com说明:
secretName: 证书最终会存储到该Secret,供 Ingress 使用。renewBefore: 在过期前 15 天自动续订。
(3)在 Ingress 中使用证书
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
tls:
- hosts:
- example.com
secretName: example-com-tls # 引用 cert-manager 生成的 Secret
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80验证证书:
kubectl get certificate example-com -o wide
kubectl describe secret example-com-tls场景 2:使用私有 CA(如 Vault)
(1)配置 Vault Issuer
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: vault-issuer
namespace: default
spec:
vault:
server: https://vault.example.com
path: pki/sign/example-com
auth:
tokenSecretRef:
name: vault-token
key: token说明:
server: Vault 地址。path: Vault PKI 路径。auth: 使用 Token 或 Kubernetes ServiceAccount 认证。
(2)申请证书
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: internal-cert
namespace: default
spec:
secretName: internal-tls
issuerRef:
name: vault-issuer
kind: Issuer
dnsNames:
- internal.example.com5. cert-manager 的证书续订机制
cert-manager 会:
- 监控证书有效期,在
renewBefore时间前触发续订。 - **自动更新 **
Secret,确保引用的服务(如 Ingress)使用新证书。 - 支持热更新,部分组件(如 Ingress Controller)会自动加载新证书。
查看证书状态:
kubectl get certificates输出示例:
NAME READY SECRET AGE
example-com True example-com-tls 30dREADY=True表示证书已签发并有效。
6. cert-manager 的高级功能
| 功能 | 说明 |
|---|---|
| 多 Issuer 支持 | 可同时使用 Let’s Encrypt、Vault 等不同 CA |
| 证书轮换 | 支持手动或自动轮换私钥 |
| 证书导出 | 可将证书导出为 PEM/JKS 格式 |
| 证书监控 | 集成 Prometheus 监控证书过期时间 |
| 多集群管理 | 使用 External Issuers 跨集群管理证书 |
7. 最佳实践
- **使用
ClusterIssuer代替 **Issuer(除非需要命名空间隔离)。 - 生产环境使用 Let’s Encrypt 的
prod环境,避免测试环境的速率限制。 - **配置 **
renewBefore(建议 15-30 天),避免证书过期。 - 监控证书状态:
kubectl get certificates --all-namespaces -w- 备份
Issuer的私钥(如 Let’s Encrypt 的privateKeySecretRef),避免账户丢失。
总结
cert-manager 是 Kubernetes 证书管理的 “自动化神器”,能够:
✅ 自动申请和续订 TLS 证书(支持 Let’s Encrypt、Vault 等)。
✅ 无缝集成 Ingress,避免手动管理证书。
✅ 支持 DNS 和 HTTP 验证,适应各种集群环境。
✅ 提供高可用性,确保服务不会因证书过期中断。
推荐场景:
- 公有云 Kubernetes 集群 + Let’s Encrypt。
- 私有集群 + 自建 CA(如 Vault PKI)。
- 需要长期维护大量证书的环境。