Filestore CSI ドライバを使用して Filestore インスタンスにアクセスする

Filestore CSI ドライバは、Google Kubernetes Engine(GKE)で Filestore インスタンスを使用するための主要な方法です。Filestore CSI ドライバは、オープンソースの Google Cloud Filestore CSI ドライバを利用したフルマネージドのエクスペリエンスを提供します。

Filestore CSI ドライバのバージョンは、Kubernetes のマイナー バージョン番号に関連付けられています。Filestore CSI ドライバのバージョンは通常、Kubernetes マイナー バージョンがリリースされた時点で入手可能な最新のドライバです。クラスタが最新の GKE パッチにアップグレードされると、ドライバは自動的に更新されます。

利点

Filestore CSI ドライバには、以下のような利点があります。

  • Kubernetes API(kubectl)を使用してフルマネージド NFS ストレージにアクセスできます。

  • GKE Filestore CSI ドライバを使用して、PersistentVolume を動的にプロビジョニングできます。

  • GKE Filestore CSI ドライバで、ボリューム スナップショットを使用できます。CSI ボリューム スナップショットは、Filestore バックアップの作成に使用できます。

    Filestore バックアップでは、すべてのファイルデータとメタデータを含むファイル共有の差分コピーが作成され、インスタンスとは別に保存されます。このコピーは、新しい Filestore インスタンスに対してのみ復元できます。既存の Filestore インスタンスへの復元はサポートされていません。Filestore バックアップは、ボリューム スナップショット クラスtype:backup フィールドを追加することで、CSI Volume Snapshot API を使用してトリガーできます。

  • GKE Filestore CSI ドライバで、ボリューム拡張を使用できます。ボリューム拡張を使用すると、ボリュームの容量を変更できます。

  • Kubernetes ワークロードで事前にプロビジョニングされた Filestore インスタンスを使用することで、既存の Filestore インスタンスにアクセスできます。StorageClassDeployment を使用して Filestore インスタンスを動的に作成または削除し、Kubernetes ワークロードで使用することも可能です。

  • GKE 向け Filestore マルチシェアをサポートしています。この機能により、Filestore インスタンスを作成し、任意の数の GKE クラスタにまたがって、複数の小さな NFS にマウントされた PersistentVolume を同時に割り当てることができます。

要件

  • Filestore CSI ドライバを使用するには、クラスタで GKE バージョン 1.21 以降を使用する必要があります。
  • Filestore のマルチシェア機能を使用するには、クラスタで GKE バージョン 1.23 以降を使用する必要があります。
  • Filestore CSI ドライバは、Linux を使用するクラスタでのみサポートされています。Windows Server ノードはサポートされていません。
  • Filestore の最小インスタンス サイズは最低でも 1 TiB です。最小インスタンス サイズは、選択した Filestore のサービスティアによって変わります。詳細については、サービスティアをご覧ください。
  • Filestore は、Filestore インスタンス上で NFSv3 ファイル システム プロトコルを使用し、NFSv3 互換クライアントをサポートします。

始める前に

作業を始める前に、次のことを確認してください。

  • Cloud Filestore API と Google Kubernetes Engine API を有効にします。
  • API を有効にする
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得します。

新しいクラスタで Filestore CSI ドライバを有効にする

新しい Standard クラスタを作成する際に Filestore CSI ドライバを有効にするには、Google Cloud CLI または Google Cloud コンソールで次の手順を行います。

gcloud

gcloud container clusters create CLUSTER_NAME \
    --addons=GcpFilestoreCsiDriver \
    --cluster-version=VERSION

以下を置き換えます。

  • CLUSTER_NAME: クラスタの名前。
  • VERSION: GKE のバージョン番号。 この機能を使用するには、1.21 以降のバージョンを選択する必要があります。または、--release-channel フラグを使用してリリース チャンネルを指定することもできます。

コンソール

  1. Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. [ 作成] をクリックします。

  3. Standard クラスタモードを選択し、[構成] をクリックします。

  4. 必要に応じてクラスタを構成します。

  5. ナビゲーション パネルの [クラスタ] の下の [機能] をクリックします。

  6. [Filestore CSI ドライバの有効化] チェックボックスをオンにします。

  7. [作成] をクリックします。

共有 VPC ネットワークで Filestore を使用する場合は、共有 VPC を使用して新しいクラスタで Filestore CSI ドライバを有効にするをご覧ください。

Filestore CSI ドライバを有効にすると、ドライバとプロビジョナー名 filestore.csi.storage.gke.io を使用して、Kubernetes Volume でドライバを使用できます。

既存のクラスタで Filestore CSI ドライバを有効にする

既存のクラスタで Filestore CSI ドライバを有効にするには、Google Cloud CLI か Google Cloud コンソールを使用します。

既存のクラスタでドライバを有効にするには、次の手順を行います。

