将专用 Persistent Disk 用作临时卷


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

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

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

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

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

GKE 中的临时存储空间类型

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

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

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

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

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

当 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,您可以根据价格和性能要求指定要预配的存储类型。这是可选步骤,但建议您执行此步骤。如果您想使用具有 pd-balanced 永久性磁盘类型的 GKE 默认 StorageClass,请跳过此步骤。

  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
    

后续步骤