持续遇到权限错误 gcloud.container.clusters.get-credentials。

15

我正在尝试将CircleCi与gcloud Kubernetes引擎集成。

  1. 我创建了一个具有Kubernetes Engine Developer和Storage Admin角色的服务帐户。
  2. 创建了CircleCi yaml文件并配置了CI。

我的yaml文件的一部分包括:

docker:
            - image: google/cloud-sdk
        environment:
            - PROJECT_NAME: 'my-project'
            - GOOGLE_PROJECT_ID: 'my-project-112233'
            - GOOGLE_COMPUTE_ZONE: 'us-central1-a'
            - GOOGLE_CLUSTER_NAME: 'my-project-bed'
        steps:
            - checkout
            - run:
                  name: Setup Google Cloud SDK
                  command: |
                      apt-get install -qq -y gettext
                      echo $GCLOUD_SERVICE_KEY > ${HOME}/gcloud-service-key.json
                      gcloud auth activate-service-account --key-file=${HOME}/gcloud-service-key.json
                      gcloud --quiet config set project ${GOOGLE_PROJECT_ID}
                      gcloud --quiet config set compute/zone ${GOOGLE_COMPUTE_ZONE}
                      gcloud --quiet container clusters get-credentials ${GOOGLE_CLUSTER_NAME}

除了最后一条命令外,一切都运行得很完美:

gcloud --quiet container clusters get-credentials ${GOOGLE_CLUSTER_NAME}

它一直失败并显示错误:

ERROR: (gcloud.container.clusters.get-credentials) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/my-project-112233/zones/us-central1-a/clusters/my-project-bed". See https://cloud.google.com/kubernetes-engine/docs/troubleshooting#gke_service_account_deleted for more info.

我试图将ci帐户赋予项目所有者的角色,但仍然遇到了错误。

我尝试禁用并重新启用Kubernetes服务,但这没有帮助。

有什么想法如何解决?我已经尝试了4天...

9个回答

6

这是一个旧的讨论串,如今使用云构建,处理此问题可以按以下方法进行:

授予 Cloud Build 访问 GKE 的权限

为了在你的 Kubernetes 集群中部署应用程序,Cloud Build 需要 Kubernetes Engine 开发者身份和访问管理角色。

获取项目编号:

PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')"

添加IAM策略绑定:

gcloud projects add-iam-policy-binding ${PROJECT_NUMBER} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/container.developer

更多信息可在此处找到。


5

我认为这不是CI服务帐户,而是用于管理您的GKE集群的k8s服务帐户,其电子邮件应该像这样(某人必须已将其删除):

k8s-service-account@<project-id>.iam.gserviceaccount.com

sa

您可以重新创建它并授予项目所有者权限。

recreate


我没有这样的账户。也许你指的是这个账户:"service-448608612002@container-engine-robot.iam.gserviceaccount.com"? - Naor
你需要创建它。不是那一个。 - Rico
这将使用 gcloud --quiet container clusters get-credentials ${GOOGLE_CLUSTER_NAME} - Rico
但是我已经使用 Kubernetes Engine Developer 和 Storage Admin 角色创建了一个服务帐户。我将其用于 get-credentials 命令,但它失败了。创建另一个具有相同角色的帐户如何有所帮助? - Naor
3
我删除了该账户,然后用相同的名称和角色重新创建了它。突然间它就可以正常工作了……这是 gcloud 的一个 bug。 - Naor
显示剩余2条评论

3
在我的情况下,这两个步骤解决了我的问题:
  1. 在命令中,
gcloud container clusters get-credentials my-cluster-1 --zone=asia-south1-a -- 
project=thelab-240901

--project 应该使用 projectID 值而非项目名称。

  1. 在您的 Travis 账户中,前往您的项目仓库 -> 更多选项 -> 设置 -> 环境变量。现在,请确保您只有一组如下所示的加密_iv 和 encrypted_key 环境变量:

enter image description here

如果您已加密了不同的服务账户(JSON密钥文件),那么这可能会添加多组encrypted_iv和encrypted_key环境变量。因此,请删除所有这些变量并重新创建加密密钥,可以使用travis encrypt-file --pro yourServiceAccountJSONFile.json --add来完成。

2
上述错误的详细信息在此帮助中心文章中有解释。
如果您没有Kubernetes Engine服务账户,请运行以下命令,以便正确重新创建带有“Kubernetes Engine服务代理”角色的Kubernetes服务账户。
gcloud services enable container.googleapis.com

1

步骤1:gcloud init

步骤2:选择[2]创建新配置

步骤3:输入配置名称。名称以小写字母开头,仅包含小写字母a-z、数字0-9和连字符'-': kubernetes-service-account

步骤4:选择要用于执行此配置操作的帐户:[2]使用新帐户登录

步骤5:是否要继续(Y/n)? y

步骤6:复制并粘贴链接到浏览器,并使用用于创建您的Google Cloud帐户的ID进行登录

步骤7:在登录后复制谷歌提供的验证代码并将其粘贴到控制台中。

步骤8:选择要使用的云项目:

步骤9:是否要配置默认计算区域和区域?(Y/n)? y

步骤10:请输入数字选项或文本值(必须与列表项完全匹配):8

您的Google Cloud SDK已配置并准备好使用!


1
我使用我的主所有者帐户在gcloud上遇到了这个问题,解决方法是在获取kubectl凭据的命令中包含--zone和--project参数。

0

我在不同的情况下都遇到了这个问题,以下是列出的情况,希望能帮助到某些人。

1. If you did a fresh installation of google-cloud-sdk then you must login 
with gcloud using the below command.

gcloud auth login

The above command will open ur browser and ask for login with your GCP account.

2. Sometimes provisioning is not reflected. Hence i revoke my provision and granted access (In this case my role is Owner) again. Then it worked. 

0

当我尝试连接到我的新创建的集群时,遇到了相同的错误:

gcloud container clusters get-credentials <foo-cluster> --zone europe-central2-a --project <foo-project>
Fetching cluster endpoint and auth data.
ERROR: (gcloud.container.clusters.get-credentials) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/foo-project/zones/europe-central2-a/clusters/foo-cluster".

我尝试了几件事:

  1. 我启用了Kubernetes API - 但没有成功

  2. 我向服务帐户添加了一个密钥,并使用下载的密钥登录:

    gcloud auth activate-service-account --key-file=<path-to-the-downloaded-json-file>/foo-project-xxxx.json
    Activated service account credentials for: [xxxx-compute@developer.gserviceaccount.com]
    
  3. 我运行了以下命令:

    gcloud components update
    
  4. 然而,当我尝试检索数据时出现问题,所有kubectl命令都会超时,例如:kubectl get namespace会出现以下错误:

        Unable to connect to the server: net/http: TLS handshake timeout
    
  5. 这是我再次尝试时的情况:

    gcloud container clusters get-credentials <foo-cluster> --zone europe-central2-a --project <foo-project>
    

它运行成功了

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for foo-project.

0
我遇到了这个错误。问题是我已经用一个Google账号配置了gcloud,而我正在尝试连接到一个在另一个Google账号上创建的集群。
解决方案:只需重置gcloud配置并添加新的Google账号。
操作:
gcloud init

按照终端中显示的步骤重置并添加新的账户。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接