You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在裸金属Kubernetes集群通过cert-manager实现Let's Encrypt证书自动续期

嘿,既然你已经搭好了K8s集群和Nginx Ingress,那咱们接下来一步步搞定cert-manager配置,实现TLS自动续期的目标:

1. 安装cert-manager

考虑到你的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,就说明安装没问题了。

2. 配置Let's Encrypt证书颁发者

咱们用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就行。

3. 修改Ingress资源启用TLS终止

现在要给你的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
4. 验证证书颁发与自动续期

检查证书状态

执行下面的命令,查看证书是否成功颁发:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:20:03