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 证书的完整生命周期:
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 告警监控,可以实现证书“永不过期”的运维目标——即在证书实际失效之前,始终有有效的证书可供使用。