如何获取导入集群信息?

问题描述

获取连接导入集群所需的配置信息,以便平台能够被授权访问和管理该集群。本节提供获取导入集群信息的操作步骤。

前提条件

  • 已配置可用的 kubectl 环境。对于公有云集群,强烈建议使用云厂商提供的 CloudShell。 如果无法使用 CloudShell,建议使用 Linux 或 macOS。

  • 已获取导入集群的 KubeConfig 文件并复制到安装有 kubectl 的环境中。为避免误操作其他环境,强烈建议采用以下非破坏性方式之一:

    • 备份方式:先备份现有 kubeconfig 到安全位置:cp "${HOME}/.kube/config" "${HOME}/.kube/config.backup"
    • 隔离方式:设置 KUBECONFIG 环境变量指向导入的 kubeconfig:export KUBECONFIG="/path/to/imported/kubeconfig"
    • 合并方式:使用 kubectl 的合并/扁平化功能,且不丢失现有上下文:
      1. export KUBECONFIG="/path/to/imported/kubeconfig:${HOME}/.kube/config"
      2. kubectl config view --flatten > "${HOME}/.kube/merged.kubeconfig"
      3. export KUBECONFIG="${HOME}/.kube/merged.kubeconfig"

获取集群信息

获取集群 token

  1. 执行以下命令:

    # [重要] 以下操作仅支持 bash
    
    # 手动创建 secret,绑定服务账号,并生成一个不失效的 token
    kubectl get ns cpaas-system > /dev/null 2>&1 || kubectl create namespace cpaas-system
    kubectl create serviceaccount k8sadmin -n cpaas-system
    kubectl create clusterrolebinding k8sadmin --clusterrole=cluster-admin --serviceaccount=cpaas-system:k8sadmin
    
    cat | kubectl apply -f - <<EOF
    apiVersion: v1
    kind: Secret
    metadata:
      name: k8sadmin
      namespace: cpaas-system
      annotations:
        kubernetes.io/service-account.name: "k8sadmin"
    type: kubernetes.io/service-account-token
    EOF
    
    kubectl -n cpaas-system describe secret \
        $(kubectl -n cpaas-system get secret | (grep k8sadmin || echo "$_") | awk '{print $1}') \
        | grep -F 'token:' | awk '{print $2}'
    
    WARNING

    本操作创建了一个集群管理员级别的凭证,且该凭证设计为不失效。

    • 如可能,优先使用最小权限的 RBAC,限定到所需资源。
    • 请妥善保管该 token,使用完成后应及时轮换或撤销。
    • 限制谁可以读取 cpaas-system 命名空间中的 Secret 对象。
  2. 以下为上一步获取的 token 示例。

  3. 验证 token 过期时间。

    使用任何支持解析 JWT token 的工具分析该 token,确认其过期时间。 如果解析结果中能找到过期字段(包含 "exp" 的键,如下图所示),则平台在该时间之后将无法管理导入集群。 遇此情况,请停止操作并联系技术支持。

TIP

过期时间在原始 JWT 负载中记录为 "exp": 1684486916,,该值为 UNIX 时间戳,可转换为 UTC 时间。

完成后清理(撤销访问权限):

kubectl delete clusterrolebinding k8sadmin
kubectl -n cpaas-system delete secret k8sadmin
kubectl -n cpaas-system delete serviceaccount k8sadmin

获取导入集群 API 服务器地址及 CA 证书

TIP

如果已通过平台导入集群页面的 Parse KubeConfig File 功能获取了 API 服务器地址和 CA 证书,可跳过此步骤。

  1. 执行以下命令:

    # 查看导入集群的 API 服务器地址,可能有多个地址,请选择适合您环境的地址。
    kubectl --kubeconfig "${KUBECONFIG:-${HOME}/.kube/config}" config view --show-managed-fields=false --flatten --raw -ojsonpath='{$.clusters..cluster.server}'
    addr_apiserver='<Selected API server address>'
    
    # 获取上述 API 服务器对应的 CA 证书
    kubectl --kubeconfig "${KUBECONFIG:-${HOME}/.kube/config}" config view --show-managed-fields=false --flatten --raw \
        -ojsonpath="{$.clusters[?(@.cluster.server == '${addr_apiserver}')].cluster.certificate-authority-data}" \
        | { base64 -d 2>/dev/null || base64 -D; }