我有一个简单的应用程序,它从数据存储区获取和提取信息。
它适用于所有地方,但是当我从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。
答案 0 :(得分:10)
所以我在调试这个问题的过程中学到的是:
在创建Kubernetes群集期间,您可以为将要创建的GCE节点指定权限。
例如,如果您在创建期间在群集节点上启用数据存储访问,则可以直接从Pod访问数据存储,而无需设置任何其他内容。
如果您的群集节点权限已被禁用,例如我的大部分内容(默认设置),则需要为每个想要使用GCP资源(如数据存储区)的应用程序创建相应的服务帐户。
另一种方法是使用gcloud
命令创建新节点池,设置所需的权限范围,然后将所有部署迁移到新节点池(相当繁琐)。
所以在一天结束时我通过为我的应用程序创建服务帐户,下载JSON身份验证密钥,创建包含该密钥的Kubernetes秘密来解决问题,在数据存储的情况下,我设置了{{ 1}}环境变量到已安装的秘密JSON密钥的路径。
这样,当我的应用程序启动时,它会检查GOOGLE_APPLICATION_CREDENTIALS
变量是否存在,并根据变量指向的JSON密钥对数据存储区API访问进行身份验证。
部署YAML代码段:
GOOGLE_APPLICATION_CREDENTIALS
答案 1 :(得分:0)
经过几个小时的努力,我还能够连接到数据存储。这是我的结果,大部分来自Google Docs:
创建服务帐户
gcloud iam service-accounts create [SERVICE_ACCOUNT_NAME]
获取完整的IAM帐户名
gcloud iam service-accounts list
结果将如下所示:
[SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com
授予所有者服务帐户的项目权限
gcloud projects add-iam-policy-binding [PROJECT_NAME] --member serviceAccount:[SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com --role roles/owner
创建密钥文件
gcloud iam service-accounts keys create mycredentials.json --iam-account [SERVICE_ACCOUNT_NAME]@[PROJECT_NAME].iam.gserviceaccount.com
创建app-key
秘密
kubectl create secret generic app-key --from-file=credentials.json=mycredentials.json
此app-key
机密将安装在Deployment.yaml
编辑部署文件
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上创建集群时为您创建的默认服务帐户。