为 Cloud Run 工作器池配置临时磁盘

Cloud Run 提供了一个仅在实例运行期间保持持久性的临时磁盘卷。借助此功能,您可以指定所需的磁盘空间量以及装载位置。然后,Cloud Run 会为您的资源分配相应数量的磁盘空间。

磁盘在启动时会自动预配、预格式化为 ext4,并使用特定于实例的密钥进行加密。临时磁盘会创建卷,以便任何用户都可以读取或写入该卷。由于存储空间是临时性的,因此当实例关闭时,所有数据都会被永久删除。这包括由以下原因导致的关闭:

  • 实例崩溃
  • 将流量迁移到新修订版本

磁盘专用于特定实例,不会与其他实例或修订版本共用。 您可以控制文件系统结构,并为每个卷配置装载点。

在关停实例之前,Cloud Run 会向实例中的所有容器发送一个 SIGTERM 信号,指示实例将于 10 秒后进行实际的关停,届时 Cloud Run 则会发送一个 SIGKILL 信号。您可以使用这 10 秒的时间窗口来执行清理操作,例如执行最后一轮将磁盘内容复制到持久性存储空间的操作。

使用场景

您可以将临时磁盘用于以下用途:

  • 数据处理工作负载:在 Cloud Run 中处理大型数据文件时,您通常会将整个文件存储在内存中,或者安排将其拆分为更小的部分。借助临时存储,您无需为大量内存付费即可创建数据的临时本地副本。您还将能够处理更大的数据集。
  • 缓存:在 Web 服务用例中,将数据缓存到磁盘上而不是从远程存储空间提取数据可以优化应用的延迟时间。

存储空间和实例限制

适用的限制如下:

  • 实例存储空间上限:默认情况下,每个实例的总空间上限为 10 GB。 如有必要,请申请增加配额
  • 实例卷数限制:每个实例最多只能有 10 个卷。
  • 项目限额:默认情况下,每个项目在每个区域的限额为 100 GB。 如有必要,请申请增加配额

申请增加配额

首次在某个区域中使用 Cloud Run 临时磁盘的项目会自动被授予以下配额:每个实例每个区域 10 GB,每个项目每个区域 100 GB。

如果您需要更多容量,则必须为 Cloud Run 工作线程池申请增加配额。点击以下按钮中提供的链接可申请所需的配额。

当前配额 配额链接
每个实例 10 GB 申请增加每个实例的配额
每个项目 100 GB 申请提高每个项目的配额

如需详细了解如何申请增加配额,请参阅如何增加配额

限制

临时磁盘仅在第二代执行环境中可用。默认情况下,Cloud Run 工作器池使用第二代执行环境

不允许的路径

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

支持的区域

临时磁盘功能可在以下区域使用:

准备工作

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. 安装并初始化 gcloud CLI。
  7. 更新组件:
    gcloud components update
  8. 如需了解 CPU、内存和网络出站流量价格,请查看 Cloud Run 价格页面。预配磁盘的整个大小以及使用该磁盘的实例的生命周期都会影响您的费用。

所需的角色

如需获得配置临时磁盘所需的权限,请让管理员向您授予以下 IAM 角色:

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

创建并装载临时磁盘

您可以使用 Google Cloud 控制台或 Google Cloud CLI 创建并装载临时磁盘:

控制台

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

    转到 Cloud Run

  2. 从菜单中选择工作器池,然后点击部署容器以配置新的工作器池。如果您要配置现有工作器池,请点击该工作器池,然后点击修改和部署新的修订版本

  3. 如果您要配置新的工作器池,请填写初始工作器池页面,然后点击容器、网络、安全性以展开工作器池配置页面。

  4. 点击容器标签页。

    图片

    • 资源下:
      • 点击装载卷
      • 选择临时磁盘
      • 输入装载路径。
      • 从菜单中指定临时磁盘大小。
  5. 点击创建部署

gcloud

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

gcloud beta run worker-pools update WORKERPOOL \
    --add-volume=name=VOLUME_NAME,type=ephemeral-disk,size=SIZE \
    --add-volume-mount=volume=VOLUME_NAME,mount-path=MOUNT_PATH

替换以下内容:

  • WORKERPOOL:工作器池的名称。
  • VOLUME_NAME:您要为卷指定的名称。
  • SIZE:磁盘大小,例如 100Gi。对于 ephemeral-disk 卷,大小必须至少为 10Gi
  • MOUNT_PATH:您用于装载卷的相对路径,例如 /mnt/my-volume

读取和写入卷

如果您使用 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");

清除并移除卷和卷装载

您可以清除所有卷和卷装载,也可以移除个别卷和卷装载。

清除所有卷和卷装载

如需从单容器工作器池中清除所有卷和卷装载,请运行以下命令:

gcloud run worker-pools update WORKER_POOL \
    --clear-volumes
    --clear-volume-mounts

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

gcloud 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 run worker-pools update WORKER_POOL \
    --remove-volume VOLUME_NAME \
    --container=container1 \
    --remove-volume-mount MOUNT_PATH \
    --container=container2 \
    --remove-volume-mount MOUNT_PATH

最佳做法

请遵循以下最佳实践,以有效管理临时数据并优化存储性能。

复制到永久性存储空间

如果您打算将临时磁盘内容复制到永久性存储空间(例如 Cloud Storage 存储桶),我们建议您以增量方式复制,而不是依赖于 10 秒的 SIGTERMSIGKILL 宽限期。如需详细了解实例关闭,请参阅容器运行时合同

Cloud Run 可以读取和写入 Cloud Storage,而无需进行任何额外的网络设置。为实现最佳性能,我们建议使用直接 VPC 通过 VPC 网络路由进出 Cloud Storage 的流量。

如果您不需要 Cloud Run 资源访问互联网,则此方法适用。如果您确实需要访问互联网,请设置 Cloud NAT,或参阅流向 Google API 的内部流量

如需为作业配置直接 VPC 出站流量,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往 Cloud Run 页面。

    转到 Cloud Run

  2. 从菜单中选择工作器池,然后点击部署容器以配置新的工作器池。如果您要配置现有工作器池,请点击该工作器池,然后点击修改和部署新的修订版本

  3. 如果您要配置新的工作器池,请填写初始工作器池页面,然后点击容器、网络、安全性以展开工作器池配置页面。

  4. 点击网络标签页。

  5. 选择连接到 VPC

  6. 对于流量路由,选择将所有流量路由到 VPC,以通过 VPC 网络发送所有出站流量。

  7. 点击创建部署

    现在,您可以根据防火墙规则允许将来自 Cloud Run 工作器池的请求发送到 VPC 网络上的任何资源。

  8. 在您连接到的子网上启用专用 Google 访问通道

问题排查

如果您在将大量数据下载到临时磁盘时发现网络速度缓慢,请按照相应步骤启用 Direct VPC。如果未启用直接 VPC,您会发现网络传输速度较慢。