使用 GKE Volume Populator 自动将数据从 Cloud Storage 转移到 Hyperdisk ML 卷

本指南介绍了如何使用 GKE Volume Populator 在动态预配期间将大量数据从 Cloud Storage 存储分区预加载到 Google Kubernetes Engine (GKE) Hyperdisk ML 卷。如需了解详情,请参阅 GKE Volume Populator 简介

本指南适用于负责创建和分配存储空间以及管理数据安全性和访问权限的存储专家。如需详细了解我们在 Trusted Cloud by S3NS 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务

使用 Hyperdisk ML 的 GKE Volume Populator 的节点池管理

高效的节点池大小调整、预配和扩缩对于成功运行由 GKE Volume Populator 创建的用于填充 Hyperdisk ML 卷的数据传输作业至关重要。您可以使用计算类来定义这些特定数据传输作业的节点要求,例如机器类型和大小。借助计算类,您可以控制数据传输过程的费用和性能。如需了解详情,请参阅自定义计算类的优势

如需选择最适合数据传输作业的集群,请了解计算类如何与 Hyperdisk ML 的不同集群类型搭配使用

目标

在本指南中,您将执行以下任务:

准备工作

请确保您已执行以下任务:

  1. 启用 GKE 和 Cloud Storage API。

    启用 API

  2. 确保您的Trusted Cloud by S3NS 项目已启用结算功能

  3. 下载并安装 Google Cloud CLI 命令行工具,或使用 Cloud Shell 运行 gcloud CLIkubectl 命令。Cloud Shell 是一种 shell 环境,用于管理在 Trusted Cloud by S3NS上托管的资源。它预安装有 gcloudkubectl 命令行工具。

  4. 设置默认区域和地区

  5. 创建或使用现有的 Cloud Storage 存储分区。本指南假定您已有一个 Cloud Storage 存储分区,其中填充了模型训练数据。

  6. 在可能已明确停用该驱动程序的现有 Standard 集群上启用 Compute Engine Persistent Disk CSI 驱动程序。在新的 Autopilot 和 Standard 集群上,GKE 默认会启用该驱动程序。您创建的目标 Hyperdisk ML 存储必须由 Compute Engine Persistent Disk CSI 驱动程序管理。

  7. 在集群上启用 Workload Identity Federation for GKE。这样一来,GKE Volume Populator 使用的 Kubernetes 服务账号便可访问源 Cloud Storage 存储分区。如需了解详情,请参阅设置必要权限

要求

如需使用 GKE Volume Populator 转移数据,请满足以下要求:

  • 您的 GKE 集群必须运行 1.33.2-gke.4780000 版或更高版本。
  • GCPDataSource 自定义资源必须与您的 GKE 工作负载位于同一命名空间中。不支持跨不同命名空间的数据源。
  • 创建计算类时,选择受支持的虚拟机。确认您的项目有足够的配额用于您选择的机器类型。
  • gcs-to-hdml-compute-class 计算类名称是为转移作业预定义的,您在创建计算类时必须准确指定该名称。

费用

虽然使用 GKE Volume Populator 不会直接产生费用,但存储和数据传输会产生账单费用。相关间接费用包括:

  • GKE 使用的 Compute Engine 实例:用于运行数据传输作业的节点的费用。节点管理和费用影响因集群类型而异。如需了解详情,请参阅创建 GKE 集群中的相应集群类型。
  • 转移作业节点大小:为实现最佳转移性能,转移作业默认会扩缩具有 24 个 vCPU 的节点。此设置适用于所有集群类型。如果您想调整节点大小和类型以实现特定的费用或性能优化,可以在创建计算类时进行调整。
  • Cloud Storage 存储分区中使用的存储空间:如需了解详情,请参阅 Cloud Storage 价格
  • Hyperdisk ML 卷费用:包括您创建的 Hyperdisk ML 卷的存储容量和性能(IOPS/吞吐量)。如需了解详情,请参阅 Hyperdisk 价格

准备环境

在本部分中,您将创建具有相应硬件的 GKE 集群基础架构,并设置必要的权限以访问 Cloud Storage 中的数据。

