Rancher K8S 集群恢复丢失的 kubeconfig 配置文件 | 字数总计: 798 | 阅读时长: 4分钟 | 阅读量:
本文永久链接: https://www.xtplayer.cn/rancher/restore-kubecfg/
分析 Rancher UI 生成的 kubeconfig 文件可以发现,第一个 server
对应的是 Rancher Server 的 url 或者 IP
。当 kubectl 访问 K8S API SERVER
的时候,请求是先发送到 Rancher,然后再通过 cluster agent
转发给 K8S API SERVER
。
在 Rancher v2.2.2 以前的版本,Rancher UI 生成的 kubecfg 文件中只设置了一个 server
。从 Rancher v2.2.2 开始,从 Rancher UI 创建的集群默认开启授权集群访问地址
。创建好集群后 Rancher UI 生成的 kubecfg 文件中将显示多个 master 节点 IP 对应的 server
。
因此,Rancher v2.2.2
以及之后版本通过 Rancher UI 创建的集群,如果 Rancher Server 无法访问,那么可以通过 kubectl --kubeconfig=xxx --context=xxx
来切换 server
,但是前提是需要提前从 Rancher UI 保存 kubeconfig 文件。
如果 Rancher Server 无法访问,对于 Rancher v2.2.2
之前的版本或者未提前保存 kubeconfig 的,可通过以下脚本找回 kube-admin
配置文件。
注意: 以下脚本需要在业务集群上执行,任意一个节点即可。保存以下文本为 restore-kube-config.sh
#!/bin/bash help (){ echo ' ================================================================ ' echo ' --master-ip: 指定 Master 节点 IP,任意一个 K8S Master 节点 IP 即可。' echo ' 使用示例:bash restore-kube-config.sh --master-ip=1.1.1.1 ' echo ' ================================================================' } case "$1 " in -h|--help ) help ; exit ;; esac if [[ $1 == '' ]]; then help ; exit ; fi CMDOPTS="$*" for OPTS in $CMDOPTS ;do key=$(echo ${OPTS} | awk -F"=" '{print $1}' ) value=$(echo ${OPTS} | awk -F"=" '{print $2}' ) case "$key " in --master-ip) K8S_MASTER_NODE_IP=$value ;; esac done RANCHER_IMAGE=$( docker ps | grep kube-apiserver | awk '{print $2}' ) if [[ -d /etc/kubernetes/ssl ]]; then K8S_SSLDIR=/etc/kubernetes/ssl else echo '/etc/kubernetes/ssl 目录不存在' exit 1 fi DOCKER_COMMAND=$( echo "docker run --rm --entrypoint bash --net=host -v ${K8S_SSLDIR} :/etc/kubernetes/ssl:ro ${RANCHER_IMAGE} " ); KUBECTL_COMMAND=$( echo 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml -n kube-system get' ); if ${DOCKER_COMMAND} -c "${KUBECTL_COMMAND} secrets | grep full-cluster-state > /dev/null" ; then docker run --rm --net=host --entrypoint bash -e K8S_MASTER_NODE_IP=${K8S_MASTER_NODE_IP} \ -v ${K8S_SSLDIR} :/etc/kubernetes/ssl:ro ${RANCHER_IMAGE} \ -c 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml -n kube-system get secret full-cluster-state -o json | \ jq -r .data.\"full-cluster-state\"| base64 -d | \ jq -r .currentState.certificatesBundle.\"kube-admin\".config | \ sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yamlelif ${DOCKER_COMMAND} -c "${KUBECTL_COMMAND} configmap | grep full-cluster-state > /dev/null" ; then docker run --rm --entrypoint bash --net=host -e K8S_MASTER_NODE_IP=${K8S_MASTER_NODE_IP} \ -v ${K8S_SSLDIR} :/etc/kubernetes/ssl:ro ${RANCHER_IMAGE} \ -c 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml -n kube-system get configmap full-cluster-state -o json | \ jq -r .data.\"full-cluster-state\" | \ jq -r .currentState.certificatesBundle.\"kube-admin\".config | \ sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yamlelse docker run --rm --net=host --entrypoint bash -e K8S_MASTER_NODE_IP=${K8S_MASTER_NODE_IP} \ -v ${K8S_SSLDIR} :/etc/kubernetes/ssl:ro ${RANCHER_IMAGE} \ -c 'kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml -n kube-system \ get secret kube-admin -o jsonpath={.data.Config} | base64 --decode | \ sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yamlfi if [[ -s kubeconfig_admin.yaml ]]; then echo '恢复成功,执行以下命令测试:' echo '' echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes" else echo "kubeconfig 恢复失败。" fi