3. 证书轮换前的准备工作:备份集群状态、检查当前证书有效期、确认 kubeconfig 配置、准备新证书

证书轮换是 Kubernetes 集群生命周期中风险最高的操作之一。任何证书过期或配置不一致都可能导致 API Server 拒绝连接、kubelet 无法注册、组件间通信中断。因此,在执行轮换之前,必须完成四项强制性准备工作:备份集群状态、检查当前证书有效期、确认 kubeconfig 配置、准备新证书。以下按标准操作流程展开。

3.1 备份集群状态

备份是证书轮换的第一道防线。一旦新证书签发后出现签名不匹配、SAN 缺失或 CA 不信任等问题,必须能快速回滚到轮换前的状态。备份范围包括:

  • etcd 快照:集群所有资源对象、Secret、ConfigMap 的权威存储。
  • PKI 目录:/etc/kubernetes/pki/ 下的 CA 证书、服务端证书、密钥对。
  • kubeconfig 文件:/etc/kubernetes/admin.conf、controller-manager.conf、scheduler.conf 等。
  • 静态 Pod 清单:/etc/kubernetes/manifests/ 下的 YAML 文件。
备份命令示例(适用于 kubeadm 部署的集群):
# 1. 备份 etcd 快照
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db

# 2. 备份 PKI 目录
cp -r /etc/kubernetes/pki /backup/pki-$(date +%Y%m%d-%H%M%S)

