在 Google Cloud Compute 上使用容器优化操作系统(COS),从 Docker 容器中访问 VM 项目默认服务帐户凭据的最佳方法是什么?
$ gcloud compute instances create test-instance \
--image=cos-stable --image-project=cos-cloud
$ ssh (ip of the above)
# gcloud ...
Command not found
# docker run -ti google/cloud-sdk:alpine /bin/sh
# gcloud auth activate-service-account
... --key-file: Must be specified.
如果凭据在 VM 上,那么 Docker 可以挂载这些凭据。通常凭证会在 中.config/gcloud/
,并使用docker run -v ~/.config/gcloud:~/.config/gcloud image
. 目前尚不清楚容器操作系统中是否以及在何处提供此类凭据,特别是因为缺少gcloud
.
如果凭证在 VM 上且可挂载失败,选项似乎包括:
- 将凭证放入容器元数据/环境变量中;
- 为服务帐户创建一个
.json
凭据文件,然后- 上传到虚拟机,然后挂载;或者
- 添加
.json
到容器中;
- 运行一个 Docker 容器(例如cloud-sdk-docker),它获取凭据并通过例如共享挂载分区与主机共享它们。理想情况下,这将与
gcloud auth activate-service-account
是否有规范或最佳实践方法为 Docker 容器提供 VM 项目的服务帐户凭据?
谷歌云已经有一个安全策略模型,这是理想的模型:项目中的虚拟机应该具有服务帐户提供的访问权限。为避免复杂性和错误配置或事故的可能性,正确的解决方案将采用这种现有的安全模型,即不涉及创建、下载、分发和维护凭证文件。
感觉这将是一个需要用 COS、Docker 和 Kubernetes 解决的常规问题,所以我认为我错过了一些简单的东西——但是从文档中我看不出解决方案。
编辑——注意set-service-account API——这个问题可以简化为“你如何在容器操作系统中使用 set-service-account API?” 如果不可能(因为 Container OS 缺少gcloud
和gsutil
),我认为应该注意这一点,以便 VM 用户可以做出相应的计划。
编辑对于接下来的人来说:
为了复制这个问题,我使用了:
[local] $ ssh test-instance-ip
[test-instance] $ docker run -it gcr.io/google-appengine/python /bin/bash
[test-instance] $ pip install --upgrade google-cloud-datastore
[test-instance] $ python
>>> from google.cloud import datastore
>>> datastore_client = datastore.Client()
>>> q = datastore.query.Query(datastore_client, kind='MODEL-KIND')
>>> list(q.fetch())
[... results]
问题确实是在 API 中为 VM 实例设置的范围,特别datastore
是默认帐户的 API 被禁用(在 VM 的云 API 访问范围标题下)。可以找到范围和必要的datastore
行,如下所示:
> gcloud compute instances describe test-instance
...
serviceAccounts:
- email: *****-compute@developer.gserviceaccount.com
scopes:
- https://www.googleapis.com/auth/datastore
...
...
请注意,服务帐户本身有权访问数据存储(因此通常可以使用服务密钥的 json 凭证密钥访问数据存储)。服务帐户权限受 VM 范围的限制。