在创建集群以将 GKE Volume Populator 与 Hyperdisk ML 搭配使用之前,请先了解计算类如何应用于不同类型的集群,以及由谁负责节点管理(GKE 还是您)。

计算类如何与 Hyperdisk ML 的不同集群类型搭配使用

GKE Volume Populator 使用自定义计算类来确定用于数据传输作业的节点类型。下表介绍了计算类的行为,具体取决于集群配置:

考虑因素 GKE Autopilot 和启用节点自动预配的 GKE Standard 启用节点自动预配的 GKE Standard
计算类设置 nodePoolAutoCreation 已启用 已停用“nodePoolAutoCreation
节点管理 GKE 会自动创建和管理节点。 您手动创建和管理节点。
节点扩缩 自动 手动
节点标签 不适用 您必须使用 cloud.google.com/compute-class=gcs-to-hdml-compute-class 为节点添加标签
更多信息 节点自动预配和计算类 配置手动创建的节点池

GKE 在为 PersistentVolumeClaim 预配 PersistentVolume 后,会启动数据传输作业。为了填充 Hyperdisk ML 卷,此 PersistentVolumeClaim 必须引用 GCPDataSource,后者用于定义 Cloud Storage 中的源数据。

创建 GKE 集群

您可以选择使用 GKE 版本 1.33.2-gke.4780000 或更高版本的标准集群或 Autopilot 集群来部署数据传输流水线。每种集群类型都有自己的优势和不同的价格模式。

  • 选择 Autopilot 可简化集群管理、提高成本效益并实现自动扩缩。
  • 如果您需要自动扩缩功能,同时又希望更好地控制节点预配,请选择启用节点自动预配功能的 Standard 模式。
  • 如果您需要最大限度的控制权,并且能够轻松管理节点预配、扩缩和维护的各个方面,请选择启用节点自动预配功能的标准集群。

Autopilot

在 GKE Autopilot 集群中,GKE 会自动处理数据传输作业所需的节点的创建和删除。传输作业完成后,节点资源会自动缩减。您无需手动删除传输 Pod 或运行这些 Pod 的节点。

如需创建新的 Autopilot 集群,请运行以下命令:

    gcloud container clusters create-auto CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=CLUSTER_VERSION
    

替换以下内容:

  • CLUSTER_NAME:您要创建的集群的名称。
  • LOCATION:集群的计算区域。例如 us-central1
  • CLUSTER_VERSION:集群的 GKE 版本。本指南中使用了 1.33.2-gke.4780000

Standard(启用节点自动预配)

启用了节点自动预配功能的 GKE 标准集群中,GKE 会自动处理数据传输作业所需的节点的创建和删除。传输作业完成后,节点资源会自动缩减。您无需手动删除传输 Pod 或运行这些 Pod 的节点。

如需创建启用了节点自动预配功能的新标准集群,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --cluster-version=CLUSTER_VERSION \
        --location=LOCATION \
        --project=PROJECT_ID \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --enable-autoprovisioning \
        --min-cpu MINIMUM_CPU \
        --min-memory MINIMUM_MEMORY \
        --max-cpu MAXIMUM_CPU \
        --max-memory MAXIMUM_MEMORY \
    --autoprovisioning-scopes=https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring,https://www.googleapis.com/auth/devstorage.read_only
    

替换以下内容:

  • CLUSTER_NAME:您要创建的已启用节点自动预配功能的集群的名称。
  • CLUSTER_VERSION:集群的 GKE 版本。本指南中使用了 1.33.2-gke.4780000
  • LOCATION:集群的计算可用区或区域。例如 us-central1-aus-central1
  • PROJECT_ID:您的 Trusted Cloud by S3NS 项目 ID。
  • MINIMUM_CPU:要自动配置的 vCPU 数量下限。例如 10
  • MINIMUM_MEMORY:要自动配置的最小内存量(以 GiB 为单位)。例如 200
  • MAXIMUM_CPU:要自动配置的 vCPU 数量上限。例如 100。此限制是指所有现有的手动创建的节点池以及 GKE 可能会自动创建的所有节点池的 CPU 资源总和。
  • MAXIMUM_MEMORY:要自动配置的最大内存量。例如 1000。此限制是指所有现有手动创建的节点池和 GKE 可能会自动创建的所有节点池的内存资源总和。

