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


このページでは、Google Kubernetes Engine(GKE)でセカンダリ ブートディスクを使用して、ワークロードの起動レイテンシを改善する方法について説明します。セカンダリ ブートディスクを使用すると、新しいノードにデータまたはコンテナ イメージをプリロードできます。これにより、ワークロードではコールド スタートの高速化と、プロビジョニングされたリソースの全体的な使用率の向上が実現します。

概要

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

  • 自動スケーリングの高速化
  • 大きなイメージを 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. ディスク イメージを変更するときは、新しいノードプールを作成する必要があります。既存のノードのディスク イメージを更新することはできません。

  3. セカンダリ ブートディスク機能を使用するには、イメージ ストリーミングを構成する必要があります。

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

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

データをプリロードする

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

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

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

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

GKE クラスタを作成する

  • --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 以降にする必要があります。

セカンダリ ブートディスクを使用してノードプールを作成する

ノードプールにセカンダリ ブートディスクを割り当てることができます。セカンダリ イメージは、次のいずれかに属します。

  • --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 は、ディスク イメージの名前に置き換えます。

    プリロードされたコンテナ イメージを含むセカンダリ ディスクが各ノードに存在するノードプールが作成されます。これにより、セカンダリ ブートディスクがノードにアタッチされ、マウントされます。

  • 別のプロジェクトのディスク イメージから、セカンダリ ブートディスクを含むノードプールを作成するには、--secondary-boot-disk フラグを使用します。例:

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

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

    • DISK_IMAGE_NAME: ディスク イメージの名前。
    • IMAGE_PROJECT_ID: ディスク イメージが属するプロジェクトの名前。

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

    別のプロジェクトに属するディスク イメージへのアクセス権を付与するには、次のクラスタ サービス アカウントに Compute イメージ ユーザーのロールを追加する必要があります。

    • デフォルトのコンピューティング サービス アカウント: CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com
    • GKE サービス アカウント: service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role roles/compute.imageUser
    
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role roles/compute.imageUser
    
  • 必要に応じて、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: /mnt/disks/gke-secondary-disks/gke-DISK_IMAGE_NAME-disk
    

    DISK_IMAGE_NAME は、ディスク イメージの名前に置き換えます。

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

このガイドでは、gke-disk-image-builder を使用して VM インスタンスを作成し、ディスク上のコンテナ イメージを pull します。gke-disk-image-builder は、このディスクからディスク イメージを作成します。コンテナ イメージのビルドステップの直後にディスク イメージを準備することをおすすめします(CI / CD パイプラインで自動化するのが理想的です)。

  1. gke-disk-image-builder の実行ログを保存する Cloud Storage バケットを作成します。
  2. プリロードされたコンテナ イメージを含むディスク イメージを作成します。

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

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

    • PROJECT_ID: Google Cloud プロジェクトの名前。
    • DISK_IMAGE_NAME: ディスクのイメージの名前。例: nginx-python-image
    • LOCATION: クラスタのロケーション
    • LOG_BUCKET_NAME: 実行ログを保存する Cloud Storage バケットの名前。例: gke-secondary-disk-image-logs/

GKE クラスタを作成する

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

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

セカンダリ ブートディスクを使用してノードプールを作成する

  • --secondary-boot-disk フラグを使用して、同じプロジェクトにセカンダリ ブートディスクを含むノードプールを作成します。例:

    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
    

    DISK_IMAGE_NAME は、ディスク イメージの名前に置き換えます。

  • 別のプロジェクトのディスク イメージから、セカンダリ ブートディスクを含むノードプールを作成するには、--secondary-boot-disk フラグを使用します。例:

    gcloud beta container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location LOCATION \
        --enable-image-streaming \
        --secondary-boot-disk=disk-image=projects/IMAGE_PROJECT_ID/global/images/DISK_IMAGE_NAME,mode=CONTAINER_IMAGE_CACHE
    
    

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

    • DISK_IMAGE_NAME: ディスク イメージの名前。
    • IMAGE_PROJECT_ID: ディスク イメージが属するプロジェクトの名前。

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

    別のプロジェクトに属するディスク イメージへのアクセス権を付与するには、次のクラスタ サービス アカウントに Compute イメージ ユーザーのロールを追加する必要があります。

    • デフォルトのコンピューティング サービス アカウント: CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com
    • GKE サービス アカウント: service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:CLUSTER_PROJECT_NUMBER@cloudservices.gserviceaccount.com \
        --role roles/compute.imageUser
    
    gcloud projects add-iam-policy-binding IMAGE_PROJECT_ID \
        --member serviceAccount:service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
        --role roles/compute.imageUser
    
  1. Pod テンプレートに nodeSelector を追加します。

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

    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
    …
    

次のステップ