通过从数据库中提取特征来训练一些机器学习模型,并且需要将模型(tensorflow protobuf 格式)保存在 Google 云存储桶中以供以后使用。这是非常简单的架构。
我正在使用云存储熔断器与Google云存储桶连接并将应用程序容器化在docker镜像中。这就是
Dockerfile
中相关行的样子。
# The base image
ARG DISTRIBUTION=debian
FROM $DISTRIBUTION
...
# Install cloud storage fuse
export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
echo "deb [signed-by=/usr/share/keyrings/cloud.google.asc] https://packages.cloud.google.com/apt $GCSFUSE_REPO main" | tee /etc/apt/sources.list.d/gcsfuse.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | tee /usr/share/keyrings/cloud.google.asc
apt-get --assume-yes update
apt-get --assume-yes --no-install-recommends install gcsfuse
一切都好,除了容器必须使用
privileged
标志运行,这
但我想要
gcsfuse
,因为它提供了一个干净的本地文件系统,类似于云接口,几乎让我忘记我将文件保存在云中,也使得将来如有必要可以轻松地与不同的文件系统交换,提供理想的接口隔离。
那么出路在哪里呢?有没有什么方法可以在没有特权模式的情况下使用
gcsfuse
,或者以某种方式给予容器足够与云存储交互的权限?
为了避免特权 Docker 容器从 Python 写入 Google Cloud Storage,请尝试以下解决方法,这可能有助于解决您的问题:
解决方法 1 :
是的,有一种方法可以在没有特权模式的情况下使用 gcsfuse,为容器提供足够的权限来与云存储交互。
根据此 GCP 官方文档
创建具有所需权限的服务帐户(例如:roles/storage.objectAdmin)以检索文件并在 GCS 存储桶中管理它们。将服务帐户 JSON 密钥文件附加到容器卷。使用谷歌云存储Python客户端库与GCS交互并在生产环境中使用服务帐户凭据进行身份验证通常更喜欢服务帐户,因为它们在Kubernetes中更安全。
在生产中使用服务帐户更安全,强烈建议使用服务帐户。为了保护您的密钥免遭丢失或未经授权的访问,请同时使用 Google Cloud Secret Manager 和 Kubernetes 密钥。
解决方法 2:尝试将 Cloud Storage 存储桶作为卷直接挂载到容器中,按照 Github 文档和 Github 注释在 GKE 中安装 GCS Fuse,无需权限。