当前位置: 首页 > news >正文

别再手动传证书了!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端点时,要注意其证书不受主流浏览器信任的特性。

http://www.rkmt.cn/news/1457588.html

相关文章:

  • 别扔!全志A13老平板变身Linux小主机:Armbian镜像制作与Lima开源GPU驱动实战
  • 如何快速部署通达信缠论可视化插件:5步完整实战指南
  • 别再死记硬背!用‘客户服务系统’实战案例,5分钟搞懂UML类图怎么画
  • 5个颠覆性策略掌握MediaCreationTool.bat:突破Windows 11硬件限制的完整解决方案
  • 大模型微调实战指南:从技术原理到Qwen多模型矩阵的工程
  • 遥感新手必看:用Python+ENVI快速识别植被、水体、裸土(附光谱曲线对比图)
  • AI工具如何秒级生成公平抽奖结果:3种主流LLM+RNG融合方案实测对比(含代码)
  • 别再只重启服务器了!深度解析百度云加速522错误的三种根源与长效优化方案
  • 2026乡镇同城服务创业攻略:从选址到落地全流程搭建方案
  • 告别寄存器恐惧:用Arduino+PlatformIO一步步调通SX1262 LoRa收发(附完整代码)
  • 出海企业技术架构优化实地观察 拆解AWS Lambda无服务器的落地细节
  • 用MATLAB跑通胎儿心电提取:LMS自适应滤波实操包,含原始数据和效果对比图
  • 长转短这条工程链路里,最容易被低估的瓶颈是什么
  • 告别踩坑!在Visual Studio 2013下编译Eclipse Paho MQTT C库的保姆级指南(含SSL编译失败解决方案)
  • 别再乱下DLL了!用Dependency Walker深度排查.pyd文件依赖问题的正确姿势
  • 2026年6月亳州黄金回收白银回收铂金回收权威可靠门店 TOP5 排行榜+联系方式电话
  • YOLO11涨点优化:蒸馏结构 | 基于ReviewKD(回顾式知识蒸馏),多层特征渐进对齐,轻量YOLO11精度跃升
  • OV摄像头SCCB协议实战:从I2C老司机到图像传感器配置的避坑指南
  • 别再让EMC测试卡脖子!从PCB布局到外壳接地,一份给硬件工程师的电磁兼容自查清单
  • 提示词降英文AI率实战:从95%到10%的优化秘籍
  • STM32虚拟串口踩坑实录:从CubeMX配置到PC端识别,一步步解决‘未知设备’问题
  • AMD Ryzen性能调校完全指南:SMU Debug Tool专业工具深度解析
  • 如何用Vosk API离线语音识别打破云端依赖的行业困境?
  • 别再只调参数了!Simulink模块的‘隐藏属性’这样用,效率翻倍
  • Python图像轮廓提取实战包:Jupyter笔记+测试图+可调脚本
  • Windows下SVN提交日志的‘门神’:手把手教你写Pre-commit Hook脚本(附防摸鱼检测)
  • 腾讯这两个AI模型开始收费了,企业用户该怎么应对?
  • 从‘客户服务系统’看软件设计:如何用包图避免循环依赖这个坑?
  • 保姆级教程:在ROS+MoveIt中为Franka Panda机械臂配置零空间阻抗控制(附避坑指南)
  • 别再乱写注释了!Vivado XDC文件格式的5个‘潜规则’与最佳实践