自动化管理需要重点解决几个核心痛点:如何自动申请证书,如何安全分发到容器,如何监控更新周期,以及如何处理证书轮换时的服务连续性。主流方案是Cert-Manager+Let's Encrypt的组合,这个方案成熟度高,社区支持好。 在云原生架构中,实现SSL证书的自动化管理是确保服务安全、可靠运行的关键环节。动态伸缩、微服务和容器化环境要求证书管理必须摆脱传统手动操作,实现全生命周期自动化。下面是核心方案和最佳实践应用:
一、核心挑战
动态性:容器/Pod IP 频繁变化,服务实例动态伸缩。
规模:微服务架构下证书数量激增(每服务/每域名)。
生命周期:证书需自动申请、部署、轮转、撤销。
安全存储:私钥需安全存储,防止泄露。
二、主流解决方案:Cert-Manager
Cert-Manager 是 Kubernetes 生态中事实标准的证书管理工具,支持自动申请、续订和注入证书。
核心组件:
组件 功能说明
Issuer/ClusterIssuer 定义证书颁发机构(CA)来源(如 Let's Encrypt、HashiCorp Vault)
Certificate CRD 声明需要的SSL证书(域名、有效期、存储位置等)
Secret 自动存储证书和私钥的 Kubernetes Secret
三、自动化关键步骤
1. 自动申请与续订
配置示例(Let's Encrypt + DNS-01):
yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
dns01:
cloudflare:
apiTokenSecretRef:
name: cloudflare-api-token
key: token
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: api-example-com
spec:
secretName: api-tls-secret # 自动创建Secret
dnsNames:
api.example.com
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
2. 证书自动注入
方式一:Ingress 直接引用(最常见)
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
tls:
hosts:
api.example.com
secretName: api-tls-secret # Cert-Manager自动更新此Secret
rules:
host: api.example.com
http: {...}
方式二:Sidecar 容器自动热重载(如 istio-agent 或 envoy)
yaml
使用Volume挂载Secret,通过fsnotify监听文件变化
volumes:
name: cert-volume
secret:
secretName: api-tls-secret
volumeMounts:
mountPath: /etc/certs
name: cert-volume
3. 私钥安全管理
避免明文存储:
使用 HashiCorp Vault 等外部系统管理私钥,通过 cert-manager 的 Vault Issuer 集成。
开启 Kubernetes Secret 加密(KMS/Cloud KMS)。
4. 多集群/混合云策略
证书同步工具:
使用 External Secrets Operator 将证书同步到多个集群。
跨云时,通过 GitOps(如 Argo CD) 同步证书声明文件。
四、高级实践与优化
1. 证书轮换零宕机
方案:使用双证书热切换(如 Envoy 的 SDS 动态配置)
yaml
Envoy SDS 配置示例
tls_certificate_sds_secret_configs:
name: "cert-chain-1"
sds_config: {...}
name: "cert-chain-2"
sds_config: {...}
2. 监控与告警
关键指标:
certmanager_certificate_expiration_timestamp_seconds
certmanager_certificate_ready_status(状态是否正常)
Prometheus 告警规则:
yaml
alert: CertificateExpiringSoon
expr: (certmanager_certificate_expiration_timestamp_seconds - time()) / 86400 < 30
for: 5m
3. 灾难恢复
备份策略:
定期备份 Certificate CRD 和关联的 Secret(Velero/Restic)。
保存 ACME 账户私钥(用于重新获取证书)。
五、替代方案对比
工具 适用场景 特点
Cert-Manager Kubernetes 原生环境 生态完善,社区活跃
HashiCorp Vault 混合云/已有Vault基础设施 支持动态证书,策略精细
AWS ACM AWS EKS 环境 深度集成ALB/CloudFront
Google CAS GCP GKE 环境 托管式CA服务
六、关键注意事项
域名验证方式选择:
HTTP-01:需开放80端口,适合公网服务。
DNS-01:更安全,适合内网/限制端口的场景。
速率限制:
Let's Encrypt 有严格限流(如每周50张新证书/域名)。
证书复用:
避免为每个Pod创建独立证书,使用同一证书+SNI支持多域名。
根证书信任:
内网CA证书需注入容器信任库(如通过InitContainer更新/etc/ssl/certs)。
用户通过 Cert-Manager + Let's Encrypt + GitOps 的组合,可构建完整的证书自动化流水线,实现从申请到销毁的全生命周期管理,彻底避免因证书过期导致的服务中断。在大型系统中,建议结合服务网格(如Istio)的证书管理能力,实现更细粒度的控制。