Standard(未启用节点自动预配)

如需在未启用节点自动预配的 Standard 集群上使用 GKE Volume Populator,您可以使用现有节点池或创建专用传输节点池。节点必须有足够的容量来运行转移作业,并且标签与 compute-class 相匹配。

创建集群和节点池时,将 gcs-to-hdml-compute-class 计算类指定为节点标签。请注意,计算类名称 gcs-to-hdml-compute-class 是为转移作业预定义的,必须完全按照此名称指定。

如需创建不启用节点自动预配功能的新标准集群,并在该集群中创建新的节点池,请运行以下命令:

    gcloud container clusters create CLUSTER_NAME \
        --cluster-version=CLUSTER_VERSION \
        --location=LOCATION \
        --num-nodes=1 \
        --project=PROJECT_ID \
        --workload-pool=PROJECT_ID.svc.id.goog

    gcloud container node-pools create NODE_POOL_NAME\
        --cluster=CLUSTER_NAME \
        --location=LOCATION \
        --num-nodes=1 \
        --machine-type=c3-standard-44 \
        --node-labels="cloud.google.com/compute-class=gcs-to-hdml-compute-class" \
        --node-taints="cloud.google.com/compute-class=gcs-to-hdml-compute-class:NoSchedule"
    

替换以下内容:

  • CLUSTER_NAME:您要创建的未启用节点自动预配功能的集群的名称。
  • CLUSTER_VERSION:集群的 GKE 版本。本指南中使用了 1.33.2-gke.4780000
  • LOCATION:集群的计算区域。例如 us-central1-aus-central1
  • PROJECT_ID 您的 Trusted Cloud by S3NS 项目 ID。
  • NODE_POOL_NAME:您要在新集群中创建的节点池的名称。GKE Volume Populator 使用此节点池来部署临时数据转移作业。

为避免产生不必要的费用,请在数据转移完成后运行 gcloud container node-pools delete 命令,以删除所有手动创建的转移节点池。

创建计算类

如需创建计算类来指定和优先选择可用作集群中节点的虚拟机类型,请按以下步骤操作:

  1. 将以下清单保存为 computeclass.yaml

    使用节点自动预配

    对于 Autopilot 集群和启用了节点自动预配功能的 Standard 集群,请使用 nodePoolAutoCreation 部分定义计算类,如下所示。启用节点自动预配功能后,GKE 会自动创建带有 gcs-to-hdml-compute-class 计算类标签的新节点池。

        apiVersion: cloud.google.com/v1
        kind: ComputeClass
        metadata:
          name: gcs-to-hdml-compute-class
        spec:
          priorities:
          - machineFamily: c3
          - machineFamily: c3d
          nodePoolAutoCreation:
            enabled: true
          whenUnsatisfiable: DoNotScaleUp
        

    未启用节点自动预配

    对于未启用节点自动预配功能的 Standard 集群,请不含 nodePoolAutoCreation 部分地定义计算类,如下所示。确保您已创建具有 gcs-to-hdml-compute-class 计算类标签的节点池

        apiVersion: cloud.google.com/v1
        kind: ComputeClass
        metadata:
          name: gcs-to-hdml-compute-class
        spec:
          priorities:
          - machineFamily: c3
          - machineFamily: c3d
          whenUnsatisfiable: DoNotScaleUp
        

    您可以指定任何兼容的 machineFamily,以满足您的数据转移需求。如需详细了解如何选择合适的机器类型,请参阅 Hyperdisk ML 的机器系列支持

  2. 如需创建计算类,请应用清单:
    kubectl apply -f computeclass.yaml

设置所需权限

如需从 Cloud Storage 存储分区转移数据,请为 Workload Identity Federation for GKE 设置所需权限。在获得适当的权限后,由 GKE Volume Populator 创建的转移作业可以访问您的 Cloud Storage 存储分区。本指南假定您已有一个 Cloud Storage 存储分区,其中填充了要转移的模型训练数据。

  1. 创建 Kubernetes 命名空间:

    kubectl create namespace NAMESPACE
    

    NAMESPACE 替换为您希望工作负载在其上运行的命名空间。

    如果您使用的是现有命名空间,请跳过此步骤。

  2. 创建 Kubernetes 服务账号:

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    替换以下内容:

    • KSA_NAME:您将在 GCPDataSource 资源中指定的 Kubernetes 服务账号的名称。由 GKE Volume Populator 创建的转移作业使用此服务账号向 Trusted Cloud by S3NS API 进行身份验证。
    • NAMESPACE:您在上一步中创建的 Kubernetes 命名空间。
  3. 向您的 IAM 服务账号授予适当的角色,以便其可以访问您的 Cloud Storage 存储分区:

    gcloud storage buckets \
        add-iam-policy-binding gs://GCS_BUCKET \
        --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
        --role "ROLE"
    

    替换以下内容:

    • GCS_BUCKET:您的 Cloud Storage 存储桶名称。
    • PROJECT_NUMBER:您在其中创建集群的 Trusted Cloud by S3NS 项目的数字标识符。如需查找项目编号,请参阅标识项目
    • PROJECT_ID:您的 Trusted Cloud by S3NS 项目 ID。
    • NAMESPACE:您之前创建的命名空间,工作负载将在其中运行。
    • KSA_NAME:您在 GCPDataSource 资源中指定的 Kubernetes 服务账号的名称。由 GKE Volume Populator 创建的转移作业使用此服务账号向 Trusted Cloud by S3NS API 进行身份验证。
    • ROLE:您要向服务账号授予的 IAM 角色。在本指南中,请授予 roles/storage.objectViewer 角色,以允许从存储分区读取数据。

    PROJECT_NUMBERPROJECT_IDNAMESPACEKSA_NAME 用于为您的项目构建 Workload Identity Federation for GKE 主账号标识符。

创建包含预加载数据的 Hyperdisk ML 卷

请执行以下步骤来设置创建 Hyperdisk ML 卷所需的 GKE 基础架构和配置,并使用 GKE Volume Populator 触发和管理自动数据转移流程:

  1. 创建 GCPDataSource 自定义资源以定义数据源。
  2. 创建 StorageClass 以定义要使用的永久性存储类型(Hyperdisk ML 卷)。
  3. 创建 PersistentVolumeClaim 以实现存储空间的动态预配,并允许访问新预配的 Hyperdisk ML 卷。
  4. (可选)查看数据转移进度
  5. 创建并部署使用 Hyperdisk ML 卷的 Pod。

创建 GCPDataSource 自定义资源

在 GKE 中创建 GCPDataSource 自定义资源,以指定源 Cloud Storage 存储分区的位置以及具有访问该存储分区所需权限的服务账号。此自定义资源定义 (CRD) 专用于 GKE Volume Populator。

  1. 将以下清单保存为 gcpdatasource.yaml

    apiVersion: datalayer.gke.io/v1
    kind: GCPDataSource
    metadata:
      name: GCP_DATA_SOURCE
      namespace: NAMESPACE
    spec:
      cloudStorage:
        serviceAccountName: KSA_NAME
        uri: gs://GCS_BUCKET/
    

    替换以下值:

    • GCP_DATA_SOURCE:包含对 Cloud Storage 存储桶的引用的 GCPDataSource CRD 的名称。如需了解详情,请参阅 GCPDataSource CRD 参考文档
    • NAMESPACE:工作负载运行所在的同一命名空间。GCPDataSource 自定义资源在此命名空间中创建。
    • KSA_NAME:您在 GCPDataSource 资源中指定的 Kubernetes 服务账号的名称。由 GKE Volume Populator 创建的转移作业使用此服务账号向 Trusted Cloud by S3NS API 进行身份验证。cloudStorage.serviceAccountName 值是您在设置所需权限部分中为 Workload Identity Federation for GKE 设置的 Kubernetes 服务账号。
    • GCS_BUCKET:您的 Cloud Storage 存储桶名称。 uri 字段用于指定源数据。
      • 如需复制整个存储分区,请使用 gs://GCS_BUCKET/
      • 如需从存储分区中的特定文件夹复制数据,请使用 gs://GCS_BUCKET/PATH_INSIDE_BUCKET/ 格式。例如,如需复制 my-project-llm-models 存储分区内 gemma/v1.0/weights/ 文件夹中的数据,URI 应为 gs://my-project-llm-models/gemma/v1.0/weights/。确保路径以尾随斜杠结尾,以指示文件夹。
  2. 如需创建 GCPDataSource 资源,请应用清单:

    kubectl apply -f gcpdatasource.yaml
    

