从Rancher崩溃中恢复Kubernetes集群访问权限:完整kubeconfig恢复指南

从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的证书体系交互。

⚠️ 注意事项

  1. 这个恢复步骤不会影响现有集群或集群运行的服务
  2. 生成的证书有效期 10 年(3650 天),可根据需求调整
  3. 强烈建议 备份 /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-admin
  • O=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"

安全建议与最佳实践

  1. 备份关键文件

    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/
  2. 限制CA私钥访问

    bash 复制代码
    # 确保CA私钥只有root可读
    chmod 600 /etc/kubernetes/ssl/kube-ca-key.pem
  3. 创建多个管理员证书

    建议为不同管理员创建不同的证书,便于审计和权限回收。

  4. 定期轮换证书

    虽然我们设置了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证书和私钥,建立多套管理凭证,确保在管理平台故障时,仍能保持对生产环境的控制能力。

相关推荐
lichenyang45318 小时前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang45318 小时前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang45318 小时前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事4 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生6 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭6 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美7 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵7 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程