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 命令自动完成;对于手动管理的集群,需按以下步骤操作:
- 生成新私钥:使用
openssl genrsa或ecparam生成 RSA 2048 或 ECDSA P-256 私钥。 - 创建 CSR 配置文件:确保 SAN(Subject Alternative Name)包含 API Server 的 Service IP、Cluster IP、DNS 名称等。
- 使用 CA 签发证书:指定有效期(通常 1 年),输出 PEM 格式证书文件。
- 验证证书链:使用
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 图展示了证书轮换前四项准备工作的执行顺序与依赖关系:
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" |
最佳实践:将上述检查清单写入自动化脚本,每次轮换前自动执行并生成报告。如果任何检查项失败,立即中止轮换流程,排查问题后再继续。