K8s 证书管理:使用 cert-manager 自动续期集群证书(避免过期导致集群故障)
·
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)。以下是安装步骤:
- 添加 cert-manager Helm 仓库:
helm repo add jetstack https://charts.jetstack.io helm repo update - 安装 cert-manager(使用最新版本,如 v1.11):
helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.11.0 \ --set installCRDs=true - 验证安装:
所有 Pod 应显示为kubectl get pods -n cert-managerRunning状态。
步骤 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 会自动处理续期。以下是验证步骤:
- 检查证书状态:
输出中应显示kubectl describe certificate cluster-tls -n defaultReady: True和续期事件。 - 查看证书有效期:
输出应显示有效期(如 $90$ 天后到期)。kubectl get secret cluster-tls-secret -n default -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -dates - 监控续期日志:
查找续期相关事件,如kubectl logs -l app.kubernetes.io/instance=cert-manager -n cert-manager --tail=50Certificate 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 日志和证书状态,确保集群长期稳定运行。如果您有特定集群配置问题,可提供更多细节进一步探讨。
更多推荐
所有评论(0)