Header Logo
Ⓒ 2024- @itatibs
Cloud Storage FUSE CSIを使ったGKEからGCSをマウントする際のTips

Category: tech
Tags(仮): NextJS,GKE,GCS
Date: 2024/9/20

はじめに

このブログを構築する際に、GCSにブログ記事のファイルなどをアップロードし、GKEのPodにマウントすることで記事の配信をしたいと考えていました。
その際に、公式のCloud Storage FUSE CSI ドライバを使用して Cloud Storage バケットにアクセスするを参考にマウントを実装したのですが、ガイドのボリュームが多く、また実装する上でいくつか気を付けることがあったので、こちらに残したいと思います。

全体的の流れ

主なコードはこちらにアップロードしています。PersistentVolumeにて実装しました。
おおまかに以下の手順で実装しています。

  • GKE 用 Workload Identity 連携を使用して Cloud Storage バケットへのアクセスを構成する
    • GKEのnamespaceは作成済みのためスキップ
    • GCSのバケットには読み書きができるroles/storage.objectUserのロールを割り当て
  • 静的プロビジョニングを使用してボリュームをプロビジョニングする
    • PersistentVolumePersistentVolumeClaimを作成してPodに紐づける

ちなみにですが、GKE Autopilotのバージョン1.24以上を使っているので、Cloud Storage FuseのCSIドライバを有効にするステップは飛ばしています。

発生した問題点と解決

GCSをマウントする際にUID, GIDを指定する

GKEのPodでNextJSのフロントエンドアプリを動作しており、こちらのようなDockerfileの構成をしています。
nodejsをコンテナ内で実行するときに、nexjsユーザーで実行しているため、マウントしているGCSの領域についても権限変更をしないとroot扱いとなるため読み込みができなくなります。

ガイドの考慮事項にも記載がありますが、以下のようにPersistentVolumespec.mountOptionsにてuid, gid, file-mode, dir-modeを設定することで適切な権限に変更することができます。

apiVersion: v1 kind: PersistentVolume metadata: name: gcs-fuse-csi-pv spec: accessModes: - ReadWriteMany capacity: storage: 20Gi storageClassName: shanari-storage-class mountOptions: - uid=1001 - gid=1001 - file-mode=755 - dir-mode=755 - implicit-dirs csi: driver: gcsfuse.csi.storage.gke.io volumeHandle: shanari-blog-posts volumeAttributes: gcsfuseLoggingSeverity: warning

uidgidについてはDockerfileで設定したidをそれぞれ設定します。

GCSのアクセス制御を均一にする

権限設定を実施しても、Error: EIO: i/o error, readのようなエラーが発生し、GCS内のファイルにアクセスできないようでした。
また、GKEのログを確認したところ、ReadFile: input/output error, fh.reader.ReadAt: startRead: NewReader: googleapi: got HTTP response code 412 with body: <?xml version='1.0' encoding='UTF-8'?><Error><Code>PreconditionFailed</Code><Message>The operation requires that Uniform Bucket Level Access be enabled.</Message><Details>The type of authentication token used for this request requires that Uniform Bucket Level Access be enabled.</Details></Error>というようなエラーも出力されていました。
こちらについては、トラブルシューティングガイドにも記載されているのですが、GCSの対象のバケットのアクセス制御がきめ細かい管理の場合に発生するようでした。
権限より均一に変更することで、対象のファイルにGKEからアクセスできるようになりました。