配置用于服务的 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。

装载 NFS 卷

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

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

控制台

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

    转到 Cloud Run

  2. 如果您是要配置一个新服务来作为部署目标,请点击创建服务。如果您要配置现有服务,请点击该服务,然后点击修改和部署新的修订版本

  3. 如果您要配置新服务,请根据需要填写初始服务设置页面,然后点击容器、网络、安全性以展开服务配置页面。

  4. 点击标签页。

    图片

    • 下:
      • 点击添加卷
      • 卷类型下拉列表中,选择 NFS 作为卷类型。
      • 卷名称字段中,输入要用于卷的名称。
      • NFS 服务器字段中,输入 NFS 文件共享的域名或位置(格式为 IP_ADDRESS)。
      • 路径字段中,输入要装载的 NFS 服务器目录的路径。
      • 点击完成
    • 点击“容器”标签页,然后展开要将卷装载到的容器,以修改该容器。
    • 点击卷装载标签页。
    • 点击装载卷
      • 从菜单中选择 NFS 卷。
      • 指定您要用于装载卷的路径。
      • 点击装载卷
  5. 点击创建部署

gcloud

注意:我们会显示 gcloud beta run services update 命令,但您也可以将 gcloud beta run services deploy 令与如下所示的参数结合使用。

  • 如需添加卷并装载,请运行以下命令:
gcloud beta run services update SERVICE \
--add-volume=name=VOLUME_NAME,type=nfs,location=IP_ADDRESS:NFS_PATH \
--add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

您需要将其中的:

  • SERVICE 替换为您的服务名称。
  • VOLUME_NAME 替换为您要为卷指定的名称。
  • IP_ADDRESS 替换为 NFS 文件共享的位置。
  • NFS_PATH 替换为 NFS 文件共享的路径,以正斜杠开头,例如 /example-directory
  • MOUNT_PATH 替换为您用于装载卷的相对路径,例如 /mnt/my-volume
  • VOLUME_NAME 替换为您要用于卷的任何名称。VOLUME_NAME 值用于将卷映射到卷装载。

  • 如需将卷装载为只读卷,请运行以下命令:

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

    gcloud beta run services update SERVICE \
    --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

  1. 如果您要创建新的服务,请跳过此步骤。如果您要更新现有服务,请下载其 YAML 配置

    gcloud run services describe SERVICE --format export > service.yaml
  2. 根据需要更新 MOUNT_PATHVOLUME_NAMEIP_ADDRESSNFS_PATH。如果您有多个卷装载,则会拥有多个此类属性。

    apiVersion: run.googleapis.com/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
            nfs:
              server: IP_ADDRESS
              path: NFS_PATH
              readOnly: IS_READ_ONLY

    替换

    • SERVICE 替换为您的 Cloud Run 服务的名称
    • MOUNT_PATH 替换为您用于装载卷的相对路径,例如 /mnt/my-volume
    • VOLUME_NAME 替换为您要用于卷的任何名称。VOLUME_NAME 值用于将卷映射到卷装载。
    • IP_ADDRESS 替换为 NFS 文件共享的地址。
    • NFS_PATH 替换为 NFS 文件共享的路径,以正斜杠开头,例如 /example-directory
    • IS_READ_ONLY 替换为 True 以将卷设为只读,或替换为 False 以允许写入。
  3. 使用以下命令将服务替换为其新配置:

    gcloud beta 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");

排查 NFS 问题

如果您遇到问题,请检查以下各项:

  • 您的 Cloud Run 服务已连接到 NFS 服务器所在的 VPC 网络。
  • 没有防火墙规则阻止 Cloud Run 访问 NFS 服务器。
  • 如果您的容器将数据写入 NFS 服务器,请确保它以根用户身份运行。