为工作器池配置 NFS 卷装载

本页面介绍了如何在 Cloud Run 中将 NFS 文件共享作为卷装载。您可以使用任何 NFS 服务器,包括在本地或 Compute Engine 虚拟机上托管的您自己的 NFS 服务器。如果您还没有 NFS 服务器,我们建议您使用 Filestore,这是 Google Cloud提供的全托管式 NFS 产品。

如果要使用 NDB、9P、CIFS/Samba 和 Ceph 网络文件系统,请参阅使用 NDB、9P、CIFS/Samba 和 Ceph 网络文件系统

在 Cloud Run 中将 NFS 文件共享作为卷进行装载会将文件共享以文件的形式呈现在容器文件系统中。将文件共享作为卷装载后,您可以使用编程语言的文件系统操作和库来访问该文件共享,就像访问本地文件系统上的目录一样。

不允许的路径

Cloud Run 不允许您将卷挂载到 /dev/proc/sys,以及它们的子目录。

限制

  • 如需将数据写入 NFS 卷,容器必须以根用户身份运行。如果容器仅从文件系统中读取数据,则可以以任何用户身份运行。

  • Cloud Run 不支持 NFS 锁定。NFS 卷会自动以无锁定模式装载。

准备工作

如需在 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。

所需的角色

如需查看与 Cloud Run 关联的 IAM 角色和权限的列表,请参阅 Cloud Run IAM 角色Cloud Run IAM 权限。如果您的 Cloud Run 工作器池与Google Cloud API(例如 Cloud 客户端库)进行交互,请参阅服务身份配置指南。如需详细了解如何授予角色,请参阅部署权限管理访问权限

装载 NFS 卷

您可以在不同的装载路径中装载多个 NFS 服务器、Filestore 实例或其他卷类型。

如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载。

创建新的工作器池部署新的修订版本时,使用 Google Cloud CLI 配置 NFS 卷装载。

gcloud

  • 如需添加卷并装载,请运行以下命令:

    gcloud beta run worker-pools update WORKER_POOL \
    --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
    --add-volume-mount volume=VOLUME_NAME,mount-path=MOUNT_PATH

    您需要进行如下替换:

    • WORKER_POOL 替换为工作器池的名称。
    • VOLUME_NAME 替换为您要为卷指定的名称。
    • IP_ADDRESS 替换为 NFS 文件共享的位置。
    • NFS_PATH 替换为 NFS 文件共享的路径,以正斜杠开头,例如 /example-directory
    • MOUNT_PATH 替换为您用于装载卷的相对路径,例如 /mnt/my-volume
    • VOLUME_NAME 替换为您要用于卷的任何名称。卷名称值用于将卷映射到挂载路径。
  • 如需将卷装载为只读卷,请运行以下命令:

    --add-volume name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH,readonly=true
  • 如果您使用多个容器,请先指定卷,然后为每个容器指定卷装载:

    gcloud beta run worker-pools update WORKER_POOL \
    --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

查看工作器池的环境变量配置

  1. 在 Google Cloud 控制台中,前往 Cloud Run:

    转到 Cloud Run

  2. 点击工作器池以显示已部署的工作器池列表。

  3. 点击要检查的工作器池,以显示其详情窗格。

  4. 点击容器标签页以显示工作器池容器配置。

排查 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 worker-pools update WORKER_POOL \
    --clear-volumes
    --clear-volume-mounts

如果您有多个容器,请遵循边车 CLI 惯例来清除卷和卷装载:

gcloud beta run worker-pools update WORKER_POOL \
    --container=container1 \
    --clear-volumes
    -–clear-volume-mounts \
    --container=container2 \
    --clear-volumes \
    -–clear-volume-mounts

移除个别卷和卷装载

如需移除卷,您还必须移除使用该卷的所有卷装载。

如需移除个别卷或卷装载,请使用 remove-volumeremove-volume-mount 标志:

gcloud beta run worker-pools update WORKER_POOL \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH