GKE Volume Populator を使用して Cloud Storage から Hyperdisk ML ボリュームへのデータ転送を自動化する

このガイドでは、GKE Volume Populator を使用して、動的プロビジョニング中に Cloud Storage バケットから Google Kubernetes Engine(GKE)の Hyperdisk ML ボリュームに大量のデータをプリロードする方法について説明します。詳細については、GKE Volume Populator についてをご覧ください。

このガイドは、ストレージの作成と割り当てを行い、データ セキュリティとアクセスを管理するストレージ スペシャリストを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスク例の詳細については、GKE ユーザーの一般的なロールとタスクをご覧ください。

Hyperdisk ML を使用した GKE Volume Populator のノードプール管理

GKE Volume Populator によって作成されたデータ転送 Job を正常に実行して Hyperdisk ML ボリュームにデータを入力するには、ノードプールのサイズ設定、プロビジョニング、スケーリングを効率的に行うことが重要です。これらの特定のデータ転送 Job のノード要件(マシンタイプやサイズなど)を定義するには、ComputeClass を使用します。ComputeClass を使用すると、データ転送プロセスの費用とパフォーマンスを制御できます。詳細については、カスタム ComputeClass のメリットをご覧ください。

データ転送 Job に最適なクラスタを選択するには、Hyperdisk ML のクラスタタイプごとの ComputeClass の動作を理解します。

目標

このガイドでは、次のタスクを行います。

始める前に

次のタスクが完了していることを確認します。

  1. GKE API と Cloud Storage API を有効にします。

    API を有効にする

  2. Google Cloud プロジェクトで課金が有効になっていることを確認します。

  3. Google Cloud CLI コマンドライン ツールをダウンロードしてインストールするか、Cloud Shell を使用して gcloud CLI コマンドと kubectl コマンドを実行します。Cloud Shell は、 Google Cloudでホストされているリソースを管理するためのシェル環境です。gcloud および kubectl コマンドライン ツールがプリインストールされています。

  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 ワークロードと同じ Namespace に存在している必要があります。異なる Namespace にまたがるデータソースはサポートされていません。
  • ComputeClass を作成するときに、サポートされている VM を選択します。選択したマシンタイプに十分な割り当てがあることを確認します。
  • 転送 Job の gcs-to-hdml-compute-class ComputeClass の名前は事前定義されています。ComputeClass を作成するときに、この名前を正確に指定する必要があります。

費用

GKE Volume Populator の使用に直接的な費用はかかりませんが、ストレージとデータ転送には料金が発生します。関連する間接的な費用には、次のものが含まれます。

  • GKE で使用される Compute Engine インスタンス: データ転送 Job の実行に使用されるノードの費用。ノード管理と費用への影響は、クラスタタイプによって異なります。詳細については、GKE クラスタを作成するの各クラスタタイプをご覧ください。
  • 転送 Job のノードサイズ: 最適な転送パフォーマンスを実現するために、転送 Job はノードをデフォルトで 24 個の vCPU にスケールアップします。これはすべてのクラスタタイプに適用されます。特定の費用やパフォーマンスの最適化のためにノードのサイズとタイプを調整する場合は、ComputeClass を作成する際に調整できます。
  • Cloud Storage バケットで使用されるストレージ: 詳細については、Cloud Storage の料金をご覧ください。
  • Hyperdisk ML ボリュームの費用: 作成した Hyperdisk ML ボリュームのストレージ容量とパフォーマンス(IOPS / スループット)が含まれます。詳細については、Hyperdisk の料金をご覧ください。

環境を準備する

このセクションでは、適切なハードウェアを使用して GKE クラスタ インフラストラクチャを作成し、Cloud Storage のデータにアクセスするために必要な権限を設定します。

Hyperdisk ML で GKE Volume Populator を使用するクラスタを作成する前に、ComputeClass がさまざまなクラスタタイプにどのように適用されるか、およびノード管理を誰が担当するのか(GKE またはお客様)を確認してください。

Hyperdisk ML のクラスタタイプごとの ComputeClass の動作