创建 Hyperdisk ML StorageClass

创建一个使用 pd.csi.storage.gke.io 预配工具在所选可用区中预配 Hyperdisk ML 卷的 StorageClass。如果您希望能够在多个可用区中访问数据的副本,可以创建多可用区 StorageClass。以下是多可用区 StorageClass 的示例

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

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: hyperdisk-ml-single-zone
    parameters:
      type: hyperdisk-ml
      provisioned-throughput-on-create: "2400Mi"
    provisioner: pd.csi.storage.gke.io
    allowVolumeExpansion: false
    reclaimPolicy: Delete
    volumeBindingMode: Immediate
    allowedTopologies:
    - matchLabelExpressions:
      - key: topology.gke.io/zone
        values:
        - ZONE
    

    ZONE 替换为要在其中创建 Hyperdisk ML 卷的目标可用区:

    • 对于未启用节点自动预配功能的 GKE Standard 集群,ZONE 的值必须是您创建节点的位置。
    • 对于启用了节点自动预配的 GKE Autopilot 或 Standard 集群,ZONE 的值必须是集群可以扩缩并根据需要创建新节点的位置。
  2. (可选)如需列出集群的节点位置,请运行以下命令:

    gcloud container clusters describe CLUSTER_NAME --location=LOCATION --format="value(locations)"
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • LOCATION:集群的计算可用区或区域。例如 us-central1-aus-central1
  3. 如需创建 StorageClass,请应用清单:

    kubectl apply -f hdml-class.yaml
    

创建 PersistentVolumeClaim 以访问卷

以下清单展示了如何在 ReadOnlyMany 访问模式中创建引用您之前创建的 StorageClass 的 PersistentVolumeClaim 的示例。

  1. 将以下清单保存为 volume-populator-pvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: PVC_NAME
      namespace: NAMESPACE
    spec:
      accessModes:
      - ReadOnlyMany
      storageClassName: hyperdisk-ml-single-zone
      resources:
        requests:
          storage: DISK_SIZE
      dataSourceRef:
        apiGroup: datalayer.gke.io
        kind: GCPDataSource
        name: GCP_DATA_SOURCE
    

    替换以下值:

    • PVC_NAME:您要将数据转移到的 PersistentVolumeClaim 的名称。
    • NAMESPACE:工作负载将在其中运行的命名空间。
    • DISK_SIZE:将创建的用于填充数据的磁盘的大小(以 GB 为单位)。为确保成功填充数据,请确保所请求的磁盘大小大于 Cloud Storage 存储分区中模型数据的大小。为了符合 Hyperdisk ML 卷的支持范围,DISK_SIZE 的值必须大于 4 Gi。如需了解详情,请参阅 Hyperdisk 卷大小限制
    • GCP_DATA_SOURCE:包含对 Cloud Storage 存储桶的引用的 GCPDataSource CRD 的名称。

    您可以通过向 PVC 添加可选的注释来自定义数据传输。这些注释会影响将数据复制到 Hyperdisk ML 卷的底层转移作业的行为。

    • volume-populator.datalayer.gke.io/cpu-request:使用此注释可为转移 Job 指定不同的 CPU 资源请求。如果您未指定其他 CPU 资源请求,PVC 默认会请求 24 个 vCPU,以优化传输性能。

    • volume-populator.datalayer.gke.io/transfer-path:使用此注释指定新卷中的目标路径,该路径将存储从 GCPDataSource 资源复制的数据。如果您未指定其他路径,数据将复制到 Hyperdisk ML 卷中的根路径。

  2. 如需创建 PVC,请应用清单:

    kubectl apply -f volume-populator-pvc.yaml
    

