需借助cert-manager实现ingress自动加载https证书:先用helm部署cert-manager v1.14.4并安装crds,再配置clusterissuer对接let’s encrypt生产环境,最后通过ingress注解或独立certificate资源触发自动签发与注入,nginx控制器5~10秒内自动重载证书。

在Kubernetes集群中让Ingress自动加载HTTPS证书,避免每次证书过期手动替换或重启控制器,需要借助cert-manager实现从申请、签发到注入Ingress的全链路闭环。
安装cert-manager
执行官方Helm命令一键部署最新稳定版(v1.14+):
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.14.4 --set installCRDs=true
这一步必须成功,否则后续所有证书流程都无法触发。部署后等待cert-manager-webhook Pod就绪,用kubectl get pods -n cert-manager确认状态为Running。
配置Let’s Encrypt颁发者
创建ClusterIssuer资源,声明使用Let’s Encrypt生产环境ACME服务:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
email: admin@example.com
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
注意:email字段必须真实可用,Let’s Encrypt会通过该邮箱发送到期提醒;【server地址不能写错,测试环境用acme-staging,生产务必用acme-v02】。
为Ingress自动绑定证书
方法一:通过Ingress注解触发证书申请
在Ingress YAML中添加两行关键注解:
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
同时确保spec.tls段已声明host和secretName,例如:
tls:
- hosts:
- app.example.com
secretName: app-tls-secret
cert-manager会监听该Ingress,发现未就绪的secretName后,自动创建Certificate资源并完成ACME挑战。
方法二:显式定义Certificate资源(更可控)
单独创建Certificate对象,精准控制域名、有效期与命名空间:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: app-tls-cert
namespace: default
spec:
secretName: app-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- app.example.com
此方式下,Ingress只需引用app-tls-secret即可,无需注解驱动,适合多Ingress复用同一证书的场景。
验证证书是否自动加载
第一步:检查Certificate资源状态
kubectl get certificate -n default
看到STATUS为Ready,且AGE非0,说明证书已签发成功。
第二步:确认Secret是否生成
kubectl get secret app-tls-secret -n default
Secret存在且Age大于0,data中包含tls.crt和tls.key字段,即表示证书已注入。
第三步:触发Ingress控制器重载
cert-manager不会主动通知Ingress控制器刷新,但NGINX Ingress Controller会自动轮询Secret变更——只要Secret内容更新,【5~10秒内】就会重新加载证书,无需人工干预或重启Pod。
第四步:用OpenSSL验证实际响应
openssl s_client -connect app.example.com:443 -servername app.example.com 2>/dev/null | openssl x509 -noout -dates
输出显示notAfter日期为未来90天左右,即证明Let’s Encrypt证书已生效且由cert-manager自动管理。











