news 2026/6/4 2:51:16

别再手动传证书了!K8s里用cert-manager自动管理TLS证书的保姆级教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再手动传证书了!K8s里用cert-manager自动管理TLS证书的保姆级教程

告别手动证书管理:cert-manager在Kubernetes中的全自动TLS实践

凌晨三点,服务突然中断——原因竟是证书过期。这种场景对Kubernetes运维团队来说再熟悉不过。传统手动管理证书的方式不仅耗时耗力,还隐藏着巨大的运维风险。本文将带你用cert-manager构建自动化证书管理体系,让TLS证书的申请、续期和部署实现全生命周期无人值守。

1. 为什么需要自动化证书管理?

手动管理TLS证书就像用算盘处理现代金融交易——理论上可行,但效率与风险完全不成正比。当集群规模超过10个服务时,管理员需要跟踪数十个证书的过期时间,手动执行重复的签发流程。更危险的是,90%的证书相关事故都源于人为疏忽导致的过期未更新。

cert-manager作为Kubernetes原生的证书管理工具,通过与Let's Encrypt等CA的集成,实现了:

  • 自动续期:在证书到期前自动申请新证书
  • 集中配置:通过CRD统一管理所有证书策略
  • 无缝集成:自动将证书注入Ingress和Pod
  • 多CA支持:同时对接Let's Encrypt、Venafi等不同CA
# 手动管理证书的典型生命周期 openssl req -new -newkey rsa:2048 -nodes -keyout tls.key -out tls.csr kubectl create secret tls my-cert --cert=tls.crt --key=tls.key # 然后每月检查一次过期时间...

2. 搭建cert-manager基础环境

2.1 安装cert-manager

cert-manager的安装需要三个核心组件:

  1. CustomResourceDefinitions:扩展Kubernetes API
  2. Controller:证书生命周期管理核心
  3. Webhook:验证和修改资源配置

使用官方提供的manifest一键安装最新稳定版:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml

验证安装成功的三个关键点:

  1. 所有pod处于Running状态
  2. 出现cert-manager开头的CRD资源
  3. 能够创建ClusterIssuer资源

注意:生产环境建议使用helm进行安装,便于后续升级和配置管理

2.2 配置Let's Encrypt ClusterIssuer

Let's Encrypt提供两种验证方式:

  • HTTP-01:通过域名解析验证
  • DNS-01:通过DNS记录验证(支持通配符)

以下是配置DNS验证的ClusterIssuer示例(以Cloudflare为例):

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

关键参数说明:

参数说明生产环境建议值
serverACME服务器地址生产用v02而非staging
email紧急通知邮箱公司运维专用邮箱
privateKeySecretRef账户密钥存储位置使用kms加密的secret

3. 证书签发实战场景

3.1 为Ingress自动配置证书

传统方式需要手动创建secret然后配置Ingress,cert-manager只需一个annotation即可自动完成:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - app.example.com secretName: app-tls-cert rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: web-app port: number: 80

证书状态验证命令:

kubectl get certificate kubectl describe certificate app-tls-cert

3.2 为工作负载直接签发证书

某些场景下服务不通过Ingress暴露,但仍需要TLS加密。cert-manager可以通过Certificate资源直接管理:

apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: grpc-server-cert spec: secretName: grpc-tls duration: 2160h # 90天 renewBefore: 720h # 到期前30天续期 commonName: grpc.internal dnsNames: - grpc.internal - grpc.prod.svc.cluster.local issuerRef: name: letsencrypt-prod kind: ClusterIssuer

证书将自动注入到指定secret中,Pod可以直接挂载使用:

containers: - name: grpc-server volumeMounts: - name: tls mountPath: /etc/tls volumes: - name: tls secret: secretName: grpc-tls

4. 高级配置与故障排查

4.1 多CA策略配置

生产环境通常需要混合使用不同CA,cert-manager支持基于注解的签发策略选择:

apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: mixed-ca-cert annotations: cert-manager.io/issuer-selector: "ca-type in (internal, letsencrypt)" spec: secretName: mixed-ca-tls issuerRef: name: ca-pool kind: ClusterIssuer --- apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: ca-pool spec: issuerGroups: - name: internal issuers: - name: vault-issuer kind: Issuer - name: letsencrypt issuers: - name: letsencrypt-prod kind: ClusterIssuer

4.2 常见问题排查指南

当证书签发失败时,按以下步骤排查:

  1. 检查Issuer状态

    kubectl describe clusterissuer letsencrypt-prod
  2. 查看CertificateRequest

    kubectl get certificaterequest kubectl describe certificaterequest <name>
  3. 检查Order资源(ACME专用)

    kubectl get order kubectl describe order <name>
  4. 查看Pod日志

    kubectl logs -n cert-manager -l app.kubernetes.io/instance=cert-manager

典型错误场景处理:

错误现象可能原因解决方案
CertificateRequest pendingCA服务器不可达检查网络策略和出口规则
Invalid domainDNS配置错误验证域名解析和DNS策略
Rate limit exceededLet's Encrypt限制切换临时使用staging环境

5. 生产环境最佳实践

5.1 证书监控与告警

虽然cert-manager会自动续期,但仍需建立监控体系:

apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: cert-manager-alerts spec: groups: - name: cert-manager rules: - alert: CertificateExpiringSoon expr: certmanager_certificate_expiration_timestamp_seconds - time() < 86400 * 30 for: 5m labels: severity: warning annotations: summary: "Certificate will expire soon (instance {{ $labels.instance }})" description: "Certificate {{ $labels.name }} expires in {{ humanizeDuration (($value - time())) }}"

5.2 安全加固措施

  1. 私钥保护

    apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: secured-cert spec: privateKey: rotationPolicy: Always algorithm: RSA size: 4096
  2. 网络策略限制

    apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: cert-manager-egress spec: podSelector: matchLabels: app.kubernetes.io/instance: cert-manager egress: - to: - ipBlock: cidr: 0.0.0.0/0 except: - 192.168.0.0/16 ports: - protocol: TCP port: 443
  3. 备份策略

    # 备份关键Issuer配置 kubectl get clusterissuer -o yaml > clusterissuers-backup.yaml # 备份所有证书私钥 kubectl get secret -l cert-manager.io/certificate-name -o yaml > certificates-backup.yaml

在万级规模集群中运行cert-manager两年后,我们总结出三点核心经验:第一,一定要为DNS验证配置专用服务账号,避免使用全局API密钥;第二,定期轮换ACME账户私钥,建议每半年一次;第三,开发环境使用staging端点时,要注意其证书不受主流浏览器信任的特性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 2:50:31

量子随机存取存储器(QRAM)的技术挑战与突破

1. 量子随机存取存储器(QRAM)的技术挑战与突破量子计算领域近年来取得了一系列突破性进展&#xff0c;但在实际应用中仍面临一个关键瓶颈&#xff1a;如何高效地将大规模经典数据编码到量子态中。这个问题的重要性不亚于量子处理器本身的研发&#xff0c;因为即使拥有强大的量子…

作者头像 李华
网站建设 2026/6/4 2:49:15

Cadence 16.6老用户的福音:Library Builder汉化版详细菜单解读与配置实战

Cadence 16.6 Library Builder汉化版深度解析&#xff1a;从菜单翻译到工程实战作为一名长期使用Cadence 16.6的硬件工程师&#xff0c;我深知英文界面给国内用户带来的困扰。特别是Library Builder这个强大的库管理工具&#xff0c;其丰富的功能往往因为语言障碍而无法充分发挥…

作者头像 李华
网站建设 2026/6/4 2:47:37

从零到可独立设计:硬件工程师快速成长系统解析

在硬件工程师的成长路径中,最容易被低估的不是学习时间,而是学习方法与实践经验的积累。许多新手或跨行业转行的工程师,会误以为“买了资料、听了课”就能掌握硬件设计技能,但现实远比想象复杂: 三个月学习,不可能替代别人三到五年的经验,但通过系统课程和项目训练,可以…

作者头像 李华