【笔记】Kubernetes 中手动及自动化证书更换步骤及注意事项
如果 Kubernetes API 服务器的 TLS 证书过期,会导致客户端(如 kubectl)无法通过安全连接访问集群,需要及时更换证书。以下是 手动更换证书 的通用步骤(适用于非自动证书管理的集群,如 kubeadm 部署的集群)。
一、准备工作
- 备份现有证书证书默认存储在 /etc/kubernetes/pki/ 目录下,先备份旧证书以防万一:
cp -r /etc/kubernetes/pki/ /etc/kubernetes/pki_backup_$(date +%Y%m%d)
- 生成新证书所需的私钥和 CSR(证书签名请求)使用 OpenSSL 生成新的私钥和 CSR(以 API 服务器证书为例):
# 生成私钥
openssl genrsa -out /etc/kubernetes/pki/apiserver.key 2048
# 生成 CSR(需替换以下参数):
# - `commonName (CN)`:通常为 API 服务器的主机名或 IP(如 `kube-apiserver`)
# - `subjectAltName (SAN)`:包含 API 服务器的 IP、主机名、集群内部 DNS 等
openssl req -new \ -key /etc/kubernetes/pki/apiserver.key \ -out /etc/kubernetes/pki/apiserver.csr \ -subj "/CN=kube-apiserver" \ -reqexts SAN \ -config <(cat /etc/ssl/openssl.cnf <(echo "[SAN]")) \ -extensions SAN \ -addext "subjectAltName = DNS:kube-apiserver,DNS:kube-apiserver.kube-system.svc,IP:10.0.0.10,IP:192.168.1.100" # 替换为实际的 SAN 值
注意:subjectAltName 需包含 API 服务器的所有访问地址(如集群内部 IP、负载均衡 IP、DNS 名称等)。
二、生成新证书(两种方式)
方式 1:使用现有 CA 证书签名(推荐)
如果集群原有 CA 证书未过期,可直接用其签名新证书:
# 使用集群 CA 证书签名 API 服务器证书
openssl x509 -req \ -in /etc/kubernetes/pki/apiserver.csr \ -CA /etc/kubernetes/pki/ca.crt \ -CAkey /etc/kubernetes/pki/ca.key \ -CAcreateserial \ -out /etc/kubernetes/pki/apiserver.crt \ -days 3650 # 证书有效期(天),建议设置较长时间
方式 2:重新生成全新 CA 证书(适用于 CA 证书也过期的情况)
如果 CA 证书已过期,需重新生成 CA 及所有组件证书(风险较高,需谨慎操作):
# 生成新 CA 私钥和证书
openssl genrsa -out /etc/kubernetes/pki/ca.key 2048
openssl req -x509 \ -key /etc/kubernetes/pki/ca.key \ -out /etc/kubernetes/pki/ca.crt \ -subj "/CN=Kubernetes-CA" \ -days 3650
# 使用新 CA 签名其他组件证书(如 apiserver、controller-manager、scheduler 等)
# 参考方式 1 的步骤,替换 CA 为新生成的 ca.crt 和 ca.key
三、替换证书并重启服务
- 替换 API 服务器证书将新生成的 apiserver.crt 和 apiserver.key 替换到对应目录:
mv /etc/kubernetes/pki/apiserver.crt{.old,} # 备份旧证书
mv /etc/kubernetes/pki/apiserver.key{.old,}
cp /path/to/new/apiserver.crt /etc/kubernetes/pki/
cp /path/to/new/apiserver.key /etc/kubernetes/pki/
- 重启 kube-apiserver 服务在控制平面节点上执行:
systemctl restart kube-apiserver
systemctl status kube-apiserver # 检查服务状态是否正常
- 更新其他组件的证书(如有需要)如果其他组件(如 kube-controller-manager、kube-scheduler、kubelet、kubeproxy 等)的证书也依赖旧 CA,需同步更新它们的证书,步骤类似 API 服务器。
四、验证证书更新
- 检查证书有效期
openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
确保 notAfter 时间为未来日期。
- 测试客户端连接使用 kubectl 命令验证是否能正常连接集群:
kubectl get nodes
# 若提示权限问题,可能需要更新 kubeconfig 中的 CA 证书(替换为新 ca.crt 的内容)
- 更新 kubeconfig 中的 CA 证书(如果 CA 已更换)如果重新生成了 CA 证书,需将新 ca.crt 内容更新到 kubeconfig(默认路径:~/.kube/config):
kubectl config set-cluster kubernetes \ --certificate-authority=/etc/kubernetes/pki/ca.crt \ --embed-certs=true \ --server=https://<API_SERVER_IP>:6443
五、自动化证书管理(推荐方案)
为避免手动维护证书的复杂性,建议使用 证书自动轮换工具:
- Kubernetes 自带的证书轮换,对于 kubeadm 部署的集群,可启用自动证书更新:
kubeadm alpha certs renew all # 手动触发更新(1.20+ 版本支持自动轮换)
- 使用 cert-manager通过 cert-manager 管理 Kubernetes 内的证书,支持 Let’s Encrypt、自签名等多种类型,实现证书自动申请、更新和续签。
注意事项:
- 生产环境谨慎操作:证书更换可能导致集群短暂中断,建议在维护窗口进行,并提前备份数据。
- 同步多控制平面节点:如果是多 master 集群,需在所有控制节点上执行证书替换和服务重启。
- 监控证书有效期:定期检查证书状态,可通过脚本或工具(如 kubectl cert)设置告警。