cert-manager 与 Ingress 配合可自动完成 ACME 域名验证、证书签发及续期,并将 TLS 证书注入 Ingress 指定 Secret;需确保 Ingress Controller、cert-manager(v1.8+)和 DNS 解析就绪,通过 ClusterIssuer 配置 Let's Encrypt,Ingress 中声明 cluster-issuer 注解和 TLS 块,cert-manager 自动创建并更新 secret。

Ingress 和 cert-manager 配合实现证书自动签发,核心是让 cert-manager 通过 ACME 协议完成域名验证,并把签好的 TLS 证书注入到 Ingress 资源中。整个流程不依赖人工干预,证书到期前会自动续期。
1. 前提条件必须到位
确保以下三样已部署并正常运行:
- Ingress Controller(推荐 nginx-ingress,且版本 ≥ 1.0,支持 TLS 插件)
- cert-manager(v1.8+,已安装 CRD 并在 cert-manager 命名空间运行)
- 你的域名 DNS 已正确解析到 Ingress Controller 的 Service(通常是 LoadBalancer 或 NodePort 暴露的 IP)
2. 创建 ClusterIssuer(对接 Let's Encrypt)
用 ClusterIssuer(全局可用)而非 Issuer(仅限单 namespace),便于统一管理。区分测试环境和生产环境:
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 先用 staging 环境测试流程(
acme-staging-v02.api.letsencrypt.org),避免触发 Let's Encrypt 的速率限制 - 确认无误后,再部署
letsencrypt-prod,使用正式地址acme-v02.api.letsencrypt.org - HTTP-01 校验需指定 ingress class(如
nginx),cert-manager 会自动创建临时 Ingress 规则用于应答挑战
3. 在 Ingress 中启用自动 TLS
不需要手动准备证书 Secret。只需在 Ingress YAML 中添加两处关键配置:
-
注解:
cert-manager.io/cluster-issuer: letsencrypt-prod(引用上一步定义的颁发者) - TLS 块:声明 host 和 secretName(cert-manager 会自动创建并更新该 Secret)
示例片段:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- app.example.com
secretName: app-tls-secret # cert-manager 自动创建/更新
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: myapp-svc
port:
number: 804. 验证与排错要点
证书不是立即生效,通常需要 1–3 分钟。可按顺序检查:
- 运行
kubectl get clusterissuers,orders,challenges -A,确认状态为Ready或Valid - 查看对应 namespace 下的 Secret:
kubectl get secret app-tls-secret,确认有tls.crt和tls.key - Ingress 事件:
kubectl describe ingress myapp,留意是否有Successfully issued a certificate - 若卡在
Pending,大概率是域名未解析、Ingress Controller 未就绪,或 HTTP-01 挑战路径被防火墙/CDN 拦截(确保/.well-known/acme-challenge/可公开访问)

