GKE Volume Populator は、カスタム ComputeClass を使用して、データ転送 Job に使用するノードのタイプを決定します。次の表に、クラスタ構成に応じた ComputeClass の動作を示します。

検討対象 GKE Autopilot、ノード自動プロビジョニングありの GKE Standard ノード自動プロビジョニングなしの GKE Standard
ComputeClass の設定 nodePoolAutoCreation が有効 nodePoolAutoCreation が無効
ノード管理 GKE がノードを自動的に作成して管理する ノードを手動で作成して管理する
ノードのスケーリング 自動 手動
ノードのラベル付け 該当なし ノードに cloud.google.com/compute-class=gcs-to-hdml-compute-class というラベルを付ける必要がある
詳細情報 ノード自動プロビジョニングと ComputeClass 手動で作成したノードプールを構成する

GKE は、PersistentVolumeClaimPersistentVolume をプロビジョニングした後、データ転送 Job を開始します。Hyperdisk ML ボリュームにデータを入力するには、この PersistentVolumeClaim が、Cloud Storage のソースデータを定義する GCPDataSource を参照する必要があります。

GKE クラスタを作成する

データ転送パイプラインは、GKE バージョン 1.33.2-gke.4780000 以降の Standard クラスタまたは Autopilot クラスタを使用してデプロイできます。各クラスタタイプには、それぞれに利点があり、料金モデルも異なります。

  • 容易なクラスタ管理、費用対効果、自動スケーリングを必要とする場合には、Autopilot を選択します。
  • ノード プロビジョニングをより詳細に制御して自動スケーリングを行う必要がある場合は、ノード自動プロビジョニングが有効になっている Standard を選択します。
  • 最大限の制御を必要とし、ノード プロビジョニング、スケーリング、メンテナンスのすべての側面を自分で管理できる場合は、ノード自動プロビジョニングが有効になっていない Standard を選択します。

Autopilot

GKE Autopilot クラスタでは、GKE がデータ転送 Job に必要なノードの作成と削除を自動的に処理します。転送 Job が完了すると、ノードリソースは自動的にスケールダウンされます。転送 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 Standard クラスタでは、GKE がデータ転送 Job に必要なノードの作成と削除を自動的に処理します。転送 Job が完了すると、ノードリソースは自動的にスケールダウンされます。転送 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 です。この上限は、手動で作成した既存のすべてのノードプールにわたる CPU リソースと、GKE によって自動的に作成される可能性のあるすべてのノードプールにわたる CPU リソースの合計です。
  • MAXIMUM_MEMORY: 自動プロビジョニングの対象とするメモリの最大量。たとえば、1000 です。この上限は、手動で作成した既存のすべてのノードプールと、GKE によって自動的に作成される可能性のあるすべてのノードプールのメモリリソースの合計です。

Standard(ノード自動プロビジョニングなし)

ノード自動プロビジョニングが有効になっていない Standard クラスタで GKE Volume Populator を使用するには、既存のノードプールを使用するか、専用の転送ノードプールを作成します。ノードには、転送 Job を実行する容量と、compute-class と一致するラベルが必要です。

クラスタとノードプールを作成するときに、gcs-to-hdml-compute-class ComputeClass をノードラベルとして指定します。転送 Job の ComputeClass の名前 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 が一時的なデータ転送 Job をデプロイするために使用します。

不要な費用が発生しないように、データ転送が完了したら gcloud container node-pools delete コマンドを実行して、手動で作成した転送ノードプールを削除します。

ComputeClass を作成する

クラスタのノードとして使用できる VM のタイプを指定して優先する ComputeClass を作成する手順は次のとおりです。

  1. 次のマニフェストを computeclass.yaml として保存します。

    ノード自動プロビジョニングあり

    Autopilot クラスタと、ノード自動プロビジョニングが有効になっている Standard クラスタの場合は、次のように nodePoolAutoCreation セクションを含めて ComputeClass を定義します。ノード自動プロビジョニングが有効になっている場合、GKE は gcs-to-hdml-compute-class ComputeClass ラベルの付いた新しいノードプールを自動的に作成します。

        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 セクションを含めずに ComputeClass を定義します。gcs-to-hdml-compute-class ComputeClass ラベルの付いたノードプールがすでに作成されていることを確認します。

        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. ComputeClass を作成するには、マニフェストを適用します。
    kubectl apply -f computeclass.yaml

