このページでは、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
を実行して最新のバージョンを取得する。
Container File System API を有効にします。
クラスタがディスク イメージにアクセスしてノードに読み込まれるようにします。
要件
セカンダリ ブートディスクの使用には、次の要件が適用されます。
- この機能は、GKE バージョン 1.28.3-gke.106700 以降で使用できます。
ディスク イメージを変更するときは、新しいノードプールを作成する必要があります。既存のノードのディスク イメージを更新することはできません。
セカンダリ ブートディスク機能を使用するには、イメージ ストリーミングを構成する必要があります。
セカンダリ ブートディスクを構成する
以降のセクションでは、セカンダリ ブートディスクの構成方法について説明します。
データをプリロードする
セカンダリ ブートディスクを使用して GKE クラスタとノードプールを作成する前に、ビルド時にデータの準備ができたら、ディスク イメージを準備することをおすすめします(理想的には CI / CD パイプラインで自動化)。
データを含むディスク イメージを準備する
次の手順で、データソースとしてカスタム ディスク イメージを作成します。
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 パイプラインで自動化するのが理想的です)。
gke-disk-image-builder
の実行ログを保存する Cloud Storage バケットを作成します。プリロードされたコンテナ イメージを含むディスク イメージを作成します。
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
Pod テンプレートに
nodeSelector
を追加します。nodeSelector: cloud.google.com/gke-nodepool: NODE_POOL_NAME
セカンダリ ブートディスク キャッシュが使用中であることを確認します。
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 …
次のステップ
- イメージ ストリーミングを使用してコンテナ イメージを pull するで、ワークロードで必要なイメージデータをストリーミングしてコンテナ イメージを pull します。
- NVIDIA Collective Communication Library(NCCL)Fast Socket プラグインの使用方法については、NCCL Fast Socket を使用してワークロードの効率を向上させるをご覧ください。