Cert-Manager K8S SSL 证书管理教程

Cert-Manager 是 Kubernetes 集群中最流行的证书管理控制器,能够自动从 Let's Encrypt、HashiCorp Vault 等多种来源申请和续期 SSL/TLS 证书。它将证书管理完全融入 Kubernetes 的声明式工作流,让 SSL 证书的生命周期管理变得自动化和透明。本文将介绍如何在搬瓦工 VPS 上的 K8S 集群中部署和使用 Cert-Manager。

一、前置条件

  • Kubernetes 集群:已部署的 K8S 集群(可以是 K3s、MicroK8s 等轻量方案)。
  • kubectl:已配置并可以访问集群。
  • Helm 3:推荐使用 Helm 安装 Cert-Manager。
  • Ingress Controller:如 Nginx Ingress 或 Traefik。
  • 域名:已指向搬瓦工 VPS IP 的域名。

如果尚未购买 VPS,可以参考搬瓦工全部方案选购,使用优惠码 NODESEEK2026 享受 6.77% 折扣。

二、安装 Cert-Manager

2.1 使用 Helm 安装

# 添加 Jetstack Helm 仓库
helm repo add jetstack https://charts.jetstack.io
helm repo update

# 安装 Cert-Manager
helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set crds.enabled=true

2.2 使用 kubectl 安装

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml

2.3 验证安装

kubectl get pods -n cert-manager
kubectl get crd | grep cert-manager

确认三个 Pod(cert-manager、cert-manager-cainjector、cert-manager-webhook)都处于 Running 状态。

三、配置 Issuer

Issuer 定义了证书的来源和验证方式。有两种类型:Issuer(命名空间级别)和 ClusterIssuer(集群级别)。

3.1 Let's Encrypt Staging Issuer(测试用)

cat << 'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: your@email.com
    privateKeySecretRef:
      name: letsencrypt-staging-key
    solvers:
    - http01:
        ingress:
          class: nginx
EOF

3.2 Let's Encrypt Production Issuer

cat << 'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your@email.com
    privateKeySecretRef:
      name: letsencrypt-prod-key
    solvers:
    - http01:
        ingress:
          class: nginx
EOF

3.3 DNS01 验证(支持通配符证书)

# 先创建 Cloudflare API Token Secret
kubectl create secret generic cloudflare-api-token \
  --namespace cert-manager \
  --from-literal=api-token=YOUR_CF_API_TOKEN

cat << 'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-dns
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: your@email.com
    privateKeySecretRef:
      name: letsencrypt-dns-key
    solvers:
    - dns01:
        cloudflare:
          apiTokenSecretRef:
            name: cloudflare-api-token
            key: api-token
EOF

3.4 检查 Issuer 状态

kubectl get clusterissuer
kubectl describe clusterissuer letsencrypt-prod

四、申请证书

4.1 通过 Certificate 资源申请

cat << 'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: example-com-tls
  namespace: default
spec:
  secretName: example-com-tls-secret
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  dnsNames:
  - example.com
  - www.example.com
EOF

4.2 通过 Ingress 注解自动申请

cat << 'EOF' | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - example.com
    - www.example.com
    secretName: example-com-tls-secret
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: my-service
            port:
              number: 80
EOF

4.3 申请通配符证书

cat << 'EOF' | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: wildcard-example-com
  namespace: default
spec:
  secretName: wildcard-example-com-tls
  issuerRef:
    name: letsencrypt-dns
    kind: ClusterIssuer
  dnsNames:
  - example.com
  - "*.example.com"
EOF

五、查看证书状态

# 查看证书列表
kubectl get certificates

# 查看证书详情
kubectl describe certificate example-com-tls

# 查看证书签发请求
kubectl get certificaterequests

# 查看 ACME 验证状态
kubectl get challenges
kubectl get orders

# 查看证书 Secret
kubectl get secret example-com-tls-secret -o yaml

六、自动续期

Cert-Manager 默认在证书到期前 30 天自动续期。可以通过 Certificate 资源自定义续期策略:

spec:
  renewBefore: 720h  # 到期前 30 天续期
  duration: 2160h    # 证书有效期 90 天

七、故障排查

# 查看 Cert-Manager 日志
kubectl logs -n cert-manager deployment/cert-manager -f

# 查看证书事件
kubectl describe certificate example-com-tls

# 查看 Challenge 状态
kubectl describe challenge -l cert-manager.io/certificate-name=example-com-tls

# 常见问题检查清单
kubectl get clusterissuer -o wide
kubectl get certificate -o wide
kubectl get certificaterequest -o wide
kubectl get order -o wide
kubectl get challenge -o wide

八、常见问题

证书一直处于 Pending 状态

检查 Issuer 配置和 Challenge 状态,确保 HTTP01 验证可以从外网访问到 Ingress 控制器。

DNS01 验证失败

确认 DNS API 凭据正确,并且 API Token 有修改 DNS 记录的权限。

速率限制

先使用 staging Issuer 测试,确认无误后再切换到 production。Let's Encrypt 的 production 环境有严格的速率限制。

总结

Cert-Manager 让 Kubernetes 环境中的 SSL 证书管理变得完全自动化,通过声明式配置即可实现证书的申请、安装和续期。对于非 K8S 环境,可以使用 acme.sh 管理 SSL 证书。选购搬瓦工 VPS 请查看全部方案,使用优惠码 NODESEEK2026 可享受折扣。相关问题可通过搬瓦工官网提交工单咨询。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。