【问题标题】:Unable to run 'kubectl' commands after using impersonation to fetch GKE cluster credentials使用模拟获取 GKE 集群凭据后无法运行“kubectl”命令
【发布时间】:2021-04-15 20:28:55
【问题描述】:

我的目标

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

初始上下文

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

问题

✅我已认证为 executor ServiceAccount:

$ 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).

但我已经冒充了 Owner ServiceAccount。为什么它仍然缺少权限? ????????????

我的局限

如果我授予我的 executor ServiceAccount roles/container.admin 角色,效果会很好。但是,由于合规要求,我不允许将此类角色授予我的执行者 ServiceAccount。我只能冒充 owner ServiceAccount,然后通过它做任何我想做的事 - 而不是直接。

【问题讨论】:

  • 通过查看.kube/config 文件,似乎缺少模拟功能。您能否尝试运行此命令并重试:gcloud config set auth/impersonate_service_account owner@rakib-example-project.iam.gserviceaccount.com。告诉我
  • @guillaumeblaquiere 做到了 :) gcloud config set auth/impersonate_service_account owner@rakib-example-project.iam.gserviceaccount.com 没有以任何方式更改 ~/.kube/config 的内容 - 它只是在 gcloud config list 中添加了 auth/impersonate_service_account 属性。这解决了它:)
  • @guillaumeblaquiere 您可能想将其添加为这个 SO 问题的答案。我会接受的。
  • 我做到了。我还解释了我在哪里挖掘找到了解决方法。

标签: kubernetes google-cloud-platform google-kubernetes-engine kubectl impersonation


【解决方案1】:

如果您查看此位置 ~/.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 集群的原因

【讨论】:

  • 完美运行。谢谢:)
猜你喜欢
  • 2019-07-19
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2016-02-29
  • 1970-01-01
  • 2018-11-07
  • 2019-04-10
相关资源
最近更新 更多