如何获取导入集群信息?

问题描述

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

先决条件

  • 可正常使用的 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"

获取集群信息

获取集群令牌

  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。
    • 安全存储令牌;不再需要时应轮换或撤销令牌。
    • 限制可以读取 Secret 中 cpaas-system 对象的人员。
  2. 以下是上一步获取的令牌示例。

  3. 验证令牌是否过期。

    使用支持解析 JWT 令牌的任意工具分析令牌,并确认其过期时间。 如果在解析结果中发现过期字段(包含 "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 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; }