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

9

背景

我有一个运行在Tomcat中的Java Servlet应用程序,该Tomcat运行在Docker容器中,该容器又在Google Container Engine上运行。扩展Docker镜像以获取和更新证书没有问题(每个域只有一个Pod,因此不需要跨Pod通信)。但是Certbot需要将其凭据和证书保存在某个地方,Pod的文件系统似乎不是很合适,因为它是临时性的,并且无法在Pod重启后恢复。根据存储选项表,Google Cloud Storage似乎是个好主意,因为成本非常低,卷大小是自动调整的,而且我还可以从多个位置访问它(我不需要为每个单独的Pod创建一个空的磁盘),包括Web UI(后者对于调试可能有用),吞吐量和延迟对于这种用例来说真的不是问题。

问题

我创建了一个Bucket,现在我想从容器中访问该Bucket。Google在这里以及这里描述了可以使用FUSE挂载Bucket。但是他们没有提到,您需要将容器设为特权才能使用FUSE,这对我来说不太合适。 此外,我需要安装整个Google Cloud SDK并设置身份验证(我将在哪里存储身份验证?)。 但实际上,我不需要FUSE访问。 只需在启动时下载配置文件,并在每次更新后上传配置文件即可。 因此,类似于SCP的工作原理就足够了......

有一个gcloud可以通过命令行访问文件,而无需使用FUSE,但仍然需要使用凭据进行初始化。

这里 的 user326502 提到:

如果安装了App Engine SDK,则零配置是不起作用的[...]只要容器位于Google Compute Engine实例上,您就可以访问同一项目中的任何Bucket。

他进一步解释说,在只使用库时,我神奇地不需要任何凭据。 我想我可以使用这些库编写自己的复制应用程序,但是事实上我没有从网络上找到类似于这样的东西,这让我感觉我完全走错了路。

那么,如何在容器内部访问Google Cloud Storage Bucket(尽可能简单)?

1个回答

9

当容器启动时,您可以使用 gsutil 从存储桶复制到本地磁盘。

如果您正在运行 Google 容器引擎,则 gsutil 将使用集群节点的服务帐号(为此,您需要在创建集群时 指定storage-ro范围)。

或者,您可以创建一个新服务帐户,生成JSON密钥。在容器引擎中,您可以将该密钥存储为Kubernetes 秘密, 然后在需要使用它的pod中挂载该密钥。从该pod中,您将通过调用gcloud auth activate-service-account--key-file /path/to/my/mounted/secret-key.json来配置gsutil使用该服务帐户。


我不得不重新创建整个集群,只是为了设置那该死的权限(顺便提一下,storage-rw 是默认未设置的,而 storage-ro 是默认已设置的),但这确实解决了问题。 - yankee
1
很高兴听到你已经解决了问题。很抱歉它如此麻烦。作为参考,您还可以创建一个具有必要范围的新节点池,然后删除旧的节点池。这仍然有效地重新创建了您的集群,但至少可以让您有机会将工作负载从旧节点上卸载。 - CJ Cullen
1
在许多情况下,赋予节点集群整个GCS的写入权限是不希望的。我知道JSON密钥,但我仍在寻找设置默认凭据的选项。 - Paweł Szczur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接