Email:Service@dogssl.com
CNY
如何在Kubernetes集群中自动更新SSL证书
更新时间:2025-07-21 作者:自动更新SSL证书

集群中运行的应用(如API网关、Web服务、数据库)普遍依赖SSL证书实现加密通信,而证书的有效期通常为 90 天至 1 年。手动更新证书不仅耗时费力,还可能因遗漏导致服务中断 —— 据统计,约 30% 的生产环境故障与证书过期相关。因此,实现SSL证书在K8s集群中的自动化更新,是保障服务连续性与安全性的核心需求。本文将系统介绍主流方案、实施步骤与最佳实践。

一、K8s集群中SSL证书管理的挑战

K8s环境的动态性与分布式特性,使得证书管理面临独特挑战:

1. 多维度证书需求:集群内存在三类证书需管理 ——

  • 集群组件证书(如API Server、etcd、kubelet 之间的通信证书);
  • Ingress 网关证书(面向外部流量的域名证书,如 api.example.com );
  • 服务间通信证书(微服务内部调用的 mTLS 证书)。

2. 动态扩缩容适配:Pod的创建与销毁具有随机性,证书需跟随Pod生命周期自动挂载,而非静态部署在节点上。

3. 高可用与一致性:证书更新需在不中断服务的前提下完成(如通过滚动更新),且确保所有副本Pod使用相同的有效证书,避免通信异常。

二、自动更新SSL证书的核心方案

基于K8s的声明式API与控制器模式,主流方案通过 “证书申请→自动签发→动态挂载→过期更新” 的闭环实现自动化,核心工具包括 Cert-Manager (证书生命周期管理)、 Let's Encrypt (免费证书签发) Ingress Controller (网关证书绑定)。

方案架构:Cert-Manager + Let's Encrypt + Ingress

1. Cert-Manager:K8s原生的证书管理控制器,通过CRD(自定义资源定义)声明证书需求,自动完成申请、续签、更新等操作。

2. Let's Encrypt:免费的证书颁发机构(CA),支持通过ACME(自动化证书管理环境)协议自动验证域名所有权并签发证书(有效期 90 天)。

3. Ingress Controller(如 Nginx Ingress):作为集群流量入口,将Cert-Manager管理的证书与Ingress规则绑定,实现外部流量的SSL加密。

三、实施步骤:从部署到自动更新全流程

1. 部署 Cert-Manager

Cert-Manager需运行在K8s集群中,通过Helm Chart快速部署:

1    # 添加Helm仓库  
2    helm repo add jetstack https://charts.jetstack.io  
3    helm repo update  
4
5    # 安装Cert-Manager(指定CRD自动安装)  
6    helm install cert-manager jetstack/cert-manager \  
7      --namespace cert-manager \  
8      --create-namespace \  
9      --version v1.13.1 \  
10    --set installCRDs=true  

部署完成后,Cert-Manager 会创建 Certificate Issuer 等CRD资源,用于定义证书与签发者。

2. 配置Issuer(证书签发者)

