使用 GKE Volume Populator 自動將資料從 Cloud Storage 轉移至 Hyperdisk ML 磁碟區

本文說明如何使用 Google Kubernetes Engine (GKE) Volume Populator,在動態佈建期間,將資料集從 Cloud Storage bucket 預先載入至 Google Cloud Hyperdisk ML 磁碟區。詳情請參閱「關於 GKE Volume Populator」。

在 GKE 上訓練機器學習模型時,快速存取 Hyperdisk ML 磁碟區中的資料是提升效能的關鍵。GKE Volume Populator 會在動態佈建期間,自動將 Cloud Storage 值區中的大型資料集預先載入 Hyperdisk ML 磁碟區,藉此加快機器學習工作流程。這個程序可最佳化資料存取,並簡化 AI/機器學習應用程式的作業,進而加快開發速度,並提升服務效率。

本文適用於機器學習工程師和儲存空間專家,他們負責在 GKE 中建立及分配儲存空間、管理資料安全性及存取權,以及自訂 AI/機器學習訓練基礎架構。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud

使用 Hyperdisk ML 的 GKE Volume Populator 節點集區管理

有效調整節點集區大小、佈建及調度資源,是順利執行 GKE Volume Populator 建立的資料傳輸作業,以填入 Hyperdisk ML 磁碟區的關鍵。您可以使用運算類別,為這些特定資料移轉工作定義節點需求,例如機型和大小。您可以透過運算類別控制資料移轉程序的成本和效能。詳情請參閱「自訂運算類別的優點」。

如要選擇最適合資料傳輸作業的叢集,請瞭解運算類別如何搭配 Hyperdisk ML 的不同叢集類型運作

目標

在本指南中,您會執行下列工作:

事前準備

請確認您已完成下列工作:

  1. 啟用 GKE 和 Cloud Storage API。

    啟用 API

  2. 請確認您已為Google Cloud 專案啟用計費功能。

  3. 下載並安裝 Google Cloud CLI 指令列工具,或使用 Cloud Shell 執行 gcloud CLIkubectl 指令。Cloud Shell 是殼層環境,用於管理託管在 Google Cloud的資源。並預先安裝 gcloudkubectl 指令列工具。

  4. 設定預設地區和區域

  5. 建立或使用現有的 Cloud Storage bucket。本指南假設您已在 Cloud Storage bucket 中填入模型訓練資料。

  6. 如果現有 Standard 叢集可能已明確停用驅動程式,請啟用 Compute Engine Persistent Disk CSI 驅動程式。對於新的 Autopilot 和 Standard 叢集,GKE 預設會啟用驅動程式。您建立的目的地 Hyperdisk ML 儲存空間必須由 Compute Engine 永久磁碟 CSI 驅動程式管理。

  7. 在叢集上啟用 Workload Identity Federation for GKE。這樣一來,GKE Volume Populator 使用的 Kubernetes 服務帳戶就能存取來源 Cloud Storage bucket。詳情請參閱「設定必要權限」。

需求條件

如要使用 GKE Volume Populator 轉移資料,請符合下列規定:

  • GKE 叢集必須執行 1.33.2-gke.4780000 以上版本。
  • GCPDataSource 自訂資源必須與 GKE 工作負載位於相同命名空間。系統不支援跨命名空間的資料來源。
  • 建立運算級別時,請選取支援的 VM。確認專案的配額充足,可供您選取的機型使用。
  • 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 中資料的必要權限。

