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

别再手动传证书了!Kubernetes里用cert-manager自动管理TLS证书的保姆级教程 告别手动证书管理cert-manager在Kubernetes中的全自动TLS实践当微服务架构遇上KubernetesTLS证书管理往往成为运维人员最头疼的问题之一。想象一下凌晨三点被证书过期的告警吵醒手忙脚乱地续签证书、更新Secret、滚动重启Pod...这种场景在采用cert-manager后将成为历史。作为云原生证书管理的标杆工具cert-manager不仅能自动处理Lets Encrypt证书的申请和续期还能无缝集成各类Issuer实现企业级证书生命周期管理。1. 为什么需要cert-manager传统证书管理方式存在三大痛点人工操作繁琐、过期风险难控、多环境一致性差。以典型的Lets Encrypt证书为例每90天就需要手动续期一次在拥有上百个服务的生产环境中这种重复劳动不仅效率低下还容易因疏忽导致服务中断。cert-manager通过以下机制彻底改变游戏规则自动化工作流监控证书有效期提前自动续期声明式API通过Kubernetes原生资源定义证书需求多CA支持兼容Lets Encrypt、Venafi、HashiCorp Vault等证书颁发机构安全存储自动将证书和私钥存入Kubernetes Secret# 传统方式 vs cert-manager方式对比 传统方式 人工申请证书 - 创建Secret - 配置Ingress - 监控过期 - 手动续期 cert-manager方式 定义Certificate资源 - 自动完成所有流程2. 环境部署与基础配置2.1 安装cert-manager推荐使用Helm进行一键化部署确保组件完整且配置规范helm repo add jetstack https://charts.jetstack.io helm repo update helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.8.0 \ --set installCRDstrue安装后验证各组件状态kubectl get pods -n cert-manager预期输出应显示三个Pod均为Running状态NAME READY STATUS cert-manager-7cd5cdf774-vb5jr 1/1 Running cert-manager-cainjector-64c949654-jw9hn 1/1 Running cert-manager-webhook-5f4d766b5d-6hkzg 1/1 Running2.2 配置Lets Encrypt Issuer根据ACME协议要求cert-manager需要通过域名验证来确认申请者对域名的控制权。配置分为生产环境和测试环境两种Issuer# 生产环境Issuer有速率限制 apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: adminyourdomain.com privateKeySecretRef: name: letsencrypt-prod-account-key solvers: - http01: ingress: class: nginx # 测试环境Issuer无严格限制 apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-staging spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory email: adminyourdomain.com privateKeySecretRef: name: letsencrypt-staging-account-key solvers: - http01: ingress: class: nginx注意生产环境Issuer受Lets Encrypt的速率限制每周50张证书/域名测试阶段应优先使用staging环境3. 证书签发实战3.1 为Ingress自动附加证书最典型的应用场景是为Ingress资源自动配置HTTPS。cert-manager通过注解识别需求apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app annotations: cert-manager.io/cluster-issuer: letsencrypt-prod spec: tls: - hosts: - app.yourdomain.com secretName: app-tls-secret rules: - host: app.yourdomain.com http: paths: - path: / pathType: Prefix backend: service: name: web-app port: number: 80cert-manager会自动完成以下操作创建Certificate资源通过ACME协议完成域名验证将获取的证书存入指定Secret监控证书有效期并在到期前自动续期3.2 独立证书管理对于非Ingress场景如gRPC服务可直接定义Certificate资源apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: grpc-cert spec: secretName: grpc-tls-secret duration: 2160h # 90天 renewBefore: 720h # 到期前30天开始续期 issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - grpc.yourdomain.com - *.grpc.yourdomain.com证书状态可通过以下命令检查kubectl get certificate健康状态应显示为ReadyTrueNAME READY SECRET AGE grpc-cert True grpc-tls-secret 2d4. 高级配置与最佳实践4.1 多CA策略配置企业级环境通常需要根据证书用途选择不同CACA类型适用场景配置示例Lets Encrypt对外服务ACME HTTP-01验证Vault PKI内部服务Vault AppRole认证Private CA特殊合规要求自签名CA链配置Vault Issuer配置示例apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: vault-issuer spec: vault: server: https://vault.yourdomain.com path: pki/sign/your-role auth: appRole: path: approle roleId: your-role-id secretRef: name: vault-approle-secret key: secret-id4.2 证书轮换策略通过调整Certificate资源的duration和renewBefore参数实现灵活续期spec: duration: 8760h # 1年有效期 renewBefore: 720h # 提前1个月续期 revisionHistoryLimit: 3 # 保留历史版本数关键提示Lets Encrypt证书最长有效期为90天设置更长的duration会被自动截断4.3 监控与告警建议配置Prometheus监控以下关键指标- alert: CertificateExpiringSoon expr: certmanager_certificate_expiration_timestamp_seconds - time() 86400 * 30 for: 5m labels: severity: warning annotations: summary: Certificate expiring soon (instance {{ $labels.instance }}) description: Certificate {{ $labels.name }} will expire in 30 days5. 故障排查指南遇到证书签发问题时按以下步骤排查检查Issuer状态kubectl get issuer,clusterissuer -o wide查看Certificate事件kubectl describe certificate name检查Order资源ACME专用kubectl get orders.acme.cert-manager.io查看Pod日志kubectl logs -n cert-manager deploy/cert-manager常见问题解决方案错误现象可能原因解决方案Issuer状态不健康网络策略限制检查到CA服务器的网络连通性ACME验证失败DNS配置错误确认域名解析指向正确Ingress证书未自动续期renewBefore设置过大调整为小于证书有效期的1/3Secret未生成RBAC权限不足检查ServiceAccount权限在Kubernetes集群中实施cert-manager后我们的某个生产系统证书管理时间从每月40人时降至接近零同时彻底消除了因证书过导致的服务中断事故。最令人惊喜的是当需要将服务迁移到新集群时只需重新部署相同的Certificate资源定义所有证书都会自动重新签发和配置极大提升了环境一致性。