Kubernetes 中的 Ingress、Gateway 和内部服务需要大量 TLS 证书,手工申请和续期容易过期。cert-manager 可以从 Let's Encrypt、内部 CA 或 Vault 自动签发证书。
kubectl。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
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
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
kubectl annotate ingress demo \
cert-manager.io/cluster-issuer=letsencrypt-prod
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
kubectl get certificate -A 显示 READY=True。kubectl describe certificate demo-tls 中签发和续期时间正确。kubectl get challenges,orders 没有长期 Pending。openssl s_client 看到的证书链完整。ingress.class 不一致,HTTP-01 一直 Pending。cert-manager — 控制器与 webhookkubectl — 查看 Certificate、Order、Challengecmctl — 检查证书状态和手动续期openssl — 验证证书链和有效期dig — 检查 DNS-01 TXT 记录