从Rancher崩溃中恢复Kubernetes集群访问权限:完整kubeconfig恢复指南
当Rancher管理平台崩溃且找不到原始部署服务器时,不必惊慌------只要集群核心组件健康,你仍能恢复对Kubernetes集群的完全控制。本文将带你一步步重建管理员权限。
问题背景
在生产环境中,Rancher作为Kubernetes集群管理平台,提供了便捷的集群操作界面。然而,当Rancher服务崩溃且无法找到原始的RKE部署服务器时,许多管理员会面临失去集群访问权限的困境。
幸运的是,只要满足以下关键条件,集群访问权限完全可以恢复:
- ✅ kube-ca.pem:集群CA证书存在
- ✅ kube-ca-key.pem:集群CA私钥存在(最关键)
- ✅ apiserver正常运行:能够通过kubectl访问
- ✅ etcd正常运行:集群数据存储健康
- ❌ Rancher不可用:仅影响管理界面,不影响集群本身
恢复原理
Kubernetes的身份认证基于证书体系。当Rancher不可用时,我们可以利用集群的CA证书和私钥,签发新的管理员证书,从而创建具有完全权限的kubeconfig文件。这种方法不依赖于Rancher,而是直接与Kubernetes的证书体系交互。
⚠️ 注意事项
- 这个恢复步骤不会影响现有集群或集群运行的服务
- 生成的证书有效期 10 年(3650 天),可根据需求调整
- 强烈建议 备份
/root/kubeconfig_recover/
完整恢复步骤
第1步:准备工作
首先,在master节点上创建专用工作目录:
bash
# 创建存放目录
mkdir -p /root/kubeconfig_recover
cd /root/kubeconfig_recover
第2步:生成新的管理员私钥
使用OpenSSL生成一个2048位的RSA私钥:
bash
# 生成新的管理员私钥
openssl genrsa -out kube-recover-admin.key 2048
第3步:创建证书签名请求(CSR)
为新的管理员用户创建CSR,特别注意CN和O字段的设置:
bash
# 生成CSR,CN = kube-recover-admin, O=system:masters
openssl req -new \
-key kube-recover-admin.key \
-out kube-recover-admin.csr \
-subj "/CN=kube-recover-admin/O=system:masters"
关键说明:
CN=kube-recover-admin:指定用户名为kube-recover-adminO=system:masters:将用户添加到system:masters组,这是Kubernetes内置的超级用户组
第4步:使用集群CA签发证书
假设CA文件位于/etc/kubernetes/ssl/目录,使用现有CA签发管理员证书:
bash
# 用现有kube-ca.pem和kube-ca-key.pem签发证书
openssl x509 -req \
-in kube-recover-admin.csr \
-CA /etc/kubernetes/ssl/kube-ca.pem \
-CAkey /etc/kubernetes/ssl/kube-ca-key.pem \
-CAcreateserial \
-out kube-recover-admin.pem \
-days 3650
注意: 如果CA文件位置不同,请相应调整路径。
第5步:构建kubeconfig文件
现在使用生成的证书创建完整的kubeconfig文件:
bash
# 设置APISERVER地址(根据你的环境调整)
APISERVER=https://173.80.616.65:6443
KUBECONFIG_FILE=/root/kubeconfig_recover/recover.kubeconfig
# 设置cluster配置
kubectl config --kubeconfig=$KUBECONFIG_FILE set-cluster rke-cluster \
--server=$APISERVER \
--certificate-authority=/etc/kubernetes/ssl/kube-ca.pem \
--embed-certs=true
# 设置user配置
kubectl config --kubeconfig=$KUBECONFIG_FILE set-credentials recover-admin \
--client-certificate=/root/kubeconfig_recover/kube-recover-admin.pem \
--client-key=/root/kubeconfig_recover/kube-recover-admin.key \
--embed-certs=true
# 设置context配置
kubectl config --kubeconfig=$KUBECONFIG_FILE set-context recover \
--cluster=rke-cluster \
--user=recover-admin
# 使用新创建的context
kubectl config --kubeconfig=$KUBECONFIG_FILE use-context recover
第6步:验证与使用
设置环境变量并验证恢复是否成功:
bash
# 设置环境变量,立即生效
export KUBECONFIG=$KUBECONFIG_FILE
# 验证权限
echo "验证当前用户身份:"
kubectl auth whoami
echo -e "\n验证节点状态:"
kubectl get nodes
echo -e "\n验证所有命名空间的Pod:"
kubectl get pods -A
echo -e "\n测试具体操作(例如重启deployment):"
kubectl rollout restart deployment uni-log
自动化恢复脚本
为了简化操作,你可以创建以下自动化脚本:
bash
#!/bin/bash
# save as: recover_kubeconfig.sh
set -e
# 配置变量
WORKDIR="/root/kubeconfig_recover"
CA_DIR="/etc/kubernetes/ssl"
APISERVER="https://173.80.616.65:6443"
# 创建目录
mkdir -p $WORKDIR
cd $WORKDIR
echo "=== 开始恢复kubeconfig ==="
# 1. 生成私钥
echo "1. 生成管理员私钥..."
openssl genrsa -out kube-recover-admin.key 2048
# 2. 生成CSR
echo "2. 生成证书签名请求..."
openssl req -new \
-key kube-recover-admin.key \
-out kube-recover-admin.csr \
-subj "/CN=kube-recover-admin/O=system:masters"
# 3. 签发证书
echo "3. 使用集群CA签发证书..."
openssl x509 -req \
-in kube-recover-admin.csr \
-CA $CA_DIR/kube-ca.pem \
-CAkey $CA_DIR/kube-ca-key.pem \
-CAcreateserial \
-out kube-recover-admin.pem \
-days 3650
# 4. 创建kubeconfig
echo "4. 创建kubeconfig文件..."
KUBECONFIG_FILE="$WORKDIR/recover.kubeconfig"
kubectl config --kubeconfig=$KUBECONFIG_FILE set-cluster rke-cluster \
--server=$APISERVER \
--certificate-authority=$CA_DIR/kube-ca.pem \
--embed-certs=true
kubectl config --kubeconfig=$KUBECONFIG_FILE set-credentials recover-admin \
--client-certificate=$WORKDIR/kube-recover-admin.pem \
--client-key=$WORKDIR/kube-recover-admin.key \
--embed-certs=true
kubectl config --kubeconfig=$KUBECONFIG_FILE set-context recover \
--cluster=rke-cluster \
--user=recover-admin
kubectl config --kubeconfig=$KUBECONFIG_FILE use-context recover
# 5. 输出结果
echo "5. 恢复完成!"
echo "生成的kubeconfig文件: $KUBECONFIG_FILE"
echo ""
echo "使用方法:"
echo " export KUBECONFIG=$KUBECONFIG_FILE"
echo " kubectl get nodes"
echo ""
echo "或直接使用:"
echo " kubectl --kubeconfig=$KUBECONFIG_FILE get nodes"
安全建议与最佳实践
-
备份关键文件:
bash# 备份CA证书和私钥 mkdir -p /backup/kubernetes-ca cp /etc/kubernetes/ssl/kube-ca.pem /backup/kubernetes-ca/ cp /etc/kubernetes/ssl/kube-ca-key.pem /backup/kubernetes-ca/ -
限制CA私钥访问:
bash# 确保CA私钥只有root可读 chmod 600 /etc/kubernetes/ssl/kube-ca-key.pem -
创建多个管理员证书 :
建议为不同管理员创建不同的证书,便于审计和权限回收。
-
定期轮换证书 :
虽然我们设置了3650天有效期,但建议定期轮换管理员证书。
故障排除
常见问题1:CA证书路径不正确
text
错误:找不到/etc/kubernetes/ssl/kube-ca.pem
解决方案:查找CA证书的实际位置
bash
find / -name "kube-ca.pem" 2>/dev/null
常见问题2:apiserver地址错误
text
错误:无法连接到服务器
解决方案:确认apiserver地址
bash
# 查看当前kubeconfig中的server地址
kubectl config view --minify | grep server
# 或者检查kubelet配置
cat /etc/kubernetes/ssl/kubecfg-kube-node.yaml | grep server
常见问题3:证书格式错误
text
错误:无法加载证书
解决方案:验证证书格式
bash
# 验证证书
openssl x509 -in kube-recover-admin.pem -text -noout
# 验证私钥
openssl rsa -in kube-recover-admin.key -check
总结
通过上述步骤,即使Rancher完全不可用,只要集群CA证书和私钥存在,并且apiserver正常运行,我们就能恢复对Kubernetes集群的完全控制。这种方法不依赖于任何外部管理系统,直接利用Kubernetes原生的证书认证机制,是最可靠的后备恢复方案。
记住,预防胜于治疗。定期备份CA证书和私钥,建立多套管理凭证,确保在管理平台故障时,仍能保持对生产环境的控制能力。
