【问题标题】:How do I entitle serviceAccounts via gcloud command-line for Kubernetes API access?如何通过 gcloud 命令行授权 serviceAccounts 以进行 Kubernetes API 访问?
【发布时间】:2017-10-09 14:11:29
【问题描述】:

我正在尝试通过gcloud 命令行工具自动创建用于 GKE 的服务帐户。我想出了一个流程,该流程似乎反映了 Google Cloud Console 使用的流程,但我的用户看不到获得适当的访问权限。

这是我按顺序执行的命令:

# Environment:
# - uname=<username>
# - email=<user's email address>
# - GCLOUD_PROJECT_ID=<project identifier>
# - serviceAccount="${uname}@${GCLOUD_PROJECT_ID}.iam.gserviceaccount.com"
$ gcloud iam service-accounts \
    create "${uname}" --display-name "email:${email}" --format json
$ gcloud projects \
    add-iam-policy-binding "${GCLOUD_PROJECT_ID}" \
        --member "serviceAccount:${serviceAccount}" \
        --role=roles/container.developer --format=json
$ gcloud iam service-accounts keys \
    create "${GCLOUD_PROJECT_ID}-${uname}.json" \
        --iam-account="${serviceAccount}"

执行此操作时,它会创建一个新的服务帐户并在本地生成一个密钥文件。然后我尝试使用此密钥来获取我的 Kubernetes 集群的凭据。

$ gcloud config configurations create devcluster --activate
$ gcloud config set project devnet-166017
$ gcloud config set compute/zone us-central1-b
$ gcloud auth activate-service-account \
    --key-file="${GCLOUD_PROJECT_ID}-${uname}.json"
$ gcloud container clusters get-credentials devcluster
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: \
    code=403, message=Required "container.clusters.get" permission for \
    "projects/${GCLOUD_PROJECT_ID}/zones/us-central1-b/clusters/devcluster".

由于某种原因,我的服务帐户似乎没有获取凭据所需的权限之一,但根据我所阅读的内容以及我在控制台中观察到的内容,我认为该权限应该是roles/container.developer 角色的一部分。

谢谢!

【问题讨论】:

  • 有什么解决办法吗?我试过this 运气不好
  • 排序:我发现如果我从一个高度授权的用户开始(Google Cloud 中的一个项目Owner),上述步骤会创建一个服务帐户,该帐户有权执行我需要的操作.但是,当我使用具有更细粒度权利集的另一个服务帐户时,它会失败。似乎可能有一些派生的授权,但我还没有确定它们到底是什么。
  • 我实际上只是删除了失败的gcloud container clusters get-credentials devcluster 行。 不知道为什么它现在有效,但这是我的解决方案。
  • 我把这个属性设置为 False 并且可以工作 gcloud config set container/use_client_certificate False
  • This answer 使用与上述@HaroldCastillo 评论相同的解决方案解决了不同的错误消息:gcloud config set container/use_client_certificate False。自 2019/2020 年的某个时候起,似乎会影响最近创建(或重新创建)的 GKE 集群。

标签: google-cloud-platform gcloud google-kubernetes-engine


【解决方案1】:

我假设服务帐户是指 Google Cloud 的服务帐户。以下是与 GKE 相关的 IAM 角色:https://cloud.google.com/container-engine/docs/iam-integration(搜索 container.)。

首先创建一个服务帐号:

gcloud iam service-accounts create --display-name "GKE cluster access" gke-test

然后创建一个密钥:

gcloud iam service-accounts keys create key.json --iam-account=gke-test@[PROJECT_ID].iam.gserviceaccount.com

现在您需要为该服务帐号分配一些角色,您的选择是:

  • roles/container.admin 完全管理容器集群及其 Kubernetes API 对象。
  • roles/container.clusterAdmin 容器集群管理。
  • roles/container.developer 完全访问容器集群内的 Kubernetes API 对象。
  • roles/container.viewer 对容器引擎资源的只读访问权限。

再次查看https://cloud.google.com/container-engine/docs/iam-integration页面了解详情。

我将 roles/container.viewer(只读角色,您可以分配给 get-credentials 的最低限度)分配给此服务帐户:

gcloud projects add-iam-policy-binding [PROJECT_ID] --role=roles/container.viewer --member=serviceAccount:gke-test@[PROJECT_ID].iam.gserviceaccount.com

从您当前的帐户退出 gcloud:

gcloud auth revoke

使用服务帐号密钥登录 gcloud:

gcloud auth activate-service-account --key-file=key.json

试试get-credentials:

$ gcloud container clusters get-credentials test --zone us-west1-a
Fetching cluster endpoint and auth data.
kubeconfig entry generated for test.

它有效。我用roles/container.developer 试过了,也可以。

您可以尝试其他权限,看看哪些有效,哪些无效,尽管您明确说明文档没有明确说明哪些角色可以访问container.clusters.getCredentials

【讨论】:

  • 谢谢艾哈迈德。我会试着花时间转一圈,然后再试一次。不确定您是否看到我上面的评论,回复:当我使用 roles/owner 的帐户(或 serviceAccount)而不是更受限制的帐户时,这对我有用。我不确定为什么这很重要,但我必须为在我们的自动化管道之外执行此过程的 serviceAccount 提供更高的权限,以便创建的 serviceAccounts 按预期工作。
  • @ahmet-alp-balkan 为了能够使用属于另一个项目的服务帐户执行gcloud container clusters get-credentials,您需要哪些额外的范围?
猜你喜欢
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 2013-04-13
  • 2019-03-20
  • 1970-01-01
  • 2018-06-13
  • 2019-07-16
  • 2011-06-28
相关资源
最近更新 更多