通过 Issuer ClusterIssuer 资源定义证书签发方式(以Let's Encrypt为例):

1    # letsencrypt-issuer.yaml  
2   apiVersion: cert-manager.io/v1  
3    kind: ClusterIssuer  # ClusterIssuer为集群级资源,所有命名空间可用  
4    metadata:  
5      name: letsencrypt-prod  
5    spec:  
6      acme:  
8        server: https://acme-v02.api.letsencrypt.org/directory  # 生产环境ACME服务器  
9        email: admin@example.com  # 证书过期通知邮箱  
10      privateKeySecretRef:  
11        name: letsencrypt-prod-account-key  # 存储ACME账户私钥的Secret  
12      solvers:  
13      - http01:  # 通过HTTP-01挑战验证域名所有权(需Ingress支持)  
14          ingress:  
15            class: nginx  # 关联Nginx Ingress Controller  

应用配置:

1    kubectl apply -f letsencrypt-issuer.yaml  

Let's Encrypt通过HTTP-01挑战验证域名所有权:向 http://<域名>/.well-known/acme-challenge/<随机字符串> 发送请求,Cert-Manager会自动创建临时Ingress规则响应验证,确保域名归当前集群管理。

3. 声明证书需求并自动挂载

通过 Certificate 资源声明证书需求,Cert-Manager会自动向Issuer申请证书,并将证书存储在Secret中:

1    # example-com-cert.yaml  
2   apiVersion: cert-manager.io/v1  
3    kind: Certificate  
4    metadata:  
5      name: example-com-cert  
6      namespace: default  # 证书所在命名空间,需与应用一致  
7    spec:  
8      secretName: example-com-tls  # 存储证书的Secret名称(自动创建)  
9      issuerRef:  
10      name: letsencrypt-prod  
11      kind: ClusterIssuer  
12    dnsNames:  
13    -api.example.com  # 需签发证书的域名  
14    - www.example.com  
15    duration: 2160h  # 证书有效期(Let's Encrypt最大90天=2160h)  
16    renewBefore: 360h  # 过期前5天(360h)自动续签  

应用配置后,Cert-Manager会触发证书申请流程:

1    kubectl apply -f example-com-cert.yaml  
2
3    # 查看证书状态(Ready为True表示申请成功)  
4    kubectl get certificate example-com-cert -o wide  

证书申请成功后,Secret example-com-tls 会自动创建,包含:

4. 与Ingress绑定实现动态挂载

通过Ingress规则将证书与服务绑定,Ingress Controller会自动从Secret中加载证书,并在证书更新时热重载配置:

1    # example-ingress.yaml  
2    apiVersion: networking.k8s.io/v1  
3    kind: Ingress  
4    metadata:  
5      name: example-ingress  
6      namespace: default  
7      annotations:  
8        kubernetes.io/ingress.class: "nginx"  # 指定Ingress Controller类型  
9        cert-manager.io/cluster-issuer: "letsencrypt-prod"  # 可选:直接关联Issuer,简化配置  
10  spec:  
11    tls:  
12    - hosts:  
13      -api.example.com  
14      - www.example.com  
15      secretName: example-com-tls  # 关联证书Secret  
16    rules:  
17    - host:api.example.com  
18      http:  
19        paths:  
20        - path: /  
21          pathType: Prefix  
22          backend:  
23            service:  
24              name:api-service  
25              port:  
26                number: 80  

应用Ingress配置后,外部访问 https://api.example.com 时,Ingress Controller会使用 example-com-tls 中的证书进行加密通信。

5. 自动更新机制:证书续签与服务滚动更新

  • 证书自动续签:Cert-Manager会监控证书有效期,在 renewBefore 指定的时间前自动向Issuer申请新证书,并更新Secret example-com-tls
  • Ingress Controller热重载:Nginx Ingress等控制器会监听Secret变化,当证书更新后,自动重载配置(无需重启Pod),实现无缝更新。
  • 应用Pod证书挂载:对于需要在Pod内使用证书的场景(如服务间mTLS),可通过 volumeMounts 将Secret挂载到Pod中,并配置 volumeMounts subPath 实现动态更新:
1    # 应用Deployment示例(挂载证书)  
2    apiVersion: apps/v1  
3    kind: Deployment  
4    metadata:  
5      name:API-deployment  
6    spec:  
7      replicas: 3  
8      template:  
9        spec:  
10        containers:  
11        - name:api-service  
12          image:api-image:latest  
13          volumeMounts:  
14          - name: tls-cert  
15            mountPath: /etc/tls  
16            readOnly: true  
17        volumes:  
18        - name: tls-cert  
19          secret:  
20            secretName: example-com-tls  

当Secret更新后,K8s会自动将新证书同步到所有Pod的挂载目录中。对于需要重启才能加载证书的应用,可通过滚动更新触发 Pod 重建:

  • 在Deployment中添加 annotation cert-manager.io/issue-tls: "true" ,Cert-Manager会在证书更新后自动触发滚动更新。

四、进阶场景:集群内部服务mTLS证书自动更新

对于服务间的加密通信(mTLS),需为每个服务签发客户端与服务器证书,可通过Cert-Manager + SPIRE实现:

1. SPIRE:为每个Pod自动分配身份标识(SPIFFE ID),并通过Cert-Manager签发基于身份的证书。

2. 自动注入证书:通过MutatingWebhook在Pod创建时自动挂载证书,并配置Sidecar代理(如Istio)处理TLS握手,证书过期前自动更新并重启Sidecar。

五、监控与故障排查

1. 监控证书状态:

  • 通过 kubectl get certificate 查看所有证书的Ready状态与过期时间。
  • 集成Prometheus + Grafana:Cert-Manager暴露metrics(如 certmanager_certificate_ready_status ),可配置告警规则(如证书剩余有效期 < 7 天)。

2. 常见故障解决:

  • 证书申请失败:检查域名解析是否指向集群Ingress IP、ACME挑战是否被防火墙拦截(需开放 80/443 端口)。
  • 续签失败:查看Cert-Manager日志( kubectl logs -n cert-manager <cert-manager-pod> ),排查Issuer配置或网络问题。
  • 服务未加载新证书:确认Ingress Controller版本支持热重载(如 Nginx Ingress ≥0.25.0),或检查Pod挂载的Secret是否同步更新( kubectl exec <pod-name> -- cat /etc/tls/tls.crt | openssl x509 -noout -dates )。

通过Cert-Manager与Let's Encrypt的组合,K8s集群可实现SSL证书从申请到更新的全自动化,彻底解决手动操作的效率与风险问题。核心在于利用K8s的控制器模式,将证书管理转化为声明式配置,让系统按规则自动完成生命周期管理。


Dogssl.com拥有20年网络安全服务经验,提供构涵盖国际CA机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书
0.102320s