目录

背景:

第一步:进入 Master 节点,找到可用的 kubeconfig(大部分没有管理员权限)

第二步:查找已绑定 cluster-admin 的 ServiceAccount

第三步:提取该 ServiceAccount 的 Token

第四步:获取集群 CA 证书(Base64 格式)

第五步:获取 API Server 地址

第六步:生成 admin kubeconfig 文件

第七步:验证生成的 kubeconfig

第八步:将生成的config文件设置为默认


背景:

Rancher近期频繁出现故障且暂时无法恢复,但需要紧急运维下游Kubernetes集群。由于Master主机缺少具有admin权限的kubeconfig文件,导致无法通过kubectl全功能操作集群。

第一步:进入 Master 节点,找到可用的 kubeconfig(大部分没有管理员权限)

# 进入证书目录
cd /etc/kubernetes/ssl/
# 列出可用的 kubeconfig 文件,找到yes的文件进行下一步
ls -1 /etc/kubernetes/ssl/ | grep yaml | xargs -I {}  kubectl --kubeconfig {} auth can-i create serviceaccounts --all-namespaces

第二步:查找已绑定 cluster-admin 的 ServiceAccount

# 查看所有 clusterrolebindings,找到绑定了 cluster-admin 的 ServiceAccount
kubectl --kubeconfig (第一部确定yes的yaml文件) get clusterrolebindings -o wide | grep -i cluster-admin
# 本次使用:(关键点在于 xxx-engine 这个 ServiceAccount 已经被绑定了 cluster-admin 角色。)
xxx-xxx-default-xxx                ClusterRole/cluster-admin                                          2y133d                                                                                   cattle-system/xxx-engine

第三步:提取该 ServiceAccount 的 Token

# 设置变量(替换为你的 namespace 和 serviceaccount 名称)
NAMESPACE="cattle-system"
SA_NAME="xxx-engine"
# 获取 Secret 名称
SECRET_NAME=$(kubectl --kubeconfig (第一部确定yes的yaml文件) get sa $SA_NAME -n $NAMESPACE -o jsonpath='{.secrets[0].name}')
# 提取并解码 Token
TOKEN=$(kubectl --kubeconfig (第一部确定yes的yaml文件) get secret $SECRET_NAME -n $NAMESPACE -o jsonpath='{.data.token}' | base64 -d)
# 验证 Token 不为空
echo $TOKEN

第四步:获取集群 CA 证书(Base64 格式)

# 先确认 CA_DATA 是否正确
kubectl --kubeconfig (第一部确定yes的yaml文件) config view --minify -o jsonpath='{.clusters[0].cluster.certificate-authority}'
# 输出示例:
/etc/kubernetes/ssl/kube-ca.pem
# 后进行赋值:
CA_DATA=$(cat /etc/kubernetes/ssl/kube-ca.pem | base64 | tr -d '\n')
echo $CA_DATA | head -c 100   # 验证不为空

第五步:获取 API Server 地址

# 使用 Master 节点的物理 IP
APISERVER="https://$(hostname -I | awk '{print $1}'):6443"

第六步:生成 admin kubeconfig 文件

cat <<EOF > /root/admin-kubeconfig.yaml
apiVersion: v1
kind: Config
clusters:
- cluster:
    certificate-authority-data: $CA_DATA
    server: $APISERVER
  name: emergency-cluster
contexts:
- context:
    cluster: emergency-cluster
    user: emergency-user
  name: emergency-context
current-context: emergency-context
users:
- name: emergency-user
  user:
    token: $TOKEN
EOF

第七步:验证生成的 kubeconfig

# 测试能否列出节点
kubectl --kubeconfig /root/admin-kubeconfig.yaml get nodes

# 测试权限
kubectl --kubeconfig /root/admin-kubeconfig.yaml auth can-i '*' '*' --all-namespaces

# 如果返回 yes,说明成功!

第八步:将生成的config文件设置为默认

# 创建默认目录
mkdir -p /root/.kube/
# 转入刚才生成的配置文件
cp /root/admin-kubeconfig.yaml /root/.kube/config
# 测试权限
kubectl  auth can-i '*' '*' --all-namespaces
# 如果返回 yes,说明成功!


 

更多推荐