无法从Google Kubernetes Engine群集访问Google Cloud Datastore

时间:2017-12-02 23:14:55

标签: go google-cloud-datastore kubernetes google-cloud-platform

我有一个简单的应用程序,它从数据存储区获取和提取信息。

它适用于所有地方,但是当我从Kubernetes Engine集群中运行它时,我得到了这个输出:

Error from Get()
rpc error: code = PermissionDenied desc = Request had insufficient authentication scopes.
Error from Put()
rpc error: code = PermissionDenied desc = Request had insufficient authentication scopes.

我正在使用cloud.google.com/go/datastore包和Go语言。

我不知道为什么我会收到此错误,因为应用程序在其他地方工作正常。

更新

正在寻找答案我在Google网上论坛发现了这条评论:

  

要从GCE使用Cloud Datastore,实例需要   配置了几个额外的范围。这些不能添加到   现有的GCE实例,但你可以创建一个新的实例   遵循Cloud SDK命令:

     

gcloud compute instances创建hello-datastore --project    --zone --scopes datastore userinfo-email

这是否意味着默认情况下我无法使用GKE中的数据存储区?

更新2:

我可以看到,在创建我的群集时,我没有启用任何权限(默认情况下对大多数服务禁用)。我想这就是造成这个问题的原因:

奇怪的是,即使它被禁用(使用cloudsql_proxy容器),我也可以使用CloudSQL。

3 个答案:

答案 0 :(得分:10)

所以我在调试这个问题的过程中学到的是:

  • 在创建Kubernetes群集期间,您可以为将要创建的GCE节点指定权限。

  • 例如,如果您在创建期间在群集节点上启用数据存储访问,则可以直接从Pod访问数据存储,而无需设置任何其他内容。

  • 如果您的群集节点权限已被禁用,例如我的大部分内容(默认设置),则需要为每个想要使用GCP资源(如数据存储区)的应用程序创建相应的服务帐户。

  • 另一种方法是使用gcloud命令创建新节点池,设置所需的权限范围,然后将所有部署迁移到新节点池(相当繁琐)。

所以在一天结束时我通过为我的应用程序创建服务帐户,下载JSON身份验证密钥,创建包含该密钥的Kubernetes秘密来解决问题,在数据存储的情况下,我设置了{{ 1}}环境变量到已安装的秘密JSON密钥的路径。

这样,当我的应用程序启动时,它会检查GOOGLE_APPLICATION_CREDENTIALS变量是否存在,并根据变量指向的JSON密钥对数据存储区API访问进行身份验证。

部署YAML代码段:

GOOGLE_APPLICATION_CREDENTIALS

答案 1 :(得分:0)

经过几个小时的努力,我还能够连接到数据存储。这是我的结果,大部分来自Google Docs

  1. 创建服务帐户

    gcloud iam service-accounts create [SERVICE_ACCOUNT_NAME]

  2. 获取完整的IAM帐户名

    gcloud iam service-accounts list

    结果将如下所示:

    [SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com

  3. 授予所有者服务帐户的项目权限

    gcloud projects add-iam-policy-binding [PROJECT_NAME] --member serviceAccount:[SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com --role roles/owner

  4. 创建密钥文件

    gcloud iam service-accounts keys create mycredentials.json --iam-account [SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com

  5. 创建app-key秘密

    kubectl create secret generic app-key --from-file=credentials.json=mycredentials.json

    app-key机密将安装在Deployment.yaml

  6. 编辑部署文件

deployment.yaml:

...
spec:
 containers:
 - name: app
   image: eu.gcr.io/google_project_id/springapplication:v1
   volumeMounts:
   - name: google-cloud-key
     mountPath: /var/secrets/google
   env:
   - name: GOOGLE_APPLICATION_CREDENTIALS
     value: /var/secrets/google/credentials.json
   ports:
   - name: http-server
     containerPort: 8080
 volumes:
 - name: google-cloud-key
   secret:
     secretName: app-key

答案 2 :(得分:0)

我使用的是简约的Dockerfile,例如:

FROM SCRATCH
ADD main /
EXPOSE 80
CMD ["/main"]

,当我尝试连接到GCP数据存储区时,这使我的go应用处于不确定的“挂起”状态。玩了很多之后,我发现SCRATCH Docker映像可能缺少Google云库所需的某些环境工具/变量/库。现在可以使用此Dockerfile:

FROM golang:alpine
RUN apk add --no-cache ca-certificates
ADD main /
EXPOSE 80
CMD ["/main"]

不需要我提供google凭证环境变量。该库似乎可以自动了解它的运行位置(也许是从context.Background()吗?),并自动使用Google在GKE上创建集群时为您创建的默认服务帐户。