gcloud

gcloud container clusters update CLUSTER_NAME \
   --update-addons=GcpFilestoreCsiDriver=ENABLED

CLUSTER_NAME を、既存のクラスタの名前に置き換えます。

コンソール

  1. Google Cloud コンソールで [Google Kubernetes Engine] ページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [機能] の [Filestore CSI ドライバ] フィールドの横にある [Filestore CSI ドライバの編集] をクリックします。

  4. [Filestore CSI ドライバの有効化] チェックボックスをオンにします。

  5. [変更を保存] をクリックします。

Filestore CSI ドライバを無効にする

既存の Autopilot や Standard クラスタで Filestore CSI ドライバを無効にするには、Google Cloud CLI または Google Cloud コンソールを使用します。

gcloud

gcloud container clusters update CLUSTER_NAME \
    --update-addons=GcpFilestoreCsiDriver=DISABLED \
    --region REGION

次の値を置き換えます。

  • CLUSTER_NAME: 既存のクラスタの名前。
  • REGION: クラスタのリージョン(us-central1 など)。

コンソール

  1. Google Cloud コンソールで、Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

  3. [機能] の [Filestore CSI ドライバ] フィールドの横にある [Filestore CSI ドライバの編集] をクリックします。

  4. [Filestore CSI ドライバの有効化] チェックボックスをオフにします。

  5. [変更を保存] をクリックします。

Filestore CSI ドライバを使用して既存の Filestore インスタンスにアクセスする

このセクションでは、Kubernetes Volume で、GKE の Filestore CSI ドライバを使用して既存の Filestore インスタンスにアクセスする一般的なプロセスについて説明します。

インスタンスにアクセスするための PersistentVolume と PersistentVolumeClaim を作成する

  1. 次の例に示すようなマニフェスト ファイルを作成し、preprov-filestore.yaml という名前を付けます。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: PV_NAME
    spec:
      storageClassName: ""
      capacity:
        storage: 1Ti
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Filesystem
      csi:
        driver: filestore.csi.storage.gke.io
        volumeHandle: "modeInstance/FILESTORE_INSTANCE_LOCATION/FILESTORE_INSTANCE_NAME/FILESTORE_SHARE_NAME"
        volumeAttributes:
          ip: FILESTORE_INSTANCE_IP
          volume: FILESTORE_SHARE_NAME
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: ""
      volumeName: PV_NAME
      resources:
        requests:
          storage: 1Ti
    
  2. preprov-filestore.yaml マニフェスト ファイルに基づいて PersistentVolumeClaim リソースと PersistentVolume リソースを作成するために、次のコマンドを実行します。

    kubectl apply -f preprov-filestore.yaml
    

次に、Volume を消費する Deployment を作成するに進みます。

Filestore CSI ドライバを使用して Volume にアクセスする

次のセクションでは、GKE で Filestore CSI ドライバによって管理される Kubernetes Volume を使用する際の一般的なプロセスについて説明します。

StorageClass の作成

Filestore CSI ドライバを有効にすると、GKE は、Filestore インスタンスをプロビジョニングするために、以下の StorageClass を自動でインストールします。

インストールされている StorageClass の名前を確認するには、次のコマンドを実行します。

kubectl get sc

また、provisioner フィールドに filestore.csi.storage.gke.io を追加して、Filestore CSI ドライバを使用する別の StorageClass をインストールすることも可能です。

  1. 次のマニフェストを filestore-example-class.yaml として保存します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: filestore-example
    provisioner: filestore.csi.storage.gke.io
    volumeBindingMode: Immediate
    allowVolumeExpansion: true
    parameters:
      tier: standard
      network: default
    

    マニフェストの以下のパラメータ構成を検討します。

    • volumeBindingModeImmediate に設定すると、ボリュームのプロビジョニングをすぐに開始できます。これが可能になるのは、Filestore インスタンスがどのゾーンからもアクセスできるためです。したがって、Compute Engine 永続ディスクとは異なり、GKE は Pod がスケジュールされているゾーンを認識する必要がありません。WaitForFirstConsumer に設定すると、GKE は Pod がスケジュールされて初めてプロビジョニングを開始します。詳細については、VolumeBindingMode をご覧ください。
    • tier パラメータには、任意のティアstandardpremiumzonal または enterprise など)を指定できます。network パラメータは、デフォルト以外の VPC で Filestore インスタンスをプロビジョニングする際に使用できます。デフォルト以外の VPC には、特別なファイアウォール ルールを設定する必要があります。
  2. filestore-example-class.yaml マニフェスト ファイルに基づいて StorageClass リソースを作成するには、次のコマンドを実行します。

    kubectl create -f filestore-example-class.yaml
    

共有 VPC ネットワークで Filestore を使用する場合は、共有 VPC で Filestore CSI ドライバを使用する場合の StorageClass の作成をご覧ください。

