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

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

我的目标

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

初始上下文

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

问题

✅ 我已经验证为执行者 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。为什么它仍然缺少权限? 😧😧😧

我的局限性

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

最佳答案

如果你在这个位置查看你的 kubeconfig 文件~/.kube/config,你可以看到授权列表和 secret ,例如

- 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。命令路径很有趣,因为当需要生成新 token 时,将调用它。

但是,您会看到对模拟的任何提及。您必须将其添加到命令路径中,默认情况下使用。为此,将其添加到您的配置中,如下所示:

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

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

关于kubernetes - 使用模拟获取 GKE 集群凭据后无法运行 'kubectl' 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65657672/

相关文章:

python - 带有存储触发器的谷歌云函数 python37 将不会部署并且不会提供任何日志

kubernetes - requiredDuringSchedulingRequiredDuringExecution是否有效?

ssl - 正在处理 gke 证书管理器证书

google-cloud-platform - 如何使用 Terraform 正确更改 Google Kubernetes Engine 节点池?

java - 如何使用基本身份验证创建具有适当权限的用户来列出 kubernetes v1.13 中的命名空间

kubernetes - 如何将 key 从 Vault 注入(inject) Kubernetes pod

php - PDO 与 Azure PostgreSQL 建立连接非常慢

kubernetes - 应用程序网关入口 Controller 仅适用于根路径/

google-cloud-platform - 为 Google Cloud Run 应用程序设置多个环境(例如 dev、stage 和 prod)的理想方法是什么?

email - 通过 Google Cloud Platform 从 Firebase 发送自动电子邮件(无第三方)