如何获取导入集群信息?

问题描述

获取连接导入集群所需的配置,以便授权平台访问并管理该集群。

前提条件

  • 可正常使用的 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 的 merge/flatten,且不丢失现有 context:
      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"

获取集群信息

获取集群令牌

  1. 运行以下命令:

    # [Important] The following operations support bash only
    
    # Manually create a secret, bind a service account, and generate a non-expiring 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

    此操作步骤会创建一个 cluster-admin 凭证,且该凭证设计为不过期。

    • 如有可能,优先采用仅授予所需资源最小权限的 RBAC。
    • 请妥善保管令牌;在不再需要时及时轮换/撤销。
    • 限制可读取 cpaas-systemSecret 对象的人员范围。
  2. 下图为上一步获取到的令牌示例。

  3. 验证令牌的过期时间。

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

TIP

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

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

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

获取导入集群 API server 地址和 CA 证书

TIP

如果你已经通过导入集群页面上的 Parse KubeConfig File 功能获取了 API server 地址和 CA 证书,可跳过此步骤。

  1. 运行以下命令:

    # View the import cluster API server addresses. There may be multiple addresses; choose the one that fits your environment.
    kubectl --kubeconfig "${KUBECONFIG:-${HOME}/.kube/config}" config view --show-managed-fields=false --flatten --raw -ojsonpath='{$.clusters..cluster.server}'
    addr_apiserver='<Selected API server address>'
    
    # Get the CA certificate for the API server specified above
    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; }