PersistentVolumeClaim を使用して Volume にアクセスする

Filestore CSI ドライバの StorageClass を参照する PersistentVolumeClaim リソースを作成できます。

プリインストールまたはカスタムの StorageClass を使用できます。

次のマニフェスト ファイルの例では、filestore-example という名前の StorageClass を参照する PersistentVolumeClaim を作成しています。

  1. 次のマニフェスト ファイルを pvc-example.yaml として保存します。

    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
      - ReadWriteMany
      storageClassName: filestore-example
      resources:
        requests:
          storage: 1Ti
    
  2. pvc-example.yaml マニフェスト ファイルに基づいて PersistentVolume リソースを作成するには、次のコマンドを実行します。

    kubectl create -f pvc-example.yaml
    

Volume を消費する Deployment を作成する

次の Deployment マニフェストの例では、pvc-example.yaml という名前の PersistentVolume リソースを使用しています。

複数の Pod が同じ PersistentVolumeClaim リソースを共有できます。

  1. 次のマニフェストを filestore-example-deployment.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-deployment
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - mountPath: /usr/share/nginx/html
              name: mypvc
          volumes:
          - name: mypvc
            persistentVolumeClaim:
              claimName: podpvc
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: podpvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: filestore-example
      resources:
        requests:
          storage: 1Ti
    
  2. filestore-example-deployment.yaml マニフェスト ファイルに基づいて Deployment を作成するには、次のコマンドを実行します。

    kubectl apply -f filestore-example-deployment.yaml
    
  3. Deployment が正常に作成されたことを確認します。

    kubectl get deployment
    

    Filestore インスタンスのプロビジョニングが完了するまで、しばらく時間がかかることがあります。それまで、Deployment は READY ステータスを報告しません。進行状況は、次のコマンドを実行して、PVC のステータスをモニタリングすることで確認できます。

    kubectl get pvc
    

    Volume のプロビジョニングが完了すると、PVC が BOUND ステータスになります。

Filestore インスタンスにラベルを付ける

ラベルを使用すると、関連するインスタンスをグループ化し、インスタンスに関するメタデータを格納できます。ラベルは、Filestore インスタンスを整理する際に役立つ Key-Value ペアです。各リソースにラベルを設定し、そのラベルに基づいてリソースをフィルタリングできます。

ラベルを指定するには、StorageClass.parameterslabels キーを使用します。Filestore インスタンスには、インスタンスが作成された PersistentVolumeClaim/PersistentVolume に関する情報を使用してラベル付けできます。カスタムラベルのキーと値は、ラベルの命名規則に従う必要があります。Filestore インスタンスにカスタムラベルを適用する方法については、Kubernetes のストレージ クラスの例をご覧ください。

Filestore ボリュームで fsgroup を使用する

Kubernetes は fsGroup を使用して、Pod の SecurityContext でユーザーがリクエストした fsGroup に合わせてボリュームの権限とオーナー権限を変更します。fsGroup は、Pod 内のすべてのコンテナに適用される補助グループです。Filestore CSI ドライバによってプロビジョニングされたボリュームに fsgroup を適用できます。

共有 VPC で Filestore を使用する

このセクションでは、サービス プロジェクトから共有 VPC ネットワークで Filestore インスタンスを使用する方法について説明します。

共有 VPC を使用するクラスタを設定する

共有 VPC ネットワークを使用するクラスタを設定するには、次の手順を行います。

  1. ホスト プロジェクトとサービス プロジェクトを作成します
  2. ホスト プロジェクトとサービス プロジェクトの両方で Google Kubernetes Engine API を有効にします
  3. ホスト プロジェクトで、ネットワークとサブネットを 1 つずつ作成します
  4. ホスト プロジェクトで共有 VPC を有効にします
  5. ホスト プロジェクトで、サービス プロジェクトの GKE サービス アカウントに HostServiceAgent ユーザーロール バインディングを付与します。
  6. 共有 VPC ネットワークでプライベート サービス アクセスを有効にします

共有 VPC を使用する新しいクラスタで Filestore CSI ドライバを有効にする

共有 VPC を使用する新しいクラスタで Filestore CSI ドライバを有効にするには、次の手順を行います。

  1. 使用可能なサブネットとセカンダリ範囲を確認します。クラスタを作成する際には、クラスタの Pod と Service に使用するサブネットとセカンダリ IP アドレス範囲を指定する必要があります。

    gcloud container subnets list-usable \
       --project=SERVICE_PROJECT_ID \
       --network-project=HOST_PROJECT_ID
    

    出力は次のようになります。

    PROJECT                   REGION       NETWORK     SUBNET  RANGE
    HOST_PROJECT_ID  us-central1  shared-net  tier-1  10.0.4.0/22
    ┌──────────────────────┬───────────────┬─────────────────────────────┐
    │ SECONDARY_RANGE_NAME │ IP_CIDR_RANGE │            STATUS           │
    ├──────────────────────┼───────────────┼─────────────────────────────┤
    │ tier-1-pods          │ 10.4.0.0/14   │ usable for pods or services │
    │ tier-1-services      │ 10.0.32.0/20  │ usable for pods or services │
    └──────────────────────┴───────────────┴─────────────────────────────┘
    
  2. GKE クラスタを作成します。次の例では、gcloud CLI を使用して、共有 VPC 用に構成された Autopilot クラスタまたは Standard クラスタを作成する方法を示します。次の例では、ネットワークと 2 つのサブネットを作成するの、ネットワーク、サブネット、範囲名を使用します。

    Autopilot

    gcloud container clusters create-auto tier-1-cluster \
       --project=SERVICE_PROJECT_ID \
       --region=COMPUTE_REGION \
       --network=projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME \
       --subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME \
       --cluster-secondary-range-name=tier-1-pods \
       --services-secondary-range-name=tier-1-services
    

    Standard

    gcloud container clusters create tier-1-cluster \
       --project=SERVICE_PROJECT_ID \
       --zone=COMPUTE_REGION \
       --enable-ip-alias \
       --network=projects/HOST_PROJECT_ID/global/networks/NETWORK_NAME \
       --subnetwork=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET_NAME \
       --cluster-secondary-range-name=tier-1-pods \
       --services-secondary-range-name=tier-1-services \
       --addons=GcpFilestoreCsiDriver
    
  3. クラスタ内のノード、Pod、Service 間の通信を許可するファイアウォール ルールを作成します。次の例は、my-shared-net-rule-2 という名前のファイアウォール ルールを作成する方法を示します。

    gcloud compute firewall-rules create my-shared-net-rule-2 \
       --project HOST_PROJECT_ID \
       --network=NETWORK_NAME \
       --allow=tcp,udp \
       --direction=INGRESS \
       --source-ranges=10.0.4.0/22,10.4.0.0/14,10.0.32.0/20
    

    この例で、ソース範囲の IP 値は、前のステップで使用可能なサブネットとセカンダリ範囲を確認した際に取得したものです。

共有 VPC で Filestore CSI ドライバを使用する場合に StorageClass を作成する

次の例は、共有 VPC で Filestore CSI ドライバを使用する場合に、StorageClass を作成する方法を示します。

cat <<EOF | kubectl apply -f -

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: filestore-sharedvpc-example
provisioner: filestore.csi.storage.gke.io
parameters:
  network: "projects/HOST_PROJECT_ID/global/networks/SHARED_VPC_NAME"
  connect-mode: PRIVATE_SERVICE_ACCESS
  reserved-ip-range: RESERVED_IP_RANGE_NAME
allowVolumeExpansion: true

EOF

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

  • HOST_PROJECT_ID: 共有 VPC ネットワークのホスト プロジェクトの ID または名前。
  • SHARED_VPC_NAME: 前に作成した共有 VPC ネットワークの名前。
  • RESERVED_IP_RANGE_NAME: Filestore インスタンスをプロビジョニングする特定の予約済み IP アドレス範囲の名前。このフィールドは省略できます。予約済み IP アドレス範囲を指定する場合は、CIDR 値を直接指定するのではなく名前付きアドレス範囲を指定する必要があります。

v1.23 以降が実行されている GKE クラスタで Filestore マルチシェアに基づくボリュームをプロビジョニングする場合は、GKE 向け Filestore マルチシェアでストレージを最適化するをご覧ください。

Filestore 単一共有ボリュームを再接続する

基本 HDD、基本 SSD、エンタープライズ(単一共有)ティアで Filestore を使用している場合は、以下の手順で既存の Filestore インスタンスを GKE ワークロードに再接続できます。

  1. 特定のインスタンスに関する情報の取得の手順に沿って、事前にプロビジョニングされた Filestore インスタンスの詳細を確認します。

  2. PersistentVolume 仕様を再デプロイします。volumeAttributes フィールドで、次のフィールドを変更して、ステップ 1 の Filestore インスタンスと同じ値を使用します。

    • ip: この値を事前にプロビジョニングされた Filestore インスタンスの IP アドレスに変更します。
    • volume: この値を事前にプロビジョニングされた Filestore インスタンスの共有名に変更します。
  3. PersistentVolumeClaim 仕様を再デプロイします。volumeName で、ステップ 2 と同じ PersistentVolume 名を参照するようにします。

  4. kubectl get pvc を実行して、PersistentVolumeClaim と PersistentVolume のバインディング ステータスを確認します。

  5. Pod 仕様を再デプロイし、Pod が Filestore 共有に再びアクセスできるようにします。

次のステップ