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

Anu*_*ope 6 go google-cloud-datastore google-cloud-platform kubernetes

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

它可以在任何地方使用,但是当我从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.
Run Code Online (Sandbox Code Playgroud)

我正在使用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 .

Anu*_*ope 10

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

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

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

  • 如果对于像我这样的大多数事物(默认设置)禁用了群集节点权限,则需要为每个想要使用GCP资源(如数据存储区)的应用程序创建适当的服务帐户.

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

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

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

部署YAML代码段:

  ...
  containers:
  - image: foo
    name: foo
    env:
    - name: GOOGLE_APPLICATION_CREDENTIALS
      value: /auth/credentials.json
    volumeMounts:
    - name: foo-service-account
      mountPath: "/auth"
      readOnly: true
  volumes:
  - name: foo-service-account
    secret:
      secretName: foo-service-account
Run Code Online (Sandbox Code Playgroud)