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

相关推荐
無限神樂2 小时前
docker compose简介
运维·docker·容器
Lim小刘2 小时前
深度实践:从“手动排障”到“对话诊断”,构建基于 GenAI 的 K8s 智能运维平台
云原生·容器·kubernetes
-dcr3 小时前
55.k8s核心概念Service
云原生·容器·kubernetes
无级程序员3 小时前
K8S节点磁盘空间不足导致502错误的排除
云原生·容器·kubernetes
Paraverse_徐志斌3 小时前
K8S HPA + KEDA 弹性伸缩消费者解决 MQ 消息积压
容器·kafka·kubernetes·k8s·linq·hpa·keda
迎仔3 小时前
Kubernetes (K8s) 通俗原理解析:算力中心的“超级调度员”
云原生·容器·kubernetes
AC赳赳老秦3 小时前
文旅行业:DeepSeek处理客流数据生成预测模型与调度建议
人工智能·云原生·容器·kubernetes·notepad++·consul·deepseek
Asus.Blogs3 小时前
两个 Docker 容器如何通信?Docker 网络问题完整踩坑与解决指南
网络·docker·容器
linweidong3 小时前
K8s节点保卫战:基于Node Local DNS架构的磁盘自愈系统设计
运维·docker·云原生·容器·架构·kubernetes·k8s