无法从Google Kubernetes引擎群集访问Google Cloud Datastore
我有一个简单的应用程序,可以从数据存储获取和放置信息。无法从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
容器)。
回答:
所以我在调试这个问题的过程中的教训是:
在创建一个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
以上是 无法从Google Kubernetes引擎群集访问Google Cloud Datastore 的全部内容, 来源链接: utcz.com/qa/258771.html