请注意以下几点:

  • 如果您将 StorageClass 中的 volumeBindingMode 字段设置为 immediate,则在部署 PVC 后会立即触发数据转移。
  • 如果您将 StorageClass 中的 volumeBindingMode 字段设置为 WaitForFirstConsumer,则只有在您部署请求 PVC 的 Pod 且该 Pod 成功调度到节点后,才会触发数据传输。虽然您的 Pod 可以被调度,但其容器会等待数据传输完成且卷可供使用后才会开始运行。

如需查看数据转移进度,请参阅查看数据转移进度。如果您在资源预配或数据转移期间遇到错误,请参阅排查 GKE Volume Populator 数据转移问题

(可选)查看数据转移进度

本部分介绍了如何跟踪从 Cloud Storage 存储分区到 Hyperdisk ML 卷的数据转移进度和成功情况。

  1. 如需验证 PersistentVolumeClaim 的状态,请运行以下命令。如果 PersistentVolumeClaim 绑定操作花费的时间过长,您也可以运行此命令。

    kubectl describe pvc PVC_NAME -n NAMESPACE
    

    替换以下内容:

  2. 在输出中,查看 PersistentVolumeClaim 事件以监控数据转移进度。GKE 会每分钟记录一次事件。输出类似于以下内容:

    Name:          vp-pvc
    Namespace:     default
    StorageClass:  hyperdisk-ml-single-zone
    Status:        Bound
    Volume:        pvc-f7ae2ee2-106d-4b87-b458-481a3ff82b62
    Labels:        <none>
    Annotations:   pv.kubernetes.io/bind-completed: yes
                  pv.kubernetes.io/bound-by-controller: yes
                  volume.beta.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
                  volume.kubernetes.io/storage-provisioner: pd.csi.storage.gke.io
    Finalizers:    [kubernetes.io/pvc-protection]
    Capacity:      200Gi
    Access Modes:  ROX
    VolumeMode:    Filesystem
    DataSource:
      APIGroup:  datalayer.gke.io
      Kind:      GCPDataSource
      Name:      vp-gds
    Used By:     verify-data-665cfd4dbf-mwc7t
                verify-data-665cfd4dbf-n7xw9
    Events:
      Type     Reason                         Age                     From                                                                                              Message
      ----     ------                         ----                    ----                                                                                              -------
      Warning  ProvisioningFailed             9m8s                    persistentvolume-controller                                                                       Error saving claim: Operation cannot be fulfilled on persistentvolumeclaims "vp-pvc": the object has been modified; please apply your changes to the latest version and try again
      Normal   Provisioning                   9m5s                    pd.csi.storage.gke.io_gke-f110123a1cbd44cdaa7a-921b-b1f4-vm_1a100bd9-5231-4f20-8e65-1f8e995a03c0  External provisioner is provisioning volume for claim "default/vp-pvc"
      Normal   Provisioning                   9m5s                    external-provisioner                                                                              Assuming an external populator will provision the volume
      Normal   PopulateOperationStartSuccess  8m58s                   gkevolumepopulator-populator                                                                      populateFn: Populate operation started for zone us-central1-c
      Normal   TransferInProgress             8m58s (x2 over 8m58s)   gkevolumepopulator-populator                                                                      populateCompleteFn: For PVC vp-pvc in namespace default, transfer job with request ID populator-job-2304531e-4937-4534-a1a4-3eb11e5cb39f in zone us-central1-c waiting for pod to get created
      Normal   TransferInProgress             6m10s (x14 over 8m57s)  gkevolumepopulator-populator                                                                      populateCompleteFn: For PVC vp-pvc in namespace default, transfer job in zone us-central1-c with request ID populator-job-2304531e-4937-4534-a1a4-3eb11e5cb39f is still active with pod status as - Phase: Pending
      Normal   ExternalProvisioning           3m35s (x24 over 9m5s)   persistentvolume-controller                                                                       Waiting for a volume to be created either by the external provisioner 'pd.csi.storage.gke.io' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
      Normal   TransferJobCompleted           3m24s (x2 over 3m26s)   gkevolumepopulator-populator                                                                      populateCompleteFn: For PVC vp-pvc in namespace default, job with request ID populator-job-2304531e-4937-4534-a1a4-3eb11e5cb39f for zone us-central1-c completed successfully
      Normal   TransferJobCompleted           3m24s (x2 over 3m26s)   gkevolumepopulator-populator                                                                      populateCompleteFn: For PVC vp-pvc in namespace default, transfer job for all zones have completed successfully
      Normal   PopulateOperationFinished      3m24s (x2 over 3m26s)   gkevolumepopulator-populator                                                                      Populate operation finished
      Normal   PopulatorFinished              3m19s (x3 over 3m20s)   gkevolumepopulator-populator                                                                      Populator finished
    

