このブログを構築する際に、GCSにブログ記事のファイルなどをアップロードし、GKEのPodにマウントすることで記事の配信をしたいと考えていました。
その際に、公式のCloud Storage FUSE CSI ドライバを使用して Cloud Storage バケットにアクセスするを参考にマウントを実装したのですが、ガイドのボリュームが多く、また実装する上でいくつか気を付けることがあったので、こちらに残したいと思います。
主なコードはこちらにアップロードしています。PersistentVolume
にて実装しました。
おおまかに以下の手順で実装しています。
roles/storage.objectUser
のロールを割り当てPersistentVolume
、PersistentVolumeClaim
を作成してPodに紐づけるちなみにですが、GKE Autopilot
のバージョン1.24以上を使っているので、Cloud Storage FuseのCSIドライバを有効にするステップは飛ばしています。
GKEのPodでNextJS
のフロントエンドアプリを動作しており、こちらのようなDockerfileの構成をしています。
nodejsをコンテナ内で実行するときに、nexjs
ユーザーで実行しているため、マウントしているGCSの領域についても権限変更をしないとroot扱いとなるため読み込みができなくなります。
ガイドの考慮事項にも記載がありますが、以下のようにPersistentVolume
のspec.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
uid
とgid
についてはDockerfileで設定したidをそれぞれ設定します。
均一
にする権限設定を実施しても、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からアクセスできるようになりました。