# 3. 备份 kubeconfig 文件
cp /etc/kubernetes/*.conf /backup/kubeconfig-$(date +%Y%m%d-%H%M%S)/

# 4. 备份静态 Pod 清单
cp -r /etc/kubernetes/manifests /backup/manifests-$(date +%Y%m%d-%H%M%S)/
注意:etcd 快照必须使用与集群当前 CA 匹配的证书进行身份验证。如果 CA 已过期,etcdctl 连接会失败,此时应优先使用 --insecure-skip-tls-verify 或通过本地 socket 备份。生产环境建议将备份文件同步到独立存储节点。

3.2 检查当前证书有效期

在轮换前必须精确掌握每张证书的剩余有效期,避免遗漏。Kubernetes 集群中主要证书包括:

证书文件 路径(kubeadm 默认) 用途 默认有效期
CA 证书 /etc/kubernetes/pki/ca.crt 集群根 CA,签发所有组件证书 10 年
API Server 证书 /etc/kubernetes/pki/apiserver.crt API Server 对外 TLS 服务 1 年
kubelet 客户端证书 /var/lib/kubelet/pki/kubelet-client-current.pem kubelet 连接 API Server 1 年
etcd 服务器证书 /etc/kubernetes/pki/etcd/server.crt etcd 集群内部通信 1 年
front-proxy 客户端证书 /etc/kubernetes/pki/front-proxy-client.crt API Server 聚合层代理 1 年

使用以下命令批量检查证书有效期:

# 检查所有 PEM 格式证书的有效期
for cert in /etc/kubernetes/pki/*.crt /etc/kubernetes/pki/etcd/*.crt; do
  echo "=== $cert ==="
  openssl x509 -in "$cert" -noout -dates -subject
done

# 检查 kubelet 客户端证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates

输出示例:

=== /etc/kubernetes/pki/apiserver.crt ===
notBefore=Apr 10 12:00:00 2024 GMT
notAfter=Apr 10 12:00:00 2025 GMT
subject=CN = kube-apiserver

=== /etc/kubernetes/pki/etcd/server.crt ===
notBefore=Apr 10 12:00:00 2024 GMT
notAfter=Apr 10 12:00:00 2025 GMT
subject=CN = etcd-server
建议:将检查结果记录到运维台账中,标记出剩余不足 30 天的证书作为轮换优先级。如果 CA 证书剩余不足 1 年,建议在轮换组件证书的同时更新 CA。

3.3 确认 kubeconfig 配置

kubeconfig 文件中嵌入了客户端证书、CA 证书和私钥的路径或 Base64 数据。轮换证书后,kubeconfig 中的证书数据必须同步更新。确认内容包括:

  • 证书来源:检查 users[*].user.client-certificate-data 或 client-certificate 字段是否指向即将轮换的证书文件。
  • CA 数据:确认 clusters[*].cluster.certificate-authority-data 与当前 CA 证书一致。
  • 上下文绑定:确保 current-context 指向正确的集群和用户。
# 查看当前 kubeconfig 的证书信息
kubectl config view --raw --minify -o jsonpath='{.users[0].user.client-certificate-data}' | base64 -d | openssl x509 -noout -text | grep -E "Subject:|Not Before|Not After"

# 检查 CA 证书指纹是否匹配
openssl x509 -in /etc/kubernetes/pki/ca.crt -noout -fingerprint -sha256
kubectl config view --raw --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d | openssl x509 -noout -fingerprint -sha256

如果指纹不一致,说明 kubeconfig 中的 CA 数据与文件系统中的 CA 不同步,轮换后必须更新 kubeconfig。

3.4 准备新证书

新证书的准备工作包括生成私钥、签发证书、验证证书链。对于 kubeadm 集群,推荐使用 kubeadm certs renew 命令自动完成;对于手动管理的集群,需按以下步骤操作:

  1. 生成新私钥:使用 openssl genrsa 或 ecparam 生成 RSA 2048 或 ECDSA P-256 私钥。
  2. 创建 CSR 配置文件:确保 SAN(Subject Alternative Name)包含 API Server 的 Service IP、Cluster IP、DNS 名称等。
  3. 使用 CA 签发证书:指定有效期(通常 1 年),输出 PEM 格式证书文件。
  4. 验证证书链:使用 openssl verify -CAfile ca.crt 确认新证书与 CA 匹配。
手动签发 API Server 证书示例:
# 1. 生成私钥
openssl genrsa -out apiserver.key 2048

# 2. 创建 CSR 配置文件 (apiserver.conf)
cat > apiserver.conf <
关键检查点:新证书的 SAN 必须包含所有 API Server 的访问地址。遗漏任何 IP 或 DNS 名称都会导致 kubectl 或 kubelet 连接时报 "x509: certificate is valid for ... not ..." 错误。建议在签发前用 openssl req -text -noout -in apiserver.csr 确认 SAN 列表。

3.5 准备工作流程总览

以下 SVG 图展示了证书轮换前四项准备工作的执行顺序与依赖关系:

证书轮换前准备工作流程 备份集群状态 etcd 快照 + PKI 目录 检查证书有效期 openssl 批量检查 确认 kubeconfig 证书数据 + CA 指纹 准备新证书 私钥 + CSR + 签发 验证新证书 证书链 + SAN 检查 说明: 1. 备份必须在任何证书修改之前完成,确保可回滚。 2. 检查有效期和 kubeconfig 可并行执行,结果决定是否需要轮换。 3. 新证书准备完成后必须验证,确认无误后再替换旧证书。

3.6 准备工作检查清单

为降低操作遗漏风险,建议在轮换前逐项确认以下清单:

检查项 验证方法 通过标准
etcd 快照完整性 etcdctl snapshot status 返回 Revision 和总 Key 数量正常
PKI 目录备份 ls -la /backup/pki-*/ 包含 ca.crt、ca.key、所有 .crt/.key 文件
证书剩余有效期 openssl x509 -in <cert> -noout -enddate 所有证书剩余 > 7 天(轮换前)
kubeconfig CA 指纹 对比文件系统 CA 与 kubeconfig 内 CA 的 SHA256 指纹完全一致
新证书 SAN 列表 openssl x509 -in new.crt -noout -text | grep -A1 "Subject Alternative Name" 包含所有 API Server 访问地址
新证书链验证 openssl verify -CAfile ca.crt new.crt 返回 "new.crt: OK"
最佳实践:将上述检查清单写入自动化脚本,每次轮换前自动执行并生成报告。如果任何检查项失败,立即中止轮换流程,排查问题后再继续。