使用模拟获取 GKE 集群凭据后无法运行"kubectl"命令



我的目标

我想使用GCP模拟来获取我的GKE集群凭据。然后我想运行kubectl命令。

初始上下文

  1. 我有一个名为rakib-example-project的GCP项目
  2. 我在名为的项目中有两个ServiceAccount:
    • owner@rakib-example-project.iam.gserviceaccount.com
      • 它具有项目范围的roles/owner角色,因此它可以在GCP项目中做任何事情
    • executor@rakib-example-project.iam.gserviceaccount.com
      • 它只有项目范围的roles/iam.serviceAccountTokenCreator角色,因此它可以在GCP项目中模拟所有者ServiceAccount
  3. 我在名为my-gke-cluster的项目中有1个GKE集群

问题

✅我已通过执行人身份验证服务帐户:

$ gcloud auth activate-service-account --key-file=my_executor_sa_key.json
Activated service account credentials for: [executor@rakib-example-project.iam.gserviceaccount.com]

✅我通过模拟所有者:获取了GKE集群凭据

$ gcloud container clusters get-credentials my-gke-cluster 
--zone asia-southeast1-a 
--project rakib-example-project 
--impersonate-service-account=owner@rakib-example-project.iam.gserviceaccount.com
WARNING: This command is using service account impersonation. All API calls will be executed as [owner@rakib-example-project.iam.gserviceaccount.com].
WARNING: This command is using service account impersonation. All API calls will be executed as [owner@rakib-example-project.iam.gserviceaccount.com].
Fetching cluster endpoint and auth data.
kubeconfig entry generated for my-gke-cluster.

❌由于缺少container.nodes.list权限,我无法列出群集节点:

$ kubectl get nodes
Error from server (Forbidden): nodes is forbidden: User "executor@rakib-example-project.iam.gserviceaccount.com" cannot list resource "nodes" in API group "" at the cluster scope: requires one of ["container.nodes.list"] permission(s).

但我已经模拟了所有者服务帐户。为什么它仍然缺少权限?

我的局限性

如果我授予执行者ServiceAccountroles/container.admin角色,效果会很好。但是,由于合规要求,我不允许将此类角色授予我的执行人服务帐户。我只能模拟所有者ServiceAccount,然后通过它做我想做的任何事情,而不是直接做。

如果您查看位于~/.kube/config位置的kubeconfig文件,您可以看到授权和机密列表,例如

- name: gke_gdglyon-cloudrun_us-central1-c_knative
user:
auth-provider:
config:
access-token: ya29.<secret>-9XQmaTQodj4kS39w
cmd-args: config config-helper --format=json
cmd-path: /usr/lib/google-cloud-sdk/bin/gcloud
expiry: "2020-08-25T17:48:39Z"
expiry-key: '{.credential.token_expiry}'
token-key: '{.credential.access_token}'
name: gcp

您可以看到外部参照(expiry-keytoken-key)和一个cmd-path。命令路径很有趣,因为当需要生成新的令牌时,会调用它。

然而,你可以看到任何关于模仿的提及。您必须将其添加到默认情况下使用的命令路径中。为此,将其添加到您的配置中,如下所示:

gcloud config set auth/impersonate_service_account owner@rakib-example-project.iam.gserviceaccount.com

现在,每次使用gcloud CLI都将使用模拟服务帐户,这就是您想要生成有效的access_token以访问GKE集群的原因

最新更新