内存卷(服务)

本页面介绍了如何配置可用于文件读写的专用内存卷。

此功能与 Cloud Run 提供的内置内存文件系统不同,后者不会限制内存文件写入消耗的内存。使用内存卷时,您可以限制可消耗的内存量。

行为

为 Cloud Run 服务配置内存卷后,系统会为启动的每个 Cloud Run 实例创建一个空卷,只要该实例正在运行,就会存在空卷。当实例停止运行时,卷中的数据会被永久删除。

如果您为内存卷指定了限制,然后在写入卷时超出该限制,则会收到内存不足错误,您可以处理该错误,并且实例将继续运行。如果您没有指定卷大小限制,然后在写入卷时超出实例内存限制,则实例将崩溃。

卷所有权因执行环境和部署类型而异

装载卷时,拥有文件和目录的身份将因工作负载的执行环境以及部署是包含一个或多个容器而有所不同。

在要部署单个容器的第一代执行环境中,卷归容器使用的身份所有。 在所有其他情况下,卷归 root 用户所有。包括:

  • 在其中部署多个容器的第一代执行环境
  • 第二代环境

使用场景

内存卷的用例包括分配暂存空间或为长时间运行的计算设置检查点以防止崩溃。

配置内存卷

任何配置更改都会导致新修订版本的创建。后续修订版本也将自动采用此配置设置,除非您进行了明确更新。

如果您为卷指定内存大小限制,则系统将从访问此卷的实例中所有各个容器所使用的内存分配内存。如果您指定的内存卷大小大于实例中容器使用的所有内存的总和,则卷默认为容器使用的总和。

如果您没有为卷指定内存大小限制,则可能会超出实例内存限制并使实例崩溃。

如果您在多容器部署中将内存卷用作共享卷,且未指定内存大小限制,则总可用实例内存的一半将分配给共享卷。例如,emptyDir 卷大小 = [内存(容器 A)+ 内存(容器 B)+ 内存(容器 N)]/2。

控制台

  1. 转到 Cloud Run

  2. 点击您要配置的服务。

  3. 点击 YAML 标签页。

  4. 配置 volumeMountsvolumes 属性,如下所示:

    apiVersion: serving.knative.dev/v1
      kind: Service
      metadata:
      annotations:
        run.googleapis.com/launch-stage: BETA
        name: SERVICE
      spec:
        template:
          metadata:
          spec:
            containers:
            - image: IMAGE_URL
              volumeMounts:
              - mountPath: PATH
                name: VOLUME_NAME
            volumes:
            - name: VOLUME_NAME
              emptyDir:
                sizeLimit: SIZE_LIMIT
                medium: Memory

    替换

    • SERVICE 替换为您的 Cloud Run 服务的名称。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建工件库 REPO_NAME。网址的形状为 REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH 替换为卷的相对路径,例如 /cache
    • VOLUME_NAME 替换为要用于内存卷的名称。
    • SIZE_LIMIT 替换为您要分配给卷的内存限制,以 MiB 或 GiB 为单位(指定为 Mi 或 Gi),例如 500Mi。此限制必须小于为容器指定的总内存
  5. 点击保存并部署新的修订版本

YAML

您可以使用 gcloud run services describe --format export 命令下载并查看现有服务配置,该命令会生成清理后的 YAML 格式的结果。然后按照后续说明修改字段,最后使用 gcloud run services replace 命令上传修改后的 YAML。请务必严格按照说明修改字段。

  1. 如需查看和下载配置,请运行以下命令:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 配置 volumeMountsvolumes 属性,如下所示:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
     annotations:
      run.googleapis.com/launch-stage: BETA
      name: SERVICE
    spec:
      template:
        metadata:
        spec:
          containers:
          - image: IMAGE_URL
            volumeMounts:
            - mountPath: PATH
              name: VOLUME_NAME
          volumes:
          - name: VOLUME_NAME
            emptyDir:
              sizeLimit: SIZE_LIMIT
              medium: Memory

    您需要将其中的:

    • SERVICE 替换为您的 Cloud Run 服务的名称。
    • IMAGE_URL 替换为对容器映像的引用,例如 us-docker.pkg.dev/cloudrun/container/hello:latest。 如果您使用 Artifact Registry,则必须预先创建工件库 REPO_NAME。网址的形状为 REGION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • PATH 替换为卷的相对路径,例如 /cache
    • VOLUME_NAME 替换为要用于内存卷的名称。
    • SIZE_LIMIT 替换为您要分配给卷的内存限制,以 MiB 或 GiB 为单位(指定为 Mi 或 Gi),例如 500Mi。此限制必须小于为容器指定的总内存
  3. 使用以下命令将服务替换为其新配置:

    gcloud run services replace service.yaml