如何在裸金属Kubernetes集群通过cert-manager实现Let's Encrypt证书自动续期
嘿,既然你已经搭好了K8s集群和Nginx Ingress,那咱们接下来一步步搞定cert-manager配置,实现TLS自动续期的目标:
考虑到你的K8s版本是1.9.3,咱们选兼容的v0.7.0版本(这个版本适配1.9+集群)。先创建cert-manager的专属命名空间:
kubectl create namespace cert-manager
然后安装cert-manager组件:
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v0.7.0/cert-manager.yaml
安装完成后,验证pod是否正常运行:
kubectl get pods -n cert-manager
等所有pod状态变成Running,就说明安装没问题了。
咱们用ClusterIssuer(集群级别的颁发者,方便跨命名空间使用),创建一个名为cluster-issuer.yaml的配置文件:
apiVersion: certmanager.k8s.io/v1alpha1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: your-email@example.com # 替换成你的邮箱,证书到期会收到提醒 privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx # 这里要和你的Nginx Ingress的class一致,默认就是nginx
把配置应用到集群:
kubectl apply -f cluster-issuer.yaml
如果是测试环境,建议用Let's Encrypt的staging服务器(避免触发正式环境的速率限制),只需要把server字段改成https://acme-staging-v02.api.letsencrypt.org/directory就行。
现在要给你的Ingress配置加上TLS相关的内容,让cert-manager自动申请证书。假设你原来的Ingress配置是my-ingress.yaml,修改后的内容如下:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-ingress annotations: kubernetes.io/ingress.class: "nginx" certmanager.k8s.io/cluster-issuer: "letsencrypt-prod" # 关联刚才创建的ClusterIssuer spec: tls: - hosts: - your-domain.example.com # 替换成你的实际域名 secretName: my-domain-tls # 证书会自动存在这个Secret里,不用提前创建 rules: - host: your-domain.example.com http: paths: - path: / backend: serviceName: your-service-name # 替换成你的业务Service名称 servicePort: 80 # 替换成Service的端口
应用修改后的Ingress配置:
kubectl apply -f my-ingress.yaml
检查证书状态
执行下面的命令,查看证书是否成功颁发:
kubectl get certificates
如果状态显示Ready,说明证书已经搞定了。
验证TLS访问
用curl测试一下加密连接:
curl -v https://your-domain.example.com
你应该能看到Let's Encrypt的证书信息,连接也会显示是加密的。
自动续期验证
cert-manager默认会在证书到期前30天自动发起续期请求,你可以通过查看cert-manager的日志来确认续期逻辑是否正常:
kubectl logs -n cert-manager -l app=cert-manager -f
- 确保你的域名已经正确解析到Nginx Ingress的外部IP(裸金属集群如果用NodePort,域名要指向集群节点的公网IP;如果用LoadBalancer,指向负载均衡的IP)
- 因为你的K8s版本比较老,不要用太新的cert-manager版本,v0.7.0是经过验证兼容1.9.3的,新版本可能会有API不兼容的问题
- 如果遇到证书颁发失败,先检查Ingress的事件日志:
kubectl describe ingress my-ingress,或者查看cert-manager的日志排查问题
内容的提问来源于stack exchange,提问作者capitannaranja

