如何通过gcloud命令行授权serviceAccounts进行Kubernetes API访问?

时间:2017-05-10 19:02:16

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

我正在尝试通过gcloud命令行工具自动创建服务帐户,以便与GKE一起使用。我发现了一个似乎与Google云端控制台使用的流程相似的流程,但我的用户看不到相应的访问权限。

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

# 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角色的一部分。

谢谢!

1 个答案:

答案 0 :(得分:2)

我假设服务帐户是指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对Container Clusters及其Kubernetes API对象进行全面管理。
  • roles/container.clusterAdmin容器集群管理。
  • roles/container.developer对Container Clusters内​​的Kubernetes API对象的完全访问权限。
  • roles/container.viewer对Container Engine资源的只读访问权。

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

我将roles/container.viewer(一个只读角色,至少可以分配给获取凭据)分配给此服务帐户:

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