建立叢集以搭配 Hyperdisk ML 使用 GKE Volume Populator 之前,請先瞭解運算類別如何套用至不同類型的叢集,以及節點管理作業的負責人 (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 會在佈建 PersistentVolume 後,啟動資料移轉工作 PersistentVolumeClaim。如要填入 Hyperdisk ML 磁碟區,這個 PersistentVolumeClaim 必須參照 GCPDataSource,後者會定義 Cloud Storage 中的來源資料。

建立 GKE 叢集

您可以選擇使用 Standard 或 Autopilot 叢集,並搭載 GKE 1.33.2-gke.4780000 以上版本,部署資料移轉管道。每種叢集類型各有優點,價格模式也不盡相同。

  • 選擇 Autopilot,輕鬆管理叢集、提高成本效益及自動調度資源。
  • 如要啟用自動調度資源功能,並進一步控管節點佈建作業,請選擇「Standard」(標準) 啟用自動佈建節點功能
  • 如果您需要最大程度的控制權,且能輕鬆管理節點佈建、資源調度及維護作業的所有層面,請選擇「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

標準 (含節點自動佈建功能)

啟用自動佈建節點功能的 GKE Standard 叢集中,GKE 會自動處理資料移轉工作所需的節點建立和刪除作業。轉移作業完成後,節點資源會自動縮減。您不需要手動刪除轉移 Pod 或 Pod 執行的節點。

如要建立已啟用自動佈建節點功能的新 Standard 叢集,請執行下列指令:

  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:您的 Google Cloud 專案 ID。
  • MINIMUM_CPU:自動佈建的 vCPU 數量下限。例如:10
  • MINIMUM_MEMORY:自動佈建的最低記憶體量 (以 GiB 為單位)。例如:200
  • MAXIMUM_CPU:自動佈建的 vCPU 數量上限。例如,100。這項限制是指所有現有手動建立的節點集區,以及 GKE 可能自動建立的所有節點集區的 CPU 資源總和。
  • MAXIMUM_MEMORY:自動佈建的記憶體上限。例如,1000。這項限制是所有現有手動建立的節點集區,以及 GKE 可能自動建立的所有節點集區的記憶體資源總和。

標準 (不含節點自動佈建功能)

如要在未啟用節點自動佈建功能的標準叢集上使用 GKE Volume Populator,可以採用現有的節點集區,或是建立專用的轉移節點集區。節點必須有容量來執行轉移作業,且標籤與 compute-class 相符。

建立叢集和節點集區時,請將 gcs-to-hdml-compute-class 計算類別指定為節點標籤。請注意,計算類別名稱 gcs-to-hdml-compute-class 是為移轉工作預先定義,且必須完全指定。

如要建立沒有自動佈建節點功能的新 Standard 叢集,以及該叢集中的新節點集區,請執行下列指令:

  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 您的 Google Cloud 專案 ID。
  • NODE_POOL_NAME:您要在新叢集中建立的節點集區名稱。GKE Volume Populator 會使用這個節點集區部署暫時的資料移轉工作。

為避免產生不必要的費用,請在資料轉移完成後,執行 gcloud container node-pools delete 指令刪除所有手動建立的轉移節點集區。

建立運算類別

如要建立運算類別,指定並優先處理可做為叢集節點的 VM 類型,請按照下列步驟操作:

  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 值區轉移資料,請為 GKE 設定 Workload Identity Federation 的必要權限。只要具備適當權限,GKE Volume Populator 建立的轉移作業就能存取 Cloud Storage bucket。本指南假設您已在 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 建立的移轉作業會使用這個服務帳戶向 API 進行驗證。 Google Cloud
    • 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 bucket 名稱。
    • PROJECT_NUMBER:您建立叢集的 Google Cloud 專案數值 ID。如要找出專案編號,請參閱「識別專案」。
    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • NAMESPACE:您先前建立的命名空間,工作負載將在其中執行。
    • KSA_NAME:您在 GCPDataSource 資源中指定的 Kubernetes 服務帳戶名稱。GKE Volume Populator 建立的移轉作業會使用這個服務帳戶向 API 進行驗證。 Google Cloud
    • ROLE:要授予服務帳戶的 IAM 角色。為了配合本指南,請授予 roles/storage.objectViewer 角色,允許從值區讀取資料。

    PROJECT_NUMBERPROJECT_IDNAMESPACEKSA_NAME 用於建構專案的 Workload Identity Federation for GKE 主體 ID。

建立預先載入資料的 Hyperdisk ML 磁碟區

請按照下列步驟設定 GKE 基礎架構和設定,以便建立 Hyperdisk ML 磁碟區,並使用 GKE Volume Populator 觸發及管理自動資料移轉程序:

  1. 建立 GCPDataSource 自訂資源,定義資料來源。
  2. 建立 StorageClass,定義要使用的永久儲存空間類型 (Hyperdisk ML 磁碟區)。
  3. 建立 PersistentVolumeClaim,啟用儲存空間的動態佈建,並啟用對新佈建 Hyperdisk ML 磁碟區的存取權。
  4. (選用) 查看資料轉移進度
  5. 建立及部署 Pod,使用 Hyperdisk ML 磁碟區。

建立GCPDataSource自訂資源

在 GKE 中建立GCPDataSource自訂資源,指定來源 Cloud Storage bucket 的位置,以及具備存取該 bucket 必要權限的服務帳戶。這項自訂資源定義 (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_SOURCEGCPDataSourceCRD 的名稱,其中包含 Cloud Storage bucket 的參照。詳情請參閱 GCPDataSource CRD 參考資料
    • NAMESPACE:與工作負載執行的命名空間相同。系統會在該命名空間中建立 GCPDataSource 自訂資源。
    • KSA_NAME:您在 GCPDataSource 資源中指定的 Kubernetes 服務帳戶名稱。GKE Volume Populator 建立的移轉作業會使用這個服務帳戶向 API 進行驗證。 Google Cloud cloudStorage.serviceAccountName 值是您在「設定必要權限」一節中,為 GKE 適用的工作負載身分聯盟設定的 Kubernetes 服務帳戶。
    • GCS_BUCKET:Cloud Storage bucket 名稱。uri 欄位會指定來源資料。
    • 如要複製整個 bucket,請使用 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 佈建程式的 StorageClass,在所選區域中佈建 Hyperdisk ML 磁碟區。如要讓資料副本在多個可用區中都能存取,可以建立多可用區 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 存取模式建立 PersistentVolumeClaim,並參照您先前建立的 StorageClass。

  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 bucket 中的大小。為符合 Hyperdisk ML 磁碟區的支援範圍,DISK_SIZE 的值必須大於 4 Gi。詳情請參閱「Hyperdisk 磁碟區大小限制」。
    • GCP_DATA_SOURCEGCPDataSource CRD 的名稱,其中包含 Cloud Storage bucket 的參照。

    您可以為 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 Volume Populator 就會無限期重試移轉資料。

建立及部署會耗用磁碟區的 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 bucket 的 /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. 確認暫時資源已刪除

後續步驟