必要な権限を設定する

Cloud Storage バケットからデータを転送するには、Workload Identity Federation for GKE に必要な権限を設定します。適切な権限を付与することで、GKE Volume Populator によって作成された転送 Job が Cloud Storage バケットにアクセスできます。このガイドでは、転送するモデル トレーニング データが入力された Cloud Storage バケットがすでに存在することを前提としています。

  1. Kubernetes Namespace を作成します。

    kubectl create namespace NAMESPACE
    

    NAMESPACE は、ワークロードを実行する Namespace に置き換えます。

    既存の Namespace を使用する場合は、この手順をスキップします。

  2. Kubernetes サービス アカウントを作成します。

    kubectl create serviceaccount KSA_NAME \
        --namespace=NAMESPACE
    

    次のように置き換えます。

    • KSA_NAME: GCPDataSource リソースで指定する Kubernetes サービス アカウントの名前。GKE Volume Populator によって作成された転送 Job は、このサービス アカウントを使用して Google Cloud API への認証を行います。
    • NAMESPACE: 前の手順で作成した Kubernetes Namespace。
  3. Cloud Storage バケットにアクセスするための適切なロールを IAM サービス アカウントに付与します。

    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: クラスタを作成した Google Cloud プロジェクトの数値 ID。プロジェクト番号を確認するには、プロジェクトを確認するをご覧ください。
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • NAMESPACE: ワークロードが実行される、先ほど作成した Namespace。
    • KSA_NAME: GCPDataSource リソースで指定した Kubernetes サービス アカウントの名前。GKE Volume Populator によって作成された転送 Job は、このサービス アカウントを使用して Google Cloud API への認証を行います。
    • ROLE: サービス アカウントに付与する IAM ロール。このガイドでは、バケットからの読み取りを許可するために roles/storage.objectViewer ロールを付与します。

    PROJECT_NUMBERPROJECT_IDNAMESPACEKSA_NAME は、プロジェクトの Workload Identity Federation for GKE プリンシパル ID の構築に使用されます。

プリロードされたデータを含む 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: ワークロードが実行される Namespace。GCPDataSource カスタム リソースは、この Namespace に作成されます。
    • KSA_NAME: GCPDataSource リソースで指定した Kubernetes サービス アカウントの名前。GKE Volume Populator によって作成された転送 Job は、このサービス アカウントを使用して Google Cloud 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 を作成する

次のマニフェスト ファイルは、先ほど作成した StorageClass を参照する ReadOnlyMany アクセスモードの 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: ワークロードが実行される Namespace。
    • DISK_SIZE: データの入力用に作成されるディスクのサイズ(GB 単位)。データを正常に入力するには、リクエストされたディスクサイズが、Cloud Storage バケットにあるモデルのデータのサイズよりも大きいことを確認してください。Hyperdisk ML ボリュームでサポートされている範囲に準拠するには、DISK_SIZE の値が 4 Gi より大きくなければなりません。詳細については、Hyperdisk ボリュームのサイズ上限をご覧ください。
    • GCP_DATA_SOURCE: Cloud Storage バケットへの参照を保持する GCPDataSource CRD の名前。

    PVC にアノテーション(省略可)を追加することで、データ転送をカスタマイズできます。これらのアノテーションは、データを Hyperdisk ML ボリュームにコピーする基盤となる転送 Job の動作に影響します。

    • 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 は、イベントを 1 分に 1 回程度ログに記録します。出力は次のようになります。

    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 で指定されたすべてのゾーンにデータが正常に転送された場合にのみ Job が完了とマークされます。1 つ以上のゾーンで転送 Job が失敗した場合、GKE Volume Populator は PVC が存在する限り、データ転送を無期限に再試行します。

ボリュームを使用する Pod を作成してデプロイする

データが入力された PVC の内容を確認する Pod を作成するには:

  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. Namespace に作成された 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 を手動でクリーンアップします。

    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. 一時リソースが削除されたことを確認します。

次のステップ