このドキュメントでは、Google Kubernetes Engine(GKE)で Cloud Storage FUSE CSI ドライバのサイドカー コンテナのリソース設定を構成する方法について説明します。
GKE でアプリケーションのパフォーマンスとリソース使用率を最適化するには、Cloud Storage FUSE CSI ドライバのサイドカー コンテナに特定のリソース設定を構成します。限定公開イメージ、カスタム書き込みバッファ、カスタム読み取りキャッシュ ボリュームなどのリソースを設定することで、アプリケーションが Cloud Storage とどのようにやり取りするかをより細かく制御できます。これらの構成により、データアクセスの高速化、処理時間の短縮、GKE クラスタの全体的なリソース使用量の削減が可能になります。
このドキュメントは、アプリケーションのパフォーマンスを最適化するデベロッパー、管理者、アーキテクトを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。
始める前に、次のワークロードとストレージのコンセプトを理解しておいてください。
サイドカー コンテナの仕組み
Cloud Storage FUSE CSI ドライバは、サイドカー コンテナを使用して Cloud Storage バケットをマウントし、Kubernetes アプリケーションからローカル ファイル システムとしてアクセスできるようにします。このサイドカー コンテナ(gke-gcsfuse-sidecar)は、同じ Pod 内のワークロード コンテナとともに実行されます。ドライバは、Pod 仕様で gke-gcsfuse/volumes: "true" アノテーションを検出すると、サイドカー コンテナを自動的に挿入します。このサイドカー コンテナのアプローチは、セキュリティを確保し、リソースを効果的に管理するうえで役立ちます。
サイドカー コンテナは、Cloud Storage バケットのマウントの複雑さを解消し、Cloud Storage FUSE ランタイムを直接管理することなく、アプリケーションへのファイル システム アクセスを提供します。gke-gcsfuse/cpu-limit や gke-gcsfuse/memory-limit などのアノテーションを使用して、サイドカー コンテナのリソース上限を構成できます。サイドカー コンテナ モデルでは、Cloud Storage FUSE インスタンスがワークロードのライフサイクルに関連付けられるため、リソースが不要に消費されることはありません。つまり、ワークロード コンテナが終了すると、サイドカー コンテナは自動的に終了します(特に、RestartPolicy が Never の Job ワークロードまたは Pod の場合)。
OSS Istio の互換性
Cloud Storage FUSE CSI ドライバのサイドカー コンテナと Istio は、Pod 内で共存して同時に実行できます。ただし、GKE バージョン 1.29 以降では、Istio プロキシの準備が整う前に Cloud Storage FUSE がメタデータ サーバーに接続しようとすると、認証エラーが発生することがあります。このような認証エラーが発生した場合は、Pod 仕様の metadata.annotations に traffic.sidecar.istio.io/excludeOutboundIPRanges: 169.254.169.254/32 を追加することで、この問題を解決できます。このアノテーションは、GKE メタデータ サーバーの IP アドレスをリダイレクトから除外するように Istio を構成します。
カスタム書き込みバッファを構成する
Cloud Storage FUSE は、ローカル ディレクトリに書き込みをステージングし、close オペレーションまたは fsync オペレーションで Cloud Storage にアップロードします。
このセクションでは、Cloud Storage FUSE 書き込みバッファリング用のカスタム バッファ ボリュームを構成する方法について説明します。このシナリオは、Cloud Storage FUSE のデフォルトの emptyDir ボリュームを置き換えて、書き込みオペレーションでファイルをステージングする必要がある場合に適用できます。これは、Autopilot クラスタで 10 GiB を超えるファイルを書き込む必要がある場合に有効です。
ファイル キャッシュに、Cloud Storage FUSE CSI ドライバでサポートされている任意のタイプのストレージ(ローカル SSD、Persistent Disk ベースのストレージ、RAM ディスク(メモリ)など)を指定できます。GKE は、指定されたボリュームをファイルの書き込みバッファに使用します。これらのオプションの詳細については、ファイル キャッシュのバックアップ用ストレージを選択するをご覧ください。
Persistent Disk にバックアップされたカスタム バッファ ボリュームを使用するには、Pod の securityContext でゼロ以外の fsGroup を指定する必要があります。このステップでは、ボリュームに必要な読み取り権限または書き込み権限が非 root サイドカー コンテナに付与されます。Cloud Storage FUSE CSI ドライバを使用して PVC が Cloud Storage バケットを永続ボリュームとしてマウントする場合、この設定は必要ありません。
次の例は、バッファ ボリュームとして事前定義済みの PersistentVolumeClaim を使用する方法を示しています。
apiVersion: v1
kind: Pod
metadata:
annotations:
gke-gcsfuse/volumes: "true"
spec:
securityContext:
fsGroup: FS_GROUP
containers:
...
volumes:
- name: gke-gcsfuse-buffer
persistentVolumeClaim:
claimName: BUFFER_VOLUME_PVC
次のように置き換えます。
- FS_GROUP: fsGroup ID。
- BUFFER_VOLUME_PVC: 事前定義された PVC 名。
カスタム読み取りキャッシュ ボリュームを構成する
このセクションでは、Cloud Storage FUSE 読み取りキャッシュ用にカスタム キャッシュ ボリュームを構成する方法について説明します。
このシナリオは、Cloud Storage FUSE のデフォルトの emptyDir ボリュームを置き換えて、読み取りオペレーションでファイルをキャッシュに保存する必要がある場合に適用できます。GKE でサポートされている任意のタイプのストレージ(PersistentVolumeClaim など)を指定できます。GKE は、指定されたボリュームをファイル キャッシュに使用します。これは、Autopilot クラスタで 10 GiB を超えるファイルをキャッシュに保存する必要がある場合に有効です。
Persistent Disk にバックアップされたカスタム キャッシュ ボリュームを使用するには、Pod の securityContext でゼロ以外の fsGroup を指定する必要があります。このステップでは、ボリュームに必要な読み取り権限または書き込み権限が非 root サイドカー コンテナに付与されます。Cloud Storage FUSE CSI ドライバを使用して PVC が Cloud Storage バケットを永続ボリュームとしてマウントする場合は、この設定は必要ありません。
次の例では、キャッシュ ボリュームとして事前定義済みの PersistentVolumeClaim を使用する方法を示します。
apiVersion: v1
kind: Pod
metadata:
annotations:
gke-gcsfuse/volumes: "true"
spec:
securityContext:
fsGroup: FS_GROUP
containers:
...
volumes:
- name: gke-gcsfuse-cache
persistentVolumeClaim:
claimName: CACHE_VOLUME_PVC
次のように置き換えます。
- FS_GROUP:
fsGroupID。 - CACHE_VOLUME_PVC: 事前定義された PersistentVolumeClaim 名。
サイドカー コンテナの非公開イメージを構成する
このセクションでは、限定公開コンテナ レジストリにホストされているサイドカー コンテナ イメージの使用方法について説明します。このシナリオは、セキュリティのために限定公開ノードを使用する必要がある場合に該当します。
限定公開のサイドカー コンテナ イメージを構成して使用するには、次の操作を行います。
- 互換性のある公開サイドカー コンテナ イメージについては、こちらの GKE 互換性表をご覧ください。
- ローカル環境に pull して限定公開コンテナ レジストリに push します。
マニフェストで、image フィールドのみを含む
gke-gcsfuse-sidecarという名前のコンテナを指定します。GKE は、指定されたサイドカー コンテナ イメージを使用して、サイドカー コンテナ インジェクションを準備します。以下に例を示します。
apiVersion: v1 kind: Pod metadata: annotations: gke-gcsfuse/volumes: "true" spec: containers: - name: gke-gcsfuse-sidecar image: PRIVATE_REGISTRY/gcs-fuse-csi-driver-sidecar-mounter:PRIVATE_IMAGE_TAG - name: main # your main workload container.次のように置き換えます。
- PRIVATE_REGISTRY: 限定公開のコンテナ レジストリ。例:
us-central1-docker.pkg.dev/my-project/my-registry - PRIVATE_IMAGE_TAG: 限定公開のサイドカー コンテナ イメージのタグ。例:
v1.17.1-gke.1
- PRIVATE_REGISTRY: 限定公開のコンテナ レジストリ。例:
サイドカー コンテナ リソースを構成する
デフォルトでは、gke-gcsfuse-sidecar コンテナは、Standard クラスタと Autopilot クラスタに対して次のリソース リクエストとリソース上限で構成されます。
リクエスト:
- 250m CPU
- 256 MiB のメモリ
- 5 GiB のエフェメラル ストレージ
上限(GKE バージョン 1.29.1-gke.1670000 以降):
- 無制限の CPU
- 無制限のメモリ
- 無制限のエフェメラル ストレージ
上限(GKE バージョン 1.29.1-gke.1670000 より前):
- 250m CPU
- 256 MiB のメモリ
- 5 GiB のエフェメラル ストレージ
デフォルトでは、gke-gcsfuse-metadata-prefetch コンテナは、Standard クラスタと Autopilot クラスタに対して次のリソース リクエストとリソース上限で構成されます。
リクエスト:
- 10m CPU
- 10 MiB のメモリ
- 10 MiB のエフェメラル ストレージ
上限:
- 50m CPU
- 250 MiB のメモリ
- 無制限のエフェメラル ストレージ
Standard クラスタと Autopilot クラスタでデフォルト値を上書きできます。GKE によるコンテナ リソースの処理方法は、クラスタの運用モードによって異なります。
- Standard クラスタ: リクエストまたは上限のいずれかを設定し、もう一方は設定しないと、Pod のリソース上限とリソース リクエストが同じ値に設定されます。リクエストと上限の両方を設定すると、指定したリソース リクエストとリソース上限が Pod で正確に使用されます。値を設定しないと、デフォルトのリソース(上記を参照)が直接適用されます。
- Autopilot クラスタ: リクエストまたは上限のいずれかを設定し、もう一方は設定しないと、Pod のリソース上限とリソース リクエストが同じ値に設定されます。リソースのオーバーライドと設定されたデフォルトのリソース値が Pod の動作にどのように影響するかについては、Autopilot でリソース制限を設定するをご覧ください。
gke-gcsfuse-sidecar コンテナのデフォルト値を上書きするには、次の例に示すように、必要に応じてアノテーション gke-gcsfuse/[cpu-limit|memory-limit|ephemeral-storage-limit|cpu-request|memory-request|ephemeral-storage-request] を指定します。
gke-gcsfuse-metadata-prefetch コンテナのデフォルト値を上書きするには(GKE バージョン 1.32.3-gke.1717000 以降)、次の例に示すように、必要に応じてアノテーション gke-gcsfuse/[metadata-prefetch-cpu-limit|metadata-prefetch-memory-limit|metadata-prefetch-ephemeral-storage-limit|metadata-prefetch-cpu-request|metadata-prefetch-memory-request|metadata-prefetch-ephemeral-storage-request] を指定します。
apiVersion: v1
kind: Pod
metadata:
annotations:
gke-gcsfuse/volumes: "true"
# gke-gcsfuse-sidecar overrides
gke-gcsfuse/cpu-limit: "10"
gke-gcsfuse/memory-limit: 10Gi
gke-gcsfuse/ephemeral-storage-limit: 1Ti
gke-gcsfuse/cpu-request: 500m
gke-gcsfuse/memory-request: 1Gi
gke-gcsfuse/ephemeral-storage-request: 50Gi
# gke-gcsfuse-metadata-prefetch overrides
gke-gcsfuse/metadata-prefetch-cpu-limit: "10"
gke-gcsfuse/metadata-prefetch-memory-limit: 10Gi
gke-gcsfuse/metadata-prefetch-ephemeral-storage-limit: 1Ti
gke-gcsfuse/metadata-prefetch-cpu-request: 500m
gke-gcsfuse/metadata-prefetch-memory-request: 1Gi
gke-gcsfuse/metadata-prefetch-ephemeral-storage-request: 50Gi
値 "0" を使用するとリソース上限またはリソース リクエストの設定を解除できますが、gke-gcsfuse-sidecar コンテナはすでにすべての上限(cpu-limit、memory-limit、ephemeral-storage-limit)の設定が解除されており、gke-gcsfuse-metadata-prefetch コンテナはすでに ephemeral-storage-limit の設定が解除されているため、GKE バージョン 1.32.3-gke.1717000 以降のクラスタでこれらの上限を "0" に設定しても効果はありません。
たとえば、gke-gcsfuse-metadata-prefetch コンテナのメモリ上限の設定を解除するには gke-gcsfuse/metadata-prefetch-memory-limit: "0" を設定します。これは、ワークロードでメタデータ プリフェッチ機能に必要なリソースの量を特定できない場合に、ノード上の使用可能なすべてのリソースをメタデータ プリフェッチで消費できるようにするのに便利です。
(省略可)Cloud Profiler を使用してパフォーマンスを分析する
Cloud Profiler を使用すると、ストレージを多用するアプリケーションのリソース消費を継続的かつ詳細に把握できます。この詳細なデータは、Cloud Storage FUSE CSI ドライバとそのサイドカー コンテナの CPU とメモリ使用量をプロアクティブにモニタリングするのに役立ちます。Cloud Profiler のデータから得られる分析情報は、非効率的なコードパスの特定、リソース割り当ての最適化、メモリリークや予期しないメモリ不足(OOM)イベントなどの複雑な問題のトラブルシューティングに役立ちます。これらの問題がサービスの安定性に影響を与える前に解決できます。
Cloud Profiler の使用は任意であり、詳細なパフォーマンス診断を必要とする管理者を対象としています。Cloud Profiler は、ノード ドライバでデフォルトで有効になっています。サイドカー コンテナの場合、これは手動で有効にできるオプトイン機能です。
Cloud Profiler を有効にする前に
Cloud Storage FUSE CSI ドライバで Cloud Profiler を使用するには、GKE バージョン 1.36.0-gke.2403000 以降を使用していることを確認してください。プロファイルを生成する前に、Cloud Profiler API を有効にして、プロファイリングするコンポーネントに適切な IAM 権限を構成する必要があります。
API を有効にする
ノード ドライバに権限を付与する
プロファイリング データを Cloud Profiler に送信するには、ノードドライバに IAM 権限が必要です。ノード ドライバはデフォルトでホスト ネットワークで実行されるため、Workload Identity Federation for GKE ではなく、GKE ノードに関連付けられた IAM サービス アカウントを使用して認証を行います。
ノードのサービス アカウントに roles/cloudprofiler.agent ロールを付与します。
gcloud projects add-iam-policy-binding PROJECT_ID \
--role=roles/cloudprofiler.agent \
--member=serviceAccount:NODE_SERVICE_ACCOUNT
次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。NODE_SERVICE_ACCOUNT: GKE ノードで使用される IAM サービス アカウント。ノードが別のサービス アカウントを使用するように構成されていない限り、これは通常、デフォルトの Compute Engine サービス アカウント(PROJECT_NUMBER-compute@など)です。
サイドカー コンテナに権限を付与する
プロファイリング データを Cloud Profiler に送信するには、サイドカー コンテナと gcsfuse プロセスに IAM 権限が必要です。これらのコンポーネントは、ワークロード Pod に関連付けられた Kubernetes サービス アカウント(KSA)を使用する Workload Identity Federation for GKE を使用して認証を行います。
Pod が使用する KSA に roles/cloudprofiler.agent ロールを付与します。
gcloud projects add-iam-policy-binding projects/PROJECT_ID \
--role=roles/cloudprofiler.agent \
--member=principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME \
--condition=None
次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト ID。PROJECT_NUMBER: Google Cloud プロジェクトのプロジェクト番号。NAMESPACE: Kubernetes Namespace の名前。KSA_NAME: Kubernetes サービス アカウントの名前。
サイドカー ワークロードに対して Cloud Profiler を有効にする
サイドカー マウンタと基盤となる gcsfuse プロセスのプロファイルを生成するには、ワークロード仕様で enableCloudProfilerForSidecar ボリューム属性を "true" に設定します。サイドカー コンテナで Cloud Profiler を有効にすると、基盤となる gcsfuse プロセスでも自動的に有効になります。
BUCKET_NAME は、Cloud Storage バケットの名前に置き換えます。
volumes:
- name: gcs-fuse-csi-ephemeral
csi:
driver: gcsfuse.csi.storage.gke.io
volumeAttributes:
bucketName: BUCKET_NAME
enableCloudProfilerForSidecar: "true"
プロファイリング データを表示する
プロファイリング データを表示するには、 Google Cloud コンソールの [Cloud Profiler] ページに移動します。次のように [サービス名] フィルタを使用して、調査対象のコンポーネントを分析します。
| コンポーネント | サービス名フィルタ |
|---|---|
| ノードドライバ | gcs-fuse-csi-driver |
| サイドカー マウンタ | gke-gcsfuse-sidecar |
| GCS FUSE | gcsfuse |
Cloud Profiler は、POD_NAME_POD_UID 形式を使用して各インスタンスを識別します。これにより、Pod が再起動しても各インスタンスが一意に識別されます。
(省略可)GCSFuse プロファイリングを無効にする
デフォルトでは、サイドカー コンテナのプロファイリングを有効にすると、基盤となる gcsfuse プロセスもプロファイリングされます。リソースのオーバーヘッドを削減する場合や、サイドカー コンテナのパフォーマンスのみに分析を集中させる場合は、gcsfuse プロファイリングを無効にすることをおすすめします。
サイドカー プロファイリングを有効にしたまま gcsfuse プロファイリングを無効にするには、ボリューム仕様の mountOptions 属性に enable-cloud-profiler=false を追加します。
BUCKET_NAME は、Cloud Storage バケットの名前に置き換えます。
volumes:
- name: gcs-fuse-csi-ephemeral
csi:
driver: gcsfuse.csi.storage.gke.io
volumeAttributes:
bucketName: BUCKET_NAME
enableCloudProfilerForSidecar: "true"
mountOptions: "enable-cloud-profiler=false"
ロギングの詳細度を構成する
デフォルトでは、gke-gcsfuse-sidecar コンテナは info レベルと error レベルでログを生成します。ただし、デバッグや詳細な分析を行う場合は、ロギングの詳細レベルを調整する必要があります。このセクションでは、ロギングレベルを増減する方法について概説します。
マウント オプションを使用してロギングの詳細レベルを構成するか、CSI ドライバの機能を使用してボリューム属性値を必要な gcsfuse 構成設定に変換します。
ターゲット Pod マニフェストに、次の構成を追加します。
volumeAttributes:
bucketName: BUCKET_NAME
mountOptions: "implicit-dirs"
gcsfuseLoggingSeverity: LOGGING_SEVERITY
マウント オプションを使用するには、ターゲット Pod マニフェストに次の構成を含めます。
mountOptions: "logging:severity:LOGGING_SEVERITY"
次のように置き換えます。
- BUCKET_NAME: Cloud Storage バケット名。
- LOGGING_SEVERITY: 要件に応じて次のいずれかの値。
tracedebuginfowarningerror
Pod がデプロイされると、CSI ドライバは新しく構成されたロギングレベルで gcsfuse を開始します。
次のフィルタを使用して、ロギングの重大度が適用されているかどうかを確認できます。
resource.labels.container_name="gke-gcsfuse-sidecar"
resource.type="k8s_container"
resource.labels.pod_name="POD_NAME"
"severity:"
問題のトラブルシューティング
Cloud Storage FUSE の CSI ドライバのトラブルシューティングの詳細については、GitHub プロジェクトのドキュメントのトラブルシューティング ガイドをご覧ください。
次のステップ
- Cloud Storage FUSE CSI ドライバのパフォーマンスを最適化する方法について学習する。
- GitHub で CSI ドライバの使用に関する追加のサンプルを確認する。
- Cloud Storage Fuse の詳細を確認する。