本指南介绍了如何使用 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 的不同集群类型搭配使用。
目标
在本指南中,您将执行以下任务:
- 配置 GKE 集群环境以支持使用 GKE Volume Populator 进行数据转移,包括集群创建、计算类定义和权限设置。
- 创建
GCPDataSource
自定义资源以指定源 Cloud Storage 存储分区。 - 为 Hyperdisk ML 定义
StorageClass
。 - 创建引用
GCPDataSource
的PersistentVolumeClaim
,以触发将数据填充到 Hyperdisk ML 卷的操作。 - 验证数据传输。
- 在 Pod 中使用已填充的卷。
- 清理资源。
准备工作
请确保您已执行以下任务:
启用 GKE 和 Cloud Storage API。
下载并安装 Google Cloud CLI 命令行工具,或使用 Cloud Shell 运行
gcloud CLI
和kubectl
命令。Cloud Shell 是一种 shell 环境,用于管理在 Trusted Cloud by S3NS上托管的资源。它预安装有 gcloud 和 kubectl 命令行工具。创建或使用现有的 Cloud Storage 存储分区。本指南假定您已有一个 Cloud Storage 存储分区,其中填充了模型训练数据。
在可能已明确停用该驱动程序的现有 Standard 集群上启用 Compute Engine Persistent Disk CSI 驱动程序。在新的 Autopilot 和 Standard 集群上,GKE 默认会启用该驱动程序。您创建的目标 Hyperdisk ML 存储必须由 Compute Engine Persistent Disk CSI 驱动程序管理。
在集群上启用 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-a
或us-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-a
或us-central1
。PROJECT_ID
您的 Trusted Cloud by S3NS 项目 ID。NODE_POOL_NAME
:您要在新集群中创建的节点池的名称。GKE Volume Populator 使用此节点池来部署临时数据转移作业。
为避免产生不必要的费用,请在数据转移完成后运行 gcloud container node-pools delete
命令,以删除所有手动创建的转移节点池。
创建计算类
如需创建计算类来指定和优先选择可用作集群中节点的虚拟机类型,请按以下步骤操作:
- 将以下清单保存为
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 的机器系列支持。 - 如需创建计算类,请应用清单:
kubectl apply -f computeclass.yaml
设置所需权限
如需从 Cloud Storage 存储分区转移数据,请为 Workload Identity Federation for GKE 设置所需权限。在获得适当的权限后,由 GKE Volume Populator 创建的转移作业可以访问您的 Cloud Storage 存储分区。本指南假定您已有一个 Cloud Storage 存储分区,其中填充了要转移的模型训练数据。
创建 Kubernetes 命名空间:
kubectl create namespace NAMESPACE
将
NAMESPACE
替换为您希望工作负载在其上运行的命名空间。如果您使用的是现有命名空间,请跳过此步骤。
创建 Kubernetes 服务账号:
kubectl create serviceaccount KSA_NAME \ --namespace=NAMESPACE
替换以下内容:
KSA_NAME
:您将在GCPDataSource
资源中指定的 Kubernetes 服务账号的名称。由 GKE Volume Populator 创建的转移作业使用此服务账号向 Trusted Cloud by S3NS API 进行身份验证。NAMESPACE
:您在上一步中创建的 Kubernetes 命名空间。
向您的 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_NUMBER
、PROJECT_ID
、NAMESPACE
和KSA_NAME
用于为您的项目构建 Workload Identity Federation for GKE 主账号标识符。
创建包含预加载数据的 Hyperdisk ML 卷
请执行以下步骤来设置创建 Hyperdisk ML 卷所需的 GKE 基础架构和配置,并使用 GKE Volume Populator 触发和管理自动数据转移流程:
- 创建
GCPDataSource
自定义资源以定义数据源。 - 创建 StorageClass 以定义要使用的永久性存储类型(Hyperdisk ML 卷)。
- 创建 PersistentVolumeClaim 以实现存储空间的动态预配,并允许访问新预配的 Hyperdisk ML 卷。
- (可选)查看数据转移进度。
- 创建并部署使用 Hyperdisk ML 卷的 Pod。
创建 GCPDataSource
自定义资源
在 GKE 中创建 GCPDataSource
自定义资源,以指定源 Cloud Storage 存储分区的位置以及具有访问该存储分区所需权限的服务账号。此自定义资源定义 (CRD) 专用于 GKE Volume Populator。
将以下清单保存为
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/
。确保路径以尾随斜杠结尾,以指示文件夹。
- 如需复制整个存储分区,请使用
- GCP_DATA_SOURCE:包含对 Cloud Storage 存储桶的引用的
如需创建
GCPDataSource
资源,请应用清单:kubectl apply -f gcpdatasource.yaml
创建 Hyperdisk ML StorageClass
创建一个使用 pd.csi.storage.gke.io 预配工具在所选可用区中预配 Hyperdisk ML 卷的 StorageClass。如果您希望能够在多个可用区中访问数据的副本,可以创建多可用区 StorageClass。以下是多可用区 StorageClass 的示例。
将以下清单保存为
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
的值必须是集群可以扩缩并根据需要创建新节点的位置。
- 对于未启用节点自动预配功能的 GKE Standard 集群,
(可选)如需列出集群的节点位置,请运行以下命令:
gcloud container clusters describe CLUSTER_NAME --location=LOCATION --format="value(locations)"
替换以下内容:
CLUSTER_NAME
:您的集群的名称。LOCATION
:集群的计算可用区或区域。例如us-central1-a
或us-central1
。
如需创建 StorageClass,请应用清单:
kubectl apply -f hdml-class.yaml
创建 PersistentVolumeClaim 以访问卷
以下清单展示了如何在 ReadOnlyMany 访问模式中创建引用您之前创建的 StorageClass 的 PersistentVolumeClaim 的示例。
将以下清单保存为
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 卷中的根路径。
如需创建 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 卷的数据转移进度和成功情况。
如需验证 PersistentVolumeClaim 的状态,请运行以下命令。如果 PersistentVolumeClaim 绑定操作花费的时间过长,您也可以运行此命令。
kubectl describe pvc PVC_NAME -n NAMESPACE
替换以下内容:
PVC_NAME
:您在创建 PersistentVolumeClaim 以访问卷部分中创建的 PVC 的名称。NAMESPACE
:本指南中使用的命名空间,您已在设置必要权限部分中创建该命名空间。
在输出中,查看 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 的内容,请执行以下操作:
将以下清单保存为
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
替换以下内容:
NAMESPACE
:PVC 所在的命名空间,也是您要创建verify-data
Pod 的命名空间。PVC_NAME
:您在创建 PersistentVolumeClaim 以访问卷部分中为数据填充创建的 PVC 的名称。
使用以下命令创建 Pod:
kubectl create -f verify-data.yaml
如需列出文件,请运行以下命令:
kubectl exec -it verify-data -- /bin/sh # cd /models && ls
如果命令成功执行,您可以在 Cloud Storage 存储分区中的 /models
目录中找到填充的数据。
清理
为避免产生不必要的费用并移除任何配置错误或孤立的资源,请按照相关步骤正常删除 PersistentVolumeClaim。
在动态预配期间删除 PersistentVolumeClaim
如果您需要在动态预配期间数据仍在转移时删除 PersistentVolumeClaim,请按以下步骤进行正常删除。正常删除可能需要一些时间才能完成。
在删除过程中,替换以下相关变量:
POD_NAME
:您在创建和部署使用卷的 Pod 部分中创建的 Pod 的名称。NAMESPACE
:PVC 所在的命名空间。PVC_NAME
:您在创建 PersistentVolumeClaim 以访问卷部分中创建的 PVC 的名称。GCP_DATA_SOURCE
:您在创建GCPDataSource
自定义资源部分中创建的GCPDataSource
自定义资源的名称。
删除工作负载 Pod:
kubectl delete pod POD_NAME -n NAMESPACE
查找临时 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}
删除在命名空间中创建的 PVC:
kubectl delete pvc PVC_NAME -n NAMESPACE
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}}'
仅在删除 PVC 后删除
GCPDataSource
资源。如果先删除GCPDataSource
资源,会导致 PVC 删除操作卡住。kubectl delete gcpdatasource GCP_DATA_SOURCE -n NAMESPACE
检查临时资源是否已删除。
后续步骤
- 了解 GKE Volume Populator。
- 如需有关数据传输问题的帮助,请参阅排查 GKE Volume Populator 数据传输问题。
- 如需查看高级 Hyperdisk ML 工作负载示例,请参阅利用 Hyperdisk ML 加快 AI/机器学习数据加载速度。