rancher故障暂时没办法恢复,下游k8s集群如何获取config文件
·
目录
第一步:进入 Master 节点,找到可用的 kubeconfig(大部分没有管理员权限)
第二步:查找已绑定 cluster-admin 的 ServiceAccount
第三步:提取该 ServiceAccount 的 Token
背景:
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,说明成功!
更多推荐
所有评论(0)