4

我有一个简单的应用程序,可以从数据存储获取和放置信息。无法从Google Kubernetes引擎群集访问Google Cloud Datastore

它的工作原理无处不在,但是当我从Kubernetes引擎集群中运行它,我得到这个输出:

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语言。

我不知道为什么我得到这个错误,因为应用程序在其他地方工作得很好。

更新:

寻找一个答案,我发现在谷歌群组这个评论:一对夫妇的配置

为了从GCE使用云存储,实例必须是额外的范围。这些不能被添加到现有 GCE实例,但你可以创建一个新的与 以下云SDK命令:

gcloud计算实例创建Hello-数据存储--project --zone --scopes数据存储用户信息 - 电子邮件

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

更新2:

我可以看到我的创建群集时,我没有启用任何权限(这是默认情况下,大多数服务已禁用)。我想这是什么导致了问题:

奇怪的是,我可以用CLOUDSQL就好了,即使它已禁用(使用cloudsql_proxy容器)。

+0

你只是试图在实例本身的编辑权限? – vjdhama

回答

3

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

  • 在创建一个Kubernetes集群您可以指定将要创建的GCE节点上的权限。

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

  • 如果您的群集节点权限在大多数情况下都是禁用的(默认设置),您将需要为每个想要使用GCP资源(如Datastore)的应用程序创建适当的服务帐户。

  • 另一种替代方法是使用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 
相关问题