如何在部署到 Google 容器引擎的容器中使用 Google 云存储?

How can I use Google Cloud Storage in a container deployed to the Google Container Engine?

背景

我有一个 Java-Servlet 应用程序在 tomcat 中运行,它在 docker 容器中运行,该容器在 Google 容器引擎上运行。扩展 docker 图像没什么大不了的,这样它也可以获取和刷新证书(每个域只有一个 pod,因此不需要 pod 间通信)。然而,certbot 需要将它的凭据和证书保存在某个地方,并且 pod 的文件系统似乎是一个坏主意,因为它是短暂的并且不会在 pod 重启后继续存在。根据table with storage options。 Google 云存储似乎是个好主意,因为它非常便宜,卷是自动调整大小的,我还可以从多个位置访问它(我不需要为每个单独的 pod 创建一个磁盘,这将是几乎是空的)包括 web-UI(后者可能对调试有用)和吞吐量和延迟对于这个用例来说真的没有问题。

问题

我创建了一个存储桶,现在我想从容器访问该存储桶。 Google 描述 here and yet again here 我可以使用 FUSE 安装存储桶。他们没有提到的是,您需要让容器有权使用 FUSE,这对我来说不太合适。此外,我需要安装整个 google 云 SDK 并设置身份验证(我要将其存储……在哪里?)。但实际上我并不真的需要保险丝访问。只需在启动时下载配置并在每次刷新后上传配置就足够了。所以类似于 SCP 的东西会做...

gcloud 可以从命令行访问文件而不需要 FUSE,但它仍然需要以某种方式使用凭据进行初始化。

user326502 提及

It won't work with zero configuration if the App Engine SDK is installed [..] As long as the container lives on a Google Compute Engine instance you can access any bucket in the same project.

他进一步解释说,当我只使用图书馆时,我神奇地不需要任何凭据。我想我可以用这些库编写自己的复制应用程序,但我没有从网上的任何人那里找到这样的东西,这让我觉得我完全走错了路。

那么如何从容器中实际访问 google 云存储桶(尽可能简单)?

容器启动时可以使用gsutil从bucket复制到本地磁盘

如果您在 Google 容器引擎中 运行,gsutil 将使用集群节点的服务帐户(为此,您需要 specify the storage-ro scope 当你创建集群时)。

或者,您可以创建 new service account, generating a JSON key. In Container Engine, you can store that key as a Kubernetes secret, and then mount the secret in the pod that needs to use it. From that pod, you'd configure gsutil to use the service account by calling gcloud auth activate-service-account--key-file /path/to/my/mounted/secret-key.json