Home

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 自动创建)
OrderACME 订单(用于 Let’s Encrypt 证书申请)
ChallengeACME 挑战(用于域名所有权验证)

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          2m

4. 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.com

5. cert-manager 的证书续订机制

cert-manager 会:

  1. 监控证书有效期,在 renewBefore 时间前触发续订。
  2. **自动更新 **Secret,确保引用的服务(如 Ingress)使用新证书。
  3. 支持热更新,部分组件(如 Ingress Controller)会自动加载新证书。

查看证书状态:

kubectl get certificates

输出示例:

NAME          READY   SECRET            AGE
example-com   True    example-com-tls   30d
  • READY=True 表示证书已签发并有效。

6. cert-manager 的高级功能

功能说明
多 Issuer 支持可同时使用 Let’s Encrypt、Vault 等不同 CA
证书轮换支持手动或自动轮换私钥
证书导出可将证书导出为 PEM/JKS 格式
证书监控集成 Prometheus 监控证书过期时间
多集群管理使用 External Issuers 跨集群管理证书

7. 最佳实践

  1. **使用 ClusterIssuer 代替 **Issuer(除非需要命名空间隔离)。
  2. 生产环境使用 Let’s Encrypt 的 prod 环境,避免测试环境的速率限制。
  3. **配置 **renewBefore(建议 15-30 天),避免证书过期。
  4. 监控证书状态
kubectl get certificates --all-namespaces -w
  1. 备份 Issuer 的私钥(如 Let’s Encrypt 的 privateKeySecretRef),避免账户丢失。

总结

cert-manager 是 Kubernetes 证书管理的 “自动化神器”,能够:
自动申请和续订 TLS 证书(支持 Let’s Encrypt、Vault 等)。
无缝集成 Ingress,避免手动管理证书。
支持 DNS 和 HTTP 验证,适应各种集群环境。
提供高可用性,确保服务不会因证书过期中断。

推荐场景

  • 公有云 Kubernetes 集群 + Let’s Encrypt。
  • 私有集群 + 自建 CA(如 Vault PKI)。
  • 需要长期维护大量证书的环境。
Kubernetes 存储 AI