本文永久链接: https://www.xtplayer.cn/rancher/save-all-kubecfg/

仅具有用户权限的配置文件

每一个分配集群资源权限的用户,都可以在集群页找到对应的 kubeconfig 配置文件。此 kubectl 配置文件, 仅可以操作自己有权限的资源。

你如果有很多集群有资源权限,并且你想统一保存 kubeconfig 文件,那么可以通过以下脚本来批量保存。

前提要求

需要在运行脚本的主机上安装 jq 工具

  1. centos

    yum install -y jq
  2. ubuntu

    apt-get install jq -y

脚本使用

  1. 生成 API KEY,用于 Rancher UI API 的访问;

    • 切换到全局视图
    • 右上角点击个人头像,接着点击 API & KEY
    • 点击 添加 Key
      • 描述可以随便填写;
      • 自动失效时间建议选择 1 天,一天后自动删除;
      • 作用范围不用选择,默认全部范围;
    • 点击 创建 后复制 Bearer Token 备用
  2. 保存以下内容为任意脚本;

    #/bin/bash

    RANCHER_TOKEN="<Bearer Token>"
    RANCHER_URL='https://xxxx.rancher.com' # 不要加后缀 /

    # 具有用户权限的 kube_config
    ## 获取集群 ID 列表
    CLUSTER_ID_LIST=$(
    curl -LSs \
    -u "${RANCHER_TOKEN}" \
    -X GET \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    ${RANCHER_URL}/v3/clusters/ | jq -r .data[].id
    )

    ## 获取全部集群的 kube_config
    for CLUSTER_ID in ${CLUSTER_ID_LIST};
    do
    curl -LSs \
    -u "${RANCHER_TOKEN}" \
    -X POST \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    ${RANCHER_URL}/v3/clusters/${CLUSTER_ID}?action=generateKubeconfig | \
    jq -r .config > kube_config_${CLUSTER_ID}.yaml
    done
  3. 根据前面步骤中复制的 Bearer Token 设置 RANCHER_TOKEN。RANCHER_URL 设置为 rancher server url,注意不要尾部的 /

  4. 在能访问 rancher server 的任意主机上运行本脚本

具有集群管理员权限的配置文件

如果你是管理员,应该备份所有集群具有管理员权限的 kubeconfig 配置文件,当集群出现异常,需要通过 kubectl 命令行去操作集群。

前提要求

需要在运行脚本的主机上安装 jq 工具

  1. centos

    yum install -y jq
  2. ubuntu

    apt-get install jq -y

脚本使用

  1. 需要用管理员登录 Rancher UI,管理员创建的 API KEY 具有所有集群的管理员权限。

  2. 生成 API KEY,用于 Rancher UI API 的访问

    • 切换到全局视图
    • 右上角点击个人头像,接着点击 API & KEY
    • 点击 添加 Key
      • 描述可以随便填写;
      • 自动失效时间建议选择 1 天,一天后自动删除;
      • 作用范围不用选择,默认全部范围;
    • 点击 创建 后复制 Bearer Token 备用
  3. 保存以下内容为任意脚本;

    #/bin/bash

    RANCHER_TOKEN="<Bearer Token>"
    RANCHER_URL='https://xxxx.rancher.com' # 不要加后缀 /

    # 具有管理员权限的 kube_config
    ## 获取集群 ID 列表
    CLUSTER_ID_LIST=$(
    curl -LSs \
    -u "${RANCHER_TOKEN}" \
    -X GET \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    ${RANCHER_URL}/v3/clusters/ | jq -r .data[].id
    )

    ## 轮训集群 ID 列表,获取每个集群 system 项目 ID,然后获取 kube_config

    for CLUSTER_ID in ${CLUSTER_ID_LIST};
    do
    # 获取集群 ${CLUSTER_ID} system 项目 ID
    SYSTEM_PROJECT_ID=$(
    curl -LSs \
    -u "${RANCHER_TOKEN}" \
    -X GET \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    ${RANCHER_URL}/v3/clusters/${CLUSTER_ID}/projects?name=System | jq -r ".data[].id"
    )

    # 获取集群 ${CLUSTER_ID} full-cluster-state 配置映射文件,老版本是通过 full-cluster-state 配置映射来保存 admin_kube_config 配置文件
    CONFIGMAP_FULL_CLUSTER_STATE=$(
    curl -LSs \
    -u "${RANCHER_TOKEN}" \
    -X GET \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    ${RANCHER_URL}/v3/project/${SYSTEM_PROJECT_ID}/configMaps/kube-system:full-cluster-state | \
    jq -r .data.\"full-cluster-state\" | \
    jq -r .currentState.certificatesBundle.\"kube-admin\".config
    )

    # 获取集群 ${CLUSTER_ID} kube-admin 密文,老版本是通过 kube-admin 密文来保存 admin_kube_config 配置文件
    SECRETS_KUBE_ADMIN=$(
    curl -LSs \
    -u "${RANCHER_TOKEN}" \
    -X GET \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    ${RANCHER_URL}/v3/project/${SYSTEM_PROJECT_ID}/namespacedSecrets/kube-system:kube-admin | \
    jq -r .data.Config
    )

    if [[ ${CONFIGMAP_FULL_CLUSTER_STATE} != 'null' ]]; then

    echo "${CONFIGMAP_FULL_CLUSTER_STATE}" > kube_config_${CLUSTER_ID}.yaml

    elif [[ ${SECRETS_KUBE_ADMIN} != 'null' ]]; then

    echo "${SECRETS_KUBE_ADMIN}" > kube_config_${CLUSTER_ID}.yaml

    else
    echo "没有 full-cluster-state configMaps 和 kube-admin Secrets"
    fi
    done
  4. 根据前面步骤中复制的 Bearer Token 设置 RANCHER_TOKEN。RANCHER_URL 设置为 rancher server url,注意不要尾部的 /

  5. 在能访问 rancher server 的任意主机上运行本脚本

单个集群保存

以上两种方法均是通过 Rancher API 去保存 kubeconfig 配置文件。Rancher API 请求是通过 Rancher server 与 Rancher agent 创建的 websocket 双向隧道去访问的 K8S 集群,如果 Rancher server 与 Rancher agent 的连接出现异常,那么这个时候是无法通过 Rancher API 去保存 kubeconfig 文件。如果早期没有备份 kubeconfig 文件,在 Rancher server 与 Rancher agent 的连接出现异常后,Rancher UI 将无法复制 kubeconfig 配置文件。这个时候到每个集群上去手动保存 kubeconfig 文件,操作方法参考:恢复丢失的 kubecfg 文件