本页面介绍如何使用 Cloud Run 卷装载将 Cloud Storage 存储桶作为存储卷进行装载。
在 Cloud Run 中将存储桶作为卷进行装载会将存储桶内容以文件的形式呈现在容器文件系统中。将存储桶作为卷装载后,您可以使用编程语言的文件系统操作和库(而不是使用 Google API 客户端库)来访问该存储桶,就像访问本地文件系统上的目录一样。
内存要求
Cloud Storage 卷装载使用 Cloud Run 容器内存执行以下活动:对于所有 Cloud Storage FUSE 缓存,Cloud Run 默认使用存留时间 (TTL) 为 60 秒的统计信息缓存设置。统计信息缓存的默认大小上限为 32 MB,类型缓存的默认大小上限为 4 MB。
读取时,Cloud Storage FUSE 还会消耗统计信息和类型缓存以外的内存,例如,为每个所读取的文件和 goroutine 使用 1 MiB 的数组。
写入 Cloud Storage 时,整个文件会先暂存到 Cloud Run 内存中,然后文件才会写入 Cloud Storage。
限制
Cloud Run 使用 Cloud Storage FUSE 进行此卷装载。因此,在将 Cloud Storage 存储桶作为卷进行装载时,有一些注意事项:
- Cloud Storage FUSE 不会为对同一文件的多次写入提供并发控制(文件锁定)。如果多次写入操作尝试替换某个文件,则最后一次写入的内容会生效,而先前写入的所有内容都会丢失。
- Cloud Storage FUSE 不是完全符合 POSIX 标准的文件系统。如需了解详情,请参阅 Cloud Storage FUSE 文档。
准备工作
您需要一个 Cloud Storage 存储桶来作为卷进行装载。
为了获得更好的读写性能,我们建议您使用直接 VPC 将 Cloud Run 服务连接到 VPC 网络,并通过 VPC 网络路由所有出站流量。请参阅“网络最佳实践”页面中示例 2:发送到 Google API 的内部流量中的说明。所需的角色
如需获得配置 Cloud Storage 卷装载所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
Cloud Run 服务的 Cloud Run Developer (
roles/run.developer
) 角色 -
服务身份的 Service Account User (
roles/iam.serviceAccountUser
) 角色
如需获得服务身份访问文件和 Cloud Storage 存储桶所需的权限,请让您的管理员为服务身份授予以下 IAM 角色:
- Storage Admin (
roles/storage.admin
)
如需详细了解 Cloud Storage 角色和权限,请参阅适用于 Cloud Storage 的 IAM。
如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色和 Cloud Run IAM 权限。如果您的 Cloud Run 服务与 Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限和管理访问权限。
不允许的路径
Cloud Run 不允许您在 /dev
、/proc
和 /sys
或其子目录上装载卷。
装载 Cloud Storage 卷
您可以在不同的装载路径中装载多个存储桶。您还可以跨容器使用相同或不同的装载路径将卷装载到多个容器。
如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载。
卷装载需要第二代执行环境。如果未明确配置执行环境,则 Cloud Run 会自动为您的服务选择第二代执行环境。
控制台
在 Google Cloud 控制台中,前往 Cloud Run:
如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本。
如果您要配置新服务,请根据需要填写初始服务设置页面,然后点击容器、网络、安全性以展开服务配置页面。
点击卷标签页。
- 点击添加卷。
- 在卷类型下拉列表中,选择 Cloud Storage 存储桶作为卷类型。
- 在卷名称字段中,输入要用于卷的名称。
- 浏览并选择要用于卷的 Cloud Storage 存储桶,或视需要创建新的存储桶。
- 如果您要将存储桶设为只读,请选中“只读”复选框。
- 点击完成。
- 点击卷装载标签页。
- 点击装载卷。
- 从菜单中选择存储卷。
- 指定您要用于装载卷的路径。
- 点击完成。
点击创建或部署。
gcloud
注意:我们会显示 gcloud beta run services update
命令,但您也可以将 gcloud beta run deploy
命令与如下所示的参数结合使用。
如需添加卷并装载,请运行以下命令:
gcloud beta run services update SERVICE \ --add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH
您需要将其中的:
- 将 SERVICE 替换为您的服务名称。
- MOUNT_PATH 替换为您用于装载卷的相对路径,例如
/mnt/my-volume
。 - 将 VOLUME_NAME 替换为您要用于卷的任何名称。VOLUME_NAME 值用于将卷映射到卷装载。
- 将 BUCKET_NAME 替换为 Cloud Storage 存储桶的名称。
如需将卷装载为只读卷,请运行以下命令:
--add-volume=name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME,readonly=true
如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载:
gcloud beta run services update SERVICE \ --add-volume name=VOLUME_NAME,type=cloud-storage,bucket=BUCKET_NAME \ --container CONTAINER_1 \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH \ --container CONTAINER_2 \ --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH2
YAML
如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置:
gcloud run services describe SERVICE --format export > service.yaml
请根据需要进行更新。
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE annotations: run.googleapis.com/launch-stage: BETA spec: template: metadata: annotations: run.googleapis.com/execution-environment: gen2 spec: containers: - image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME csi: driver: gcsfuse.run.googleapis.com readOnly: IS_READ_ONLY volumeAttributes: bucketName: BUCKET_NAME
替换
- 将 IMAGE_URL 替换为对容器映像的引用,例如
us-docker.pkg.dev/cloudrun/container/hello:latest
。 如果您使用 Artifact Registry,则必须预先创建制品库 REPO_NAME。网址格式为LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
- 将 MOUNT_PATH 替换为您用于装载卷的相对路径,例如
/mnt/my-volume
。 - 将 VOLUME_NAME 替换为您要用于卷的任何名称。VOLUME_NAME 值用于将卷映射到卷装载。
- 将 IS_READ_ONLY 替换为
True
以将卷设为只读,或替换为False
以允许写入。 - 将 BUCKET_NAME 替换为 Cloud Storage 存储桶的名称。
- 将 IMAGE_URL 替换为对容器映像的引用,例如
使用以下命令将服务替换为其新配置:
gcloud run services replace service.yaml
读取和写入卷
如果您使用 Cloud Run 卷装载功能,则可以使用编程语言中用于在本地文件系统上读写文件的相同库来访问已装载的卷。
如果您使用的是期望数据存储在本地文件系统中并使用常规文件系统操作来访问数据的现有容器,此方法会特别有用。
以下代码段假定一个 mountPath
设置为 /mnt/my-volume
的卷装载。
Nodejs
使用文件系统模块创建新文件或附加到卷 /mnt/my-volume
中的现有文件:
var fs = require('fs'); fs.appendFileSync('/mnt/my-volume/sample-logfile.txt', 'Hello logs!', { flag: 'a+' });
Python
写入保存在卷 /mnt/my-volume
中的文件:
f = open("/mnt/my-volume/sample-logfile.txt", "a")
Go
使用 os
软件包创建一个保存在卷 /mnt/my-volume
中的新文件
f, err := os.Create("/mnt/my-volume/sample-logfile.txt")
Java
使用 Java.io.File
类在卷 /mnt/my-volume
中创建日志文件:
import java.io.File; File f = new File("/mnt/my-volume/sample-logfile.txt");
查看卷装载设置
如需查看 Cloud Run 服务的当前卷装载设置,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往 Cloud Run:
点击您感兴趣的服务以打开“服务详细信息”页面。
点击修订版本标签页。
在右侧的详细信息面板中,卷标签页下列出了卷装载设置。
gcloud
使用以下命令:
gcloud run services describe SERVICE
在返回的配置中找到卷装载设置。