セカンダリ ブートディスクを使用してデータまたはコンテナ イメージをプリロードする


このページでは、ノードでセカンダリ ブートディスクを使用して AI / ML ワークロードの初期化速度を向上させる方法について説明します。ノードにセカンダリ ブートディスクがある場合は、データまたはコンテナ イメージをプリロードできます。Google Kubernetes Engine(GKE)はノードをスケジュールし、このデータをプリロードしてプロビジョニング時間を短縮します。

概要

バージョン 1.28.3-gke.1067000 以降では、新しいノードにデータまたはコンテナ イメージをプリロードできます。イメージ ストリーミングとセカンダリ ブートディスクを使用するようにノードプールを構成すると、ノードをプロビジョニングして、ディスクにローカルでキャッシュに保存されたように、ML モデルなどのデータやコンテナイメージをプリロードするように GKE に指示できます。プリロード データやセカンダリ ディスクのコンテナ イメージを使用すると、ワークロードに次のようなメリットがあります。

  • 自動スケーリングの高速化
  • 大きなイメージを pull する際のレイテンシの短縮
  • メンテナンス イベントやシステムエラーなどの中断からの迅速な復元

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API を有効にします。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得します。

要件

セカンダリ ブートディスクの使用には、次の要件が適用されます。

  1. この機能は、GKE バージョン 1.28.3-gke.106700 以降で使用できます。
  2. ディスク イメージを変更するときは、新しいノードプールを作成する必要があります。既存のノードのディスク イメージの更新はサポートされていません。

セカンダリ ブートディスクを構成する

以降のセクションでは、セカンダリ ブートディスクの構成方法について説明します。

データをプリロードする

セカンダリ ブートディスクを使用して GKE クラスタとノードプールを作成する前に、ビルド時にデータの準備ができたら、ディスク イメージを準備することをおすすめします(理想的には CI / CD パイプラインで自動化)。

データを含むディスク イメージを準備する

次の手順で、データソースとしてカスタム ディスク イメージを作成します。

  1. 空のディスクで VM を作成する
  2. VM に SSH 接続する
    1. 空のディスクをマウントする
    2. 空のディスクにデータをダウンロードする
  3. ディスクからカスタム イメージを作成する

セカンダリ ブートディスクを含む GKE クラスタとノードプールを作成する

セカンダリ ブートディスクは、gcloud CLI を使用して構成できます。

  1. --enable-image-streaming フラグを使用してイメージ ストリーミングを有効にした GKE Standard クラスタを作成します。

    gcloud container clusters create CLUSTER_NAME \
        --location LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    

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

    • CLUSTER_NAME: クラスタの名前。
    • LOCATION: クラスタのロケーション
    • CLUSTER-VERSION: 使用する GKE のバージョン。1.28.3-gke.106700 以降にする必要があります。
  2. --secondary-boot-disk=disk-image フラグを使用して、セカンダリ ブートディスクを含むノードプールを作成します。

    gcloud beta container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location LOCATION \
        --enable-image-streaming \
        --secondary-boot-disk=disk-image=global/images/DATA_DISK IMAGE
    

    DISK_IMAGE_NAME は、セカンダリ ディスクのパスに置き換えます。例: /mnt/disks/gke-secondary-disks/gke-model-data-disk.

    GKE によって、各ノードにプリロードされたデータを含むセカンダリ ディスクがあるノードプールが作成されます。これにより、セカンダリ ブートディスクがノードにアタッチされ、マウントされます。

  3. 必要に応じて、hostPath ボリューム マウントを使用して、Pod コンテナにセカンダリ ディスク イメージをマウントできます。次のマニフェストを使用して Pod リソースを定義し、hostPath ボリューム マウントを使用してそのコンテナにデータディスクをプリロードします。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-name
    spec:
      containers:
      ...
      volumeMounts:
      - mountPath: /usr/local/data_path_sbd
        name: data_path_sbd
    ...
    volumes:
      - name: data_path_sbd
        hostPath:
            path: DISK_IMAGE_NAME
    

    DISK_IMAGE_NAME は、セカンダリ ディスクのパスに置き換えます。例: /mnt/disks/gke-secondary-disks/gke-model-data-disk.

コンテナ イメージをプリロードする

このセクションでは、プリロードされたコンテナ イメージを含むディスク イメージ、クラスタ、ノードプールを作成します。各ノードでは、プリロードされたコンテナ イメージを使用してセカンダリ ディスクが作成されます。

  1. ディスク イメージを保存する Cloud Storage バケットを作成します。
  2. ディスク イメージを作成します。このガイドでは、gke-disk-image-builder を使用します。

    go run ./cli \
        --project-name=PROJECT_ID \
        --image-name=DISK_IMAGE_NAME \
        --zone=LOCATION \
        --gcs-path=gs://BUCKET_NAME \
        --disk-size-gb=10 \
        --container-image=docker.io/library/nginx:latest
    

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

    • PROJECT_ID: Google Cloud プロジェクトの名前。
    • DISK_IMAGE_NAME: ディスクのイメージの名前。例: nginx-python-image
    • LOCATION: クラスタのロケーション
    • BUCKET_NAME: ディスク イメージを含む Cloud Storage バケットの名前。例: gke-secondary-disk-image-logs/

      GKE によってディスク上のコンテナ イメージが pull され、そのディスクからイメージが作成されます。GKE によってイメージが Cloud Storage バケットに保存されます。

  3. イメージ ストリーミングを有効にして GKE Standard クラスタを作成します。

    gcloud container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --cluster-version=CLUSTER_VERSION \
        --enable-image-streaming
    
  4. セカンダリ ブートディスクを使用してノードプールを作成します。

    gcloud beta container node-pools create NODE_POOL_NAME \
    --cluster=CLUSTER_NAME \
    --location=LOCATION \ \
    --enable-image-streaming \
    --secondary-boot-disk=disk-image=global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
    
  5. Pod テンプレートに nodeSelector を追加します。

    nodeSelector:
        cloud.google.com/gke-nodepool: NODE_POOL_NAME
    
  6. セカンダリ ブートディスク キャッシュが使用中であることを確認します。

    kubectl get events --all-namespaces
    

    出力は次のようになります。

    75s         Normal      SecondaryDiskCachin
    node/gke-pd-cache-demo-default-pool-75e78709-zjfm   Image
    gcr.io/k8s-staging-jobsejt/pytorch-mnist:latest is backed by secondary disk cache
    

    キャッシュに保存されたコンテナ イメージの想定されるイメージ pull レイテンシは、イメージサイズに関係なく数秒以内にする必要があります。イメージ pull レイテンシを確認するには、次のコマンドを実行します。

    kubectl describe pod POD_NAME
    

    POD_NAME は、Pod の名前で置き換えます。

    出力は次のようになります。

    …
      Normal  Pulled     15m   kubelet            Successfully pulled image "docker.io/library/nginx:latest" in 0.879149587s
    …
    

次のステップ