本页面介绍了如何在 Cloud Run 中将 NFS 文件共享作为卷装载。 您可以使用任何 NFS 服务器,包括在本地或 Compute Engine 虚拟机上托管的您自己的 NFS 服务器。如果您还没有 NFS 服务器,我们建议您使用 Filestore,这是 Google Cloud提供的全托管式 NFS 产品。
在 Cloud Run 中将 NFS 文件共享作为卷进行装载会将文件共享以文件的形式呈现在容器文件系统中。将文件共享作为卷装载后,您可以使用编程语言的文件系统操作和库来访问该文件共享,就像访问本地文件系统上的目录一样。
限制
- Cloud Run 不支持 NFS 锁定。NFS 卷会自动以无锁定模式装载。
- 不允许使用的路径:Cloud Run 不允许您将卷装载到
/dev、/proc或/sys,以及它们的子目录。
准备工作
如需在 Cloud Run 中将 NFS 服务器作为卷装载,请确保您满足以下条件:
- 运行 NFS 服务器或 Filestore 实例的 VPC 网络。
- 在 VPC 网络中运行的 NFS 服务器,以及与该 VPC 网络连接的 Cloud Run 实例。如果您还没有 NFS 服务器,请通过 创建 Filestore 实例来创建一个。
- Cloud Run 实例已连接到运行 NFS 服务器的 VPC 网络。如需获得最佳性能,请使用 直接 VPC,而不是 VPC 连接器。
- 如果您使用的是现有项目,请确保 VPC 防火墙配置允许 Cloud Run 访问 NFS 服务器。(如果您从新项目开始,则默认为如此。)如果您使用 Filestore 作为 NFS 服务器,请按照 Filestore 文档创建防火墙出站流量规则,以便 Cloud Run 可以访问 Filestore。
- 设置远程 NFS 文件共享的权限,以允许容器的用户进行访问。默认情况下,Filestore 会向所有用户提供读取权限,但会将写入权限仅提供给根用户 (
uid 0)。如果您的容器需要写入权限,但不是以根用户身份运行,则必须使用连接的客户端(以根用户身份运行)来修改共享权限。例如,您可以使用chown命令将文件或目录的所有权更改为容器运行所用的特定用户 ID。
所需的角色
如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色 和 Cloud Run IAM 权限。 如果您的 Cloud Run 实例与 Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅 服务身份配置指南。 如需详细了解如何授予角色,请参阅 部署权限 和管理访问权限。
装载 NFS 卷
您可以在不同的装载路径中装载多个 NFS 服务器、Filestore 实例或其他卷类型。
如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载。
使用 Google Cloud CLI 或 YAML 配置 NFS 卷装载;
gcloud
如需添加卷装载,请运行以下命令:
gcloud beta run instances update INSTANCE \ --add-volume mount-path=MOUNT_PATH,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=READ_ONLY
替换以下内容:
- INSTANCE:实例的名称。
- MOUNT_PATH:您用于装载卷的相对路径,例如
/mnt/my-volume。 - IP_ADDRESS:NFS 文件共享的位置。
- NFS_PATH:NFS 文件共享的路径,以
正斜杠开头,例如
/example-directory。 - READ_ONLY:
true以将卷设为只读,或false以允许写入。
如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载:
gcloud beta run instances update INSTANCE \ --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \ --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 beta run instances describe INSTANCE --format export > instance.yaml
以下示例包含 YAML 配置:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE annotations: run.googleapis.com/launch-stage: BETA spec: containers: - name: CONTAINER_NAME image: IMAGE_URL volumeMounts: - name: VOLUME_NAME mountPath: MOUNT_PATH volumes: - name: VOLUME_NAME nfs: server: IP_ADDRESS path: NFS_PATH readOnly: IS_READ_ONLY
替换以下内容:
- INSTANCE:Cloud Run 实例的名称。
- CONTAINER_NAME:容器的名称。
IMAGE_URL:对容器映像的引用,例如us-docker.pkg.dev/cloudrun/container/hello:latest。- VOLUME_NAME:您要用于卷的任何名称。VOLUME_NAME 值用于将卷映射到卷装载。
- MOUNT_PATH:您用于装载卷的相对路径,例如
/mnt/my-volume。 - IP_ADDRESS:NFS 文件共享的地址。
- NFS_PATH:NFS 文件共享的路径,以正斜杠开头,例如
/example-directory。 - IS_READ_ONLY:
True以将卷设为只读,或False以允许写入。
使用以下命令创建或更新实例:
gcloud beta run instances replace instance.yaml
排查 NFS 问题
如果您遇到问题,请检查以下各项:
- 您的 Cloud Run 实例已连接到 NFS 服务器所在的 VPC 网络。
- 没有防火墙规则阻止 Cloud Run 访问 NFS 服务器。
- 如果您的容器需要写入数据,请确保 NFS 共享权限 配置为 允许容器的用户进行写入。
容器启动时间和 NFS 卷装载
使用 NFS 卷装载可能会略微增加 Cloud Run 容器的冷启动时间,因为卷装载是在启动容器之前启动的。只有在 NFS 成功装载后,容器才会启动。
请注意,只有在与服务器建立连接并提取文件句柄后,NFS 才会成功装载卷。如果 Cloud Run 无法与服务器建立连接,则 Cloud Run 实例将无法启动。
此外,由于 Cloud Run 执行所有装载操作的总超时时间为 30 秒,任何网络延迟都可能影响容器的启动时间。如果 NFS 的装载时间超过 30 秒,Cloud Run 实例将无法启动。
NFS 性能特性
如果您创建多个 NFS 卷,则所有卷都会并行装载。
由于 NFS 是网络文件系统,因此受带宽限制,并且对文件系统的访问可能会受到带宽限制的影响。
写入 NFS 卷时,写入内容将存储在 Cloud Run 内存中,直到数据被清空。在以下情况下会清空数据:
- 您的应用使用 sync(2)、msync(2) 或 fsync(3) 显式清空文件数据。
- 您的应用使用 close(2) 关闭文件。
- 内存压力会强制回收系统内存资源。
如需了解详情,请参阅 Linux 上的 NFS 文档。
清除并移除卷和卷装载
您可以清除所有卷和卷装载,也可以移除个别卷和卷装载。
清除所有卷和卷装载
如需从单容器实例中清除所有卷和卷装载,请运行以下命令:
gcloud beta run instances update INSTANCE \ --clear-volumes \ --clear-volume-mounts
移除个别卷和卷装载
如需移除某个卷,您还必须移除使用该卷的所有卷装载。
如需移除个别卷或卷装载,请使用 remove-volume 和 remove-volume-mount 标志:
gcloud beta run instances update INSTANCE \ --remove-volume VOLUME_NAME \ --container=container1 \ --remove-volume-mount MOUNT_PATH \ --container=container2 \ --remove-volume-mount MOUNT_PATH