填充操作可能需要几分钟才能开始,具体取决于数据大小。如果您在几分钟后未看到任何数据转移进度,请参阅排查 GKE Volume Populator 数据转移问题以获取帮助。

对于多可用区 Hyperdisk ML 卷数据传输,只有在数据成功传输到 StorageClass 中指定的所有可用区后,作业才会标记为完成。如果转移作业在一个或多个可用区中失败,只要 PVC 存在,GKE 卷填充器就会无限期地重试转移数据。

创建并部署使用该卷的 Pod

如需创建 Pod 以验证已填充数据的 PVC 的内容,请执行以下操作:

  1. 将以下清单保存为 verify-data.yaml

    apiVersion: v1
    kind: Pod
    metadata:
      name: verify-data
      namespace: NAMESPACE
    spec:
      nodeSelector:
        cloud.google.com/compute-class: gcs-to-hdml-compute-class
      containers:
      - name: verify-data
        image: busybox
        command:
        - sleep
        - infinity
        volumeMounts:
          - mountPath: /models
            name: mypvc
      volumes:
      - name: mypvc
        persistentVolumeClaim:
          claimName: PVC_NAME
    

    替换以下内容:

  2. 使用以下命令创建 Pod:

    kubectl create -f verify-data.yaml
    
  3. 如需列出文件,请运行以下命令:

    kubectl exec -it verify-data -- /bin/sh
    # cd /models && ls
    

如果命令成功执行,您可以在 Cloud Storage 存储分区中的 /models 目录中找到填充的数据。

清理

为避免产生不必要的费用并移除任何配置错误或孤立的资源,请按照相关步骤正常删除 PersistentVolumeClaim。

在动态预配期间删除 PersistentVolumeClaim

如果您需要在动态预配期间数据仍在转移时删除 PersistentVolumeClaim,请按以下步骤进行正常删除。正常删除可能需要一些时间才能完成。

在删除过程中,替换以下相关变量:

  1. 删除工作负载 Pod:

    kubectl delete pod POD_NAME -n NAMESPACE
    
  2. 查找临时 PersistentVolumeClaim 的名称:

    # Store the relevant environment variables
    export PVC_NAME=PVC_NAME
    export NAMESPACE=NAMESPACE
    
    # Check the status
    export PVC_UID=$(kubectl get pvc ${PVC_NAME} -n ${NAMESPACE} -o jsonpath='{.metadata.uid}')
    export TEMP_PVC=prime-${PVC_UID}
    echo ${TEMP_PVC}
    
  3. 删除在命名空间中创建的 PVC:

    kubectl delete pvc PVC_NAME -n NAMESPACE
    
  4. PVC 可能卡在 Terminating 状态:

    NAME           STATUS        VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS               VOLUMEATTRIBUTESCLASS   AGE
    vp-pvc   Terminating                                      hyperdisk-ml   <unset>                 7m23s
    

    如果存在,请通过移除 PVC 的终结器来手动清理 PVC:

    kubectl patch pvc PVC_NAME -n NAMESPACE  -p '{"metadata":{"finalizers":null}}'
    
  5. 仅在删除 PVC 后删除 GCPDataSource 资源。如果先删除 GCPDataSource 资源,会导致 PVC 删除操作卡住。

    kubectl delete gcpdatasource GCP_DATA_SOURCE -n NAMESPACE
    
  6. 检查临时资源是否已删除

后续步骤