用 cert-manager 自动签发和续期证书

适用场景

Kubernetes 中的 Ingress、Gateway 和内部服务需要大量 TLS 证书,手工申请和续期容易过期。cert-manager 可以从 Let's Encrypt、内部 CA 或 Vault 自动签发证书。

前置条件

步骤

  1. 安装 cert-manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml
kubectl -n cert-manager rollout status deploy/cert-manager
kubectl -n cert-manager rollout status deploy/cert-manager-webhook
  1. 创建 ACME ClusterIssuer(HTTP-01):
kubectl apply -f - <<'EOF'
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: ops@example.com
    privateKeySecretRef:
      name: letsencrypt-prod-account
    solvers:
    - http01:
        ingress:
          class: nginx
EOF
  1. 泛域名或内网域名使用 DNS-01。以 Route53 为例,使用 IRSA 或 Access Key Secret:
kubectl apply -f - <<'EOF'
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dns
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: ops@example.com
    privateKeySecretRef:
      name: letsencrypt-dns-account
    solvers:
    - dns01:
        route53:
          region: ap-east-1
EOF
  1. 在 Ingress 上引用 issuer:
kubectl annotate ingress demo \
  cert-manager.io/cluster-issuer=letsencrypt-prod
  1. 或直接创建 Certificate 资源,便于非 Ingress 场景使用:
kubectl apply -f - <<'EOF'
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: demo-tls
  namespace: demo
spec:
  secretName: demo-tls
  dnsNames:
  - demo.example.com
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
EOF

验证

回滚

常见坑

相关命令