必须通过 cert-manager 对接 let’s encrypt 实现自动签发与续期 https 证书;需满足集群版本≥v1.20、域名解析正确、80/443端口可达等前提;使用 helm 安装 cert-manager 并配置 clusterissuer;最后通过 certificate 资源或 ingress 注解申请并绑定证书。

在 Kubernetes 集群中让服务自动拥有有效 HTTPS 证书,必须通过 cert-manager 对接 Let’s Encrypt 实现签发与续期,手动替换证书不仅无法应对滚动更新和扩缩容,还会在证书过期时导致服务中断。
确认集群与域名前提条件
确保 Kubernetes 集群版本 ≥ v1.20,kubectl 可正常访问集群;你的域名(如 app.example.com)已解析到集群 Ingress Controller 的公网 IP 或 LoadBalancer 地址;80 和 443 端口对外可达——这是 HTTP-01 验证的硬性要求,【若端口被防火墙拦截或 NAT 映射未配置,验证必然失败】;同时需安装 Helm v3+ 工具。
用 Helm 安装 cert-manager 控制器
执行以下命令依次完成仓库添加、索引更新与部署:
helm repo add jetstack https://charts.jetstack.io → helm repo update → kubectl create namespace cert-manager → helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.14.4 --set installCRDs=true
安装后运行 kubectl get pods -n cert-manager,所有 Pod 必须显示 READY 1/1 且 STATUS 为 Running。若出现 CrashLoopBackOff,请先检查 CRD 是否已成功创建(kubectl get crd | grep cert-manager)。
配置 ClusterIssuer 对接 Let’s Encrypt
ClusterIssuer 是全局生效的签发策略,适用于任意命名空间下的证书申请。创建 cluster-issuer.yaml 文件:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
注意:ingress.class 值必须与你集群中实际使用的 Ingress Controller 类型严格一致——如用 Traefik 就写 traefik,用 ALB 就写 alb,写错会导致 ACME 挑战路径无法注入,证书永远处于 Pending 状态。
执行 kubectl apply -f cluster-issuer.yaml 后,用 kubectl get clusterissuers -o wide 查看 READY 列是否为 True。
为指定服务申请并绑定证书
方法一:直接在服务所在命名空间中创建 Certificate 资源
新建 certificate.yaml,将 example.com 替换为你的域名,namespace 改为你服务所在的命名空间:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: app-tls
namespace: default
spec:
secretName: app-tls-secret
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- example.com
- www.example.com
执行 kubectl apply -f certificate.yaml,几秒后运行 kubectl get certificate -n default,STATUS 应变为 Ready。
方法二:通过 Ingress 注解自动触发证书申请
在已有 Ingress 资源中添加注解:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
并在 spec.tls 下声明 host 与 secretName:
tls:
- hosts:
- example.com
- www.example.com
secretName: app-tls-secret
cert-manager 会监听该 Ingress,自动创建 Certificate 资源并填充 secretName 所指的 Secret。这一步无需单独创建 Certificate 对象,适合已有 Ingress 的场景。











