K8s 证书管理:使用 cert-manager 自动续期集群证书

在 Kubernetes(K8s)集群中,证书(如 API 服务器证书、kubelet 证书)用于身份验证和加密通信。证书过期会导致集群故障,例如 API 服务器不可访问。手动管理证书续期繁琐且易出错,因此使用 cert-manager 自动化续期是推荐方案。cert-manager 是一个 Kubernetes 附加组件,支持从 Let's Encrypt 等颁发机构自动获取、更新和续期证书。下面我将逐步指导您实现自动续期,确保集群高可用。

步骤 1: 安装 cert-manager

cert-manager 可以通过 Helm 或 kubectl 安装。推荐使用 Helm(需提前安装 Helm)。以下是安装步骤:

  1. 添加 cert-manager Helm 仓库:
    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    

  2. 安装 cert-manager(使用最新版本,如 v1.11):
    helm install cert-manager jetstack/cert-manager \
      --namespace cert-manager \
      --create-namespace \
      --version v1.11.0 \
      --set installCRDs=true
    

  3. 验证安装:
    kubectl get pods -n cert-manager
    

    所有 Pod 应显示为 Running 状态。
步骤 2: 配置证书颁发者(Issuer)

cert-manager 需要定义 Issuer 或 ClusterIssuer 资源来指定证书颁发机构。这里以 Let's Encrypt(免费且常用)为例,使用 HTTP-01 挑战验证域名所有权。创建 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  # 生产环境 URL
    email: your-email@example.com  # 替换为您的邮箱
    privateKeySecretRef:
      name: letsencrypt-prod-account-key
    solvers:
    - http01:
        ingress:
          class: nginx  # 替换为您的 Ingress 控制器类,如 traefik

应用配置:

kubectl apply -f cluster-issuer.yaml

步骤 3: 创建证书资源(Certificate)

定义 Certificate 资源来指定要自动续期的证书。cert-manager 会自动监控证书有效期,并在到期前续期(例如,默认在到期前 $30$ 天触发)。以下示例为集群内服务创建证书:

# cluster-certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: cluster-tls
  namespace: default  # 替换为您的命名空间
spec:
  secretName: cluster-tls-secret  # 证书存储的 Secret 名称
  duration: 2160h  # 证书有效期,设为 $90$ 天(默认值)
  renewBefore: 720h  # 提前 $30$ 天续期
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  commonName: my-cluster.example.com  # 替换为您的域名
  dnsNames:
  - my-cluster.example.com

应用配置:

kubectl apply -f cluster-certificate.yaml

步骤 4: 验证自动续期机制

cert-manager 会自动处理续期。以下是验证步骤:

  1. 检查证书状态:
    kubectl describe certificate cluster-tls -n default
    

    输出中应显示 Ready: True 和续期事件。
  2. 查看证书有效期:
    kubectl get secret cluster-tls-secret -n default -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -dates
    

    输出应显示有效期(如 $90$ 天后到期)。
  3. 监控续期日志:
    kubectl logs -l app.kubernetes.io/instance=cert-manager -n cert-manager --tail=50
    

    查找续期相关事件,如 Certificate scheduled for renewal
步骤 5: 注意事项和故障排除
  • 常见问题
    • 证书续期失败:检查 Issuer 配置(如邮箱或域名是否正确),确保 Ingress 控制器支持 HTTP-01 挑战。
    • 网络问题:确保集群能访问 Let's Encrypt 服务器。
    • 资源冲突:避免多个 Certificate 资源使用相同 Secret 名称。
  • 最佳实践
    • 使用 ClusterIssuer 而非 Issuer,简化集群级管理。
    • 设置 renewBefore 为 $30$ 天,提供缓冲时间。
    • 定期备份证书 Secret(如使用 Velero)。
  • 安全提示:使用生产环境 Issuer(如 acme-v02.api.letsencrypt.org),而非测试环境(acme-staging-v02)。
总结

通过 cert-manager 实现自动证书续期,能有效预防集群故障(证书过期风险降至接近 $0$)。整个过程自动化,减少手动干预。建议监控 cert-manager 日志和证书状态,确保集群长期稳定运行。如果您有特定集群配置问题,可提供更多细节进一步探讨。

更多推荐