如何在 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来实现。在Container OS中是否有这样的凭据可用尚不明确,特别是因为它缺少gcloud。
如果无法在VM上找到并挂载凭据,则选项似乎包括:
1. 将凭据放入容器元数据/环境变量中; 2. 为服务帐号创建一个.json凭据文件,然后 a.将其上传到VM,然后挂载它;或 b.将.json添加到容器中; 3. 运行一个Docker容器(例如cloud-sdk-docker),该容器获取凭据并通过共享挂载分区与主机共享它们。理想情况下,应使用gcloud auth activate-service-account进行操作。
是否存在一种规范或最佳实践方法来为Docker容器提供VM项目的服务帐号凭据?
Google Cloud已经具有安全策略模型,即:项目中的VM应具有服务帐号提供的访问权限。为避免复杂性和配置错误或意外的可能性,正确的解决方案将采用此现有安全模型,即不涉及创建、下载、分发和维护凭据文件。
这似乎是一个常规问题,需要使用COS、Docker和Kubernetes来解决,所以我认为我错过了一些简单的东西——但是从文档中我没有找到明显的解决方案。
编辑-注意set-service-account API-这个问题可以简化为“如何在容器操作系统中使用set-service-account API?”如果不可能(因为容器操作系统缺少gcloud和gsutil),我认为应该注意这一点,以便虚拟机用户做好计划。
编辑-对于下一个遇到此问题的人:
[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]
问题确实是VM实例API中设置的范围,特别是对于默认帐户禁用了 API(在VM的Cloud API access scopes标题下)。您可以按以下方式查找范围和必要的行:
> gcloud compute instances describe test-instance
...
serviceAccounts:
- email: *****-compute@developer.gserviceaccount.com
scopes:
- https://www.googleapis.com/auth/datastore
...
...
请注意,服务账户本身具有访问数据存储的权限(因此,通常可以使用服务密钥的JSON凭据键访问数据存储)。虚拟机的作用域限制了服务账户的权限。
gcloud auth login
将授予个人凭据,必须避免使用。2. 谷歌提供了set-service-account API,很明显是用来确定凭据的 - 但如果这些凭据不可用,那么在容器OS上使用这个API有什么意义呢?我会更新问题以记录这一点。感谢您的帮助。 - Brian M. Hunt