自动化管理需要重点解决几个核心痛点:如何自动申请证书,如何安全分发到容器,如何监控更新周期,以及如何处理证书轮换时的服务连续性。主流方案是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)的证书管理能力,实现更细粒度的控制。