4. 证书有效期管理:证书过期风险、自动续期策略、使用 cert-manager 进行证书生命周期管理

在 Exporter 与 Prometheus 之间启用 TLS 通信后,证书的有效期管理成为运维的核心挑战。证书过期会导致抓取中断、告警丢失,甚至引发生产事故。本章深入分析证书过期的风险模型,对比自动续期策略,并重点讲解使用 cert-manager 实现证书生命周期全自动管理的最佳实践。

4.1 证书过期风险与影响分析

证书过期并非“瞬间失效”,而是经历一个从警告到中断的渐进过程。下表总结了不同阶段的风险特征:

阶段 剩余有效期 风险表现 影响等级
健康期 > 30 天 无异常,所有 TLS 握手正常 无
预警期 7–30 天 Prometheus 日志出现 x509 证书即将过期警告 低
高危期 1–7 天 部分客户端开始拒绝连接,抓取间隔出现间歇性失败 中
失效期 0 天 TLS 握手失败,Exporter 完全不可达,指标数据丢失 高
生产事故案例: 某金融科技公司因 Exporter 证书过期未及时续期,导致核心交易指标的 Prometheus 抓取中断 47 分钟,告警延迟触发,最终造成 SLA 违约罚款。事后复盘发现,证书过期前 14 天已有日志警告,但未被监控系统捕获。

4.2 自动续期策略对比

手动续期证书在规模化场景下不可行。以下是三种主流自动续期策略的对比:

策略 实现方式 适用场景 优点 缺点
cron + openssl Shell 脚本定时检查证书有效期,到期前重新生成并重启服务 小型测试环境、单机部署 无额外依赖,实现简单 无状态管理,重启服务导致短暂中断,易出错
acme.sh + DNS-01 使用 ACME 协议自动从 Let's Encrypt 获取证书,通过 DNS 验证域名 面向公网的 Exporter,有 DNS 控制权 证书由公共 CA 签发,信任度高 依赖外部 CA 和 DNS API,内网环境不适用
cert-manager Kubernetes 原生证书控制器,自动签发、续期、注入证书 Kubernetes 集群内的 Exporter 部署 声明式管理,自动热更新,与 K8s 深度集成 仅适用于 Kubernetes 环境

4.3 使用 cert-manager 进行证书生命周期管理

cert-manager 是 Kubernetes 生态中最成熟的证书管理工具,它将证书视为 Kubernetes 资源,通过 CRD(Custom Resource Definition)实现声明式生命周期管理。核心组件包括:

  • Issuer / ClusterIssuer:定义证书颁发者,可以是自签名 CA、Let's Encrypt、Vault 或外部 CA。
  • Certificate:声明证书的域名、有效期、密钥算法等属性,cert-manager 自动生成私钥并请求签发。
  • Secret:证书和私钥以 Kubernetes Secret 形式存储,Exporter Pod 通过 volume 挂载使用。
核心优势: cert-manager 在证书到期前自动执行续期(默认在到期前 30 天开始尝试),续期成功后自动更新 Secret,Exporter 无需重启即可加载新证书(通过文件变化监听或 sidecar 重载)。

4.3.1 架构与工作流程

下图展示了 cert-manager 管理 Exporter 证书的完整生命周期:

cert-manager 证书生命周期管理流程 cert-manager 证书生命周期管理流程 用户创建 Certificate cert-manager 控制器 Issuer / ClusterIssuer 监听 请求签发 生成私钥 + 证书 存储为 Secret 返回证书数据 Exporter Pod 挂载 到期前 30 天自动续期 更新 Secret Exporter 热加载新证书 说明: cert-manager 通过 Certificate 资源的 .spec.renewBefore 字段控制续期提前量(默认 30 天)。 续期成功后,Exporter 通过 inotify 或 sidecar 容器检测文件变化,实现零停机证书更新。

4.3.2 关键配置示例

以下是一个完整的 cert-manager Certificate 资源定义,用于为 Exporter 签发有效期 365 天的自签名证书:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: node-exporter-tls
  namespace: monitoring
spec:
  # 证书有效期,支持 Go 时间格式
  duration: 8760h  # 365 天
  
  # 续期提前量,到期前 30 天开始自动续期
  renewBefore: 720h  # 30 天
  
  # 私钥算法与长度
  privateKey:
    algorithm: RSA
    size: 2048
    encoding: PKCS1
  
  # 证书主题信息
  subject:
    organizations:
      - MyCompany
    organizationalUnits:
      - SRE
    commonName: node-exporter.monitoring.svc.cluster.local
  
  # DNS 名称(SAN)
  dnsNames:
    - node-exporter
    - node-exporter.monitoring
    - node-exporter.monitoring.svc
    - node-exporter.monitoring.svc.cluster.local
  
  # IP 地址(可选)
  ipAddresses:
    - 10.96.0.1
  
  # 指定使用的 Issuer(同命名空间)
  issuerRef:
    name: internal-ca-issuer
    kind: Issuer
    # 如果是 ClusterIssuer,则 kind: ClusterIssuer
最佳实践: 建议将 renewBefore 设置为证书有效期的 10%–15%。例如 365 天证书设置 30–45 天提前续期,既避免频繁续期带来的资源开销,又留有充足的故障恢复时间。

4.3.3 监控证书续期状态

cert-manager 会更新 Certificate 资源的状态字段,运维人员可以通过以下方式监控续期健康度:

  • kubectl describe certificate:查看 Conditions 字段,确认 Ready 状态是否为 True。
  • Prometheus 指标:cert-manager 暴露 certmanager_certificate_expiry_seconds 指标,可配置告警规则。
  • Events 事件:续期成功或失败时,cert-manager 会生成 Kubernetes Events,可通过 kubectl get events -n monitoring 查看。

以下是一个 Prometheus 告警规则示例,用于检测证书即将过期:

groups:
- name: cert-manager-alerts
  rules:
  - alert: CertificateExpiringSoon
    expr: |
      certmanager_certificate_expiry_seconds{namespace="monitoring"} < 604800
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "证书 {{ $labels.name }} 将在 7 天内过期"
      description: "证书 {{ $labels.name }} 在命名空间 {{ $labels.namespace }} 中剩余有效期不足 7 天,请检查续期状态。"

4.4 证书生命周期管理总结

证书有效期管理是 Exporter TLS 安全加固中不可忽视的持续性工作。通过 cert-manager 实现声明式证书生命周期管理,可以显著降低人为失误风险,实现证书签发、续期、更新的全自动化。下表总结了关键配置参数:

参数 推荐值 说明
duration 8760h(365 天) 证书有效期,过长增加泄露风险,过短增加续期频率
renewBefore 720h(30 天) 续期提前量,确保有足够时间处理续期失败
privateKey.algorithm RSA 或 ECDSA ECDSA 性能更优,但部分旧客户端不兼容
privateKey.size 2048(RSA) 2048 位是当前安全基线,4096 位性能开销较大
issuerRef 内部 CA Issuer 生产环境建议使用自建内部 CA,避免依赖外部 CA
核心结论: 证书过期是 Exporter TLS 通信中最容易被忽视的故障点。采用 cert-manager 进行自动化生命周期管理,配合 Prometheus 告警监控,可以实现证书“永不过期”的运维目标——即在证书实际失效之前,始终有有效的证书可供使用。