将专用 Persistent Disk 用作临时卷


本页面介绍如何将外部存储硬件(例如 Compute Engine 永久性磁盘)用作 Google Kubernetes Engine (GKE) 工作负载中的临时卷。您应该已熟悉 Kubernetes StorageClass

何时在 Kubernetes 中使用临时存储空间

临时存储适用于工作负载仅在应用生命周期内需要数据的任何情况,例如数据处理流水线、机器学习作业、批处理、本地缓存或分析。默认情况下,GKE 节点启动磁盘的一部分可用作 Pod 中的临时存储空间。这种方法通常需要仔细规划空间。

借助 Kubernetes 通用临时卷,您可以使用 PersistentVolumeClaim 明确请求 Pod 的临时存储空间。GKE 会动态预配 Compute Engine 永久性磁盘,并将这些磁盘挂接到您的节点。此类临时存储在以下情况下非常有用:

  • 您的工作负载具有高性能要求,因此您需要控制存储硬件。
  • 您需要特定于容器的短期临时存储。
  • 您需要避免使用 emptyDir 来预配临时存储空间。如果您希望多个容器共享临时存储中的数据,则 emptyDir 卷仍然很有用。
  • 您需要比 GKE 内置默认值更多的临时存储容量。
  • 您需要避免为标准模式 GKE 集群提前规划节点启动磁盘大小和类型。

GKE 中的临时存储空间类型

通常,您可以使用启动磁盘存储容量或专用永久性磁盘作为 Pod 和容器中的临时存储。下表介绍了它们之间的差异:

存储类型 使用方法 说明
启动磁盘 - 永久性磁盘

在 Pod 规范中使用 emptyDir 装载卷并请求所需的容量。

如需了解相关说明,请参阅创建卷

所请求的临时存储空间取自节点启动磁盘的预留部分。这是 Autopilot 和标准集群中的默认设置。

如果 pod 具有较小的临时存储请求或您想要在 pod 中的多个容器之间共享临时数据,请使用此类型。

Autopilot

  • 请求必须介于 10 MiB 到 10 GiB 之间。
  • 存储硬件类型已预先配置。

Standard

没有大小限制,但需要仔细规划节点启动磁盘大小和存储硬件类型。

如需详细了解 GKE 如何计算节点启动磁盘中的临时存储预留,请参阅本地临时存储预留

本地 SSD 磁盘数量
  1. 创建挂接了本地 SSD 磁盘和兼容机器系列的节点池。
  2. 使用具有所需容量的 emptyDir 装载卷。
  3. 使用 nodeSelector 将 Pod 放置在挂接了本地 SSD 磁盘的节点上。

如需了解相关说明,请参阅使用本地 SSD 预配临时存储空间

本地 SSD 磁盘使用固定的 375 GB 增量,标准模式 GKE 集群和运行 A100 (80 GB) GPU 的 Autopilot 节点支持该增量。

如果您需要具有高吞吐量的临时存储,请使用此类型。

如需了解详情,请参阅关于 GKE 的本地 SSD

专用永久性磁盘
  1. (可选)为硬件创建一个 Kubernetes StorageClass。
  2. 在 Pod 规范中使用 ephemeral 卷类型装载卷。

本文档介绍了如何请求此临时存储类型。

Google Cloud 会动态预配请求的外部硬件,将其挂接到您的节点,并将请求的卷装载到 Pod 中。

如果 Pod 具有大型临时存储请求或想要控制底层永久性磁盘类型,请使用此类型。这些卷具有以下属性:

  • 在 Autopilot 模式和标准模式下高达 64 TiB
  • 支持专用硬件(例如基于 SSD 的卷)。
  • 网络附加存储
  • 使用 Kubernetes 卷来获取存储空间,而不是使用 emptyDir 来共享节点启动磁盘。

如需详细了解此临时卷类型,请参阅通用临时卷

价格

您通过本指南中所述的通用临时卷预配的存储空间根据 Compute Engine 磁盘价格计费。

须知事项

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行 gcloud components update 以获取最新版本。
  • 确保您拥有运行 1.23 或更高版本的 GKE Autopilot 或 Standard 集群。
  • 确保您的 Google Cloud 项目中有足够的配额来提供给存储硬件。如需管理您的配额,请参阅查看项目的配额

创建一个 StorageClass

通过创建自定义 Kubernetes StorageClass,您可以根据价格和性能要求指定要预配的存储类型。这是可选步骤,但建议您执行此步骤。如果要使用 GKE 默认 StorageClass(具有 pd-balanced 永久性磁盘类型),请跳过此步骤。

  1. 将以下清单保存为 ephemeral-pd-class.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ephemeral-ssd
    provisioner: pd.csi.storage.gke.io
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    parameters:
      type: STORAGE_TYPE
    

    STORAGE_TYPE 替换为所需的永久性磁盘类型的名称,例如 pd-ssd。如需查看支持的类型列表,请参阅 Compute Engine 文档中的永久性磁盘类型

  2. 创建 StorageClass:

    kubectl create -f ephemeral-pd-class.yaml
    

在 Pod 中请求临时存储容量

如需预配、挂接外部硬件并用作临时存储空间,请将相应的卷添加到 Pod 清单,并将卷装载添加到容器规范中。

  1. 将以下清单保存为 ephemeral-ssd-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ephemeral-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          storage: ephemeral
      template:
        metadata:
          labels:
            storage: ephemeral
        spec:
          containers:
          - name: ephemeral-container
            image: nginx
            resources:
              requests:
                cpu: 500m
                memory: 2Gi
                ephemeral-storage: 2Gi
            volumeMounts:
            - mountPath: "/short-term"
              name: ephemeral-volume
          volumes:
          - name: ephemeral-volume
            ephemeral:
              volumeClaimTemplate:
                metadata:
                  labels:
                    type: ephemeral
                spec:
                  accessModes: ["ReadWriteOnce"]
                  storageClassName: "ephemeral-ssd"
                  resources:
                    requests:
                      storage: 1Ti
    

    此清单会创建一个新的 Kubernetes PersistentVolumeClaim,用于请求名为 ephemeral-volume 且具有以下属性的新 PersistentVolume:

    • spec.volumes.ephemeralephemeral 卷类型。
    • .spec.accessModes:卷访问模式,用于确定 Pod 的读写权限和节点之间的卷共享。本示例使用 ReadWriteOnce,它会将 PersistentVolume 装载到单个节点,以供节点上的一个或多个 Pod 访问。如需了解详情,请参阅访问模式
    • .spec.storageClassName:(可选)您创建的 StorageClass 的名称。如果省略此字段,GKE 会使用默认 StorageClass 并预配 pd-balanced 永久性磁盘。
    • .spec.resources.requests.storage:所需的存储空间容量。
  2. 创建 Deployment:

    kubectl create -f ephemeral-ssd-deployment.yaml
    

GKE 预配一个满足 PersistentVolumeClaim 要求的 Compute Engine 磁盘,并将该磁盘挂接到节点。GKE 会将卷装载到 Pod 中,并为容器提供请求的容量。

验证 GKE 是否已装载临时卷

  1. 在 Pod 中创建 shell 会话:

    kubectl exec -it deploy/ephemeral-deployment -- bash
    
  2. 检查装载的卷:

    df -h

    输出类似于以下内容:

    Filesystem                Size      Used Available Use% Mounted on
    ...
    /dev/sdb               1006.9G     28.0K   1006.8G   0% /short-term
    /dev/sda1                94.3G      3.6G     90.6G   4% /etc/hosts
    /dev/sda1                94.3G      3.6G     90.6G   4% /dev/termination-log
    /dev/sda1                94.3G      3.6G     90.6G   4% /etc/hostname
    /dev/sda1                94.3G      3.6G     90.6G   4% /etc/resolv.conf
    ...
    
  3. 退出 shell 会话:

    exit
    

后续步骤