GKE 向け Filestore マルチシェアでストレージを最適化する


このガイドでは、GKE Filestore CSI ドライバがある Google Kubernetes Engine 向け Filestore マルチシェアを使用する方法について説明します。

始める前に

  1. 始める前に、Filestore の使用に必要な設定手順を済ませます。

  2. GKE Filestore CSI ドライバ(バージョン 1.23 以降)を有効にします。

    • ドライバ バージョン 1.23~1.26 では、インスタンスごとに最大 10 個の共有がサポートされます。

    • ドライバ バージョン 1.27 以降では、インスタンスごとに最大 80 個の共有がサポートされます。

複数のアプリケーションで Filestore マルチシェアを使用する

このセクションでは、Filestore マルチシェアの StorageClass を使用して、DeploymentStatefulset の 2 つのアプリケーションをデプロイする方法を説明します。また、GKE で同じ基盤となる Filestore Enterprise インスタンス内ですべてのボリュームがビンパッキング(アプリケーションを GKE ノードに効率的にパックするプロセス)される仕組みについても説明します。

  1. GKE に用意された StorageClass enterprise-multishare-rwx を使用して、最大 10 個の共有をサポートするインスタンスを作成します。

    • 最大 80 個の共有をサポートするインスタンスを作成する場合は、カスタム StorageClass を作成する必要があります。このガイドでは、インスタンスあたりの共有を 10 個に制限した StorageClass を使用します。

    GKE Filestore CSI ドライバを有効にすると、ユーザーは次の構成で GKE に用意されたマルチシェア StorageClass enterprise-multishare-rwx にアクセスできます。この StorageClass を参照すると、GKE Filestore CSI ドライバは、動的ボリューム プロビジョニングを使用して、GKE のワークロード需要に沿って、新しい Persistent Volume Claims(PVC)用の永続ボリューム(PV)を自動的に作成します。

    kubectl describe sc enterprise-multishare-rwx
    Name:                  enterprise-multishare-rwx
    IsDefaultClass:        No
    Annotations:           components.gke.io/component-name=filestorecsi,components.gke.io/component-version=0.7.2,components.gke.io/layer=addon
    Provisioner:           filestore.csi.storage.gke.io
    Parameters:            instance-storageclass-label=enterprise-multishare-rwx,multishare=true,tier=enterprise
    AllowVolumeExpansion:  True
    MountOptions:          <none>
    ReclaimPolicy:         Delete
    VolumeBindingMode:     WaitForFirstConsumer
    Events:                <none>
    

カスタム StorageClass を作成する

Filestore インスタンスあたりの共有が最大 80 個という最新の容量制限を利用する場合は、次のテンプレートに基づいてカスタム StorageClass を作成します。

  apiVersion: storage.k8s.io/v1
  kind: StorageClass
  metadata:
    name: csi-filestore-multishare-128
  provisioner: filestore.csi.storage.gke.io
  parameters:
    tier: enterprise
    multishare: "true"
    max-volume-size: "128Gi"
    network: default
  allowVolumeExpansion: true

StorageClass の名前を変更する際は、次の要件を考慮してください。

  • StorageClass 名は、有効な DNS サブドメイン名になっている必要があります。

  • マルチ共有 StorageClass の名前はインスタンス ラベルとしても使用されるため、ラベルの命名ガイドラインに沿って行う必要があります。

  • アプリケーションで即時のボリューム プロビジョニングが必要な場合は、Immediate ボリューム バインディング モードを指定します。

    volumeBindingMode: Immediate

    たとえば、ボリューム プロビジョニングを GKE クラスタでの Pod の作成に依存させたくない場合は、この指定を使用します。

  • ドライバ バージョン 1.27 以降、インスタンスあたり 10 個を超える共有を割り当てる場合は、max-volume-size パラメータを追加して最初の列で許容される値のいずれかを割り当てます。

    最大ボリューム サイズ(共有サイズ) インスタンスあたりの最大共有数
    128 GiB 80
    256 GiB 40
    512 GiB 20
    1024 GiB 10

    たとえば、Key-Value ペア max-volume-size: "128Gi" を追加すると、StorageClass は最大 80 個の共有(それぞれが 10 GiB から 128 GiB の範囲)を 1 つの 10 TiB のエンタープライズティア インスタンスにマッピングします。

    • この機能は、GKE Filestore CSI ドライバ バージョン 1.23~1.26 で作成された Filestore インスタンスと下位互換性があります。

    • 既存のインスタンスでは、拡張された最小共有サイズ 10 GiB で新しい PVC(共有)を作成できます。

    • GKE Filestore CSI ドライバ バージョン 1.27 では、レガシー エンタープライズ インスタンスが認識され、デフォルトの最大共有サイズ 1,024 GiB(1 TiB)が割り当てられます。そのため、レガシー インスタンスではインスタンスあたりの共有数が最大 10 個に制限されます。

    詳細については、GKE 用 Filestore Multishares をご覧ください。

  1. 同じ 1 つの PVC を使用する複数の Pod レプリカがある Deployment を作成します。

    次のような YAML 構成ファイルを作成します。

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      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: test-pvc-fs
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: enterprise-multishare-rwx
      resources:
        requests:
          storage: 100Gi
    
    EOF
    
  2. Pod レプリカを確認します。

    a. コマンドラインから次のコマンドを実行して、PVC のステータスを確認します。

    kubectl get pvc
    

    次のようなレスポンスが表示されます。

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  35m
    

    b. コマンドラインで次のコマンドを実行して、Pod のステータスを確認します。

    kubectl get pod
    

    次のようなレスポンスが表示されます。

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          35m
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          35m
    
  3. レプリカをスケールします。

    a. コマンドラインで次のコマンドを実行して、Deployment を編集します。

    kubectl edit deployment web-server-multishare
    

    b. コマンドラインでファイルが開きます。spec.replicas フィールドを見つけて、その値を 10 に更新します。

    c. コマンドラインから次のコマンドを実行して、適用した変更を確認します。

    kubectl get pod
    

    次のようなレスポンスが表示されます。

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-5ctkf   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-8dwmw   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-csdbd   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-lndcq   1/1     Running   0          2s
    web-server-multishare-76c9ffb4b5-rgx82   1/1     Running   0          36m
    web-server-multishare-76c9ffb4b5-vtd6p   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-xm49s   1/1     Running   0          3s
    web-server-multishare-76c9ffb4b5-zjl27   1/1     Running   0          36m
    

    10 個の Pod が実行されていることがわかります。

    d. コマンドラインで次のコマンドを実行します。

    kubectl get deployment
    

    次のようなレスポンスが表示されます。

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   10/10   10           10          36m
    

    e. コマンドラインから次のコマンドを実行して、PVC の Bound ステータスを確認します。

    kubectl get pvc
    

    次のようなレスポンスが表示されます。

    NAME          STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs   Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx  37m
    

    f. コマンドラインで次のコマンドを実行して、Deployment を編集します。

    kubectl edit deployment web-server-multishare
    

    g. コマンドラインでファイルが開きます。spec.replicas フィールドを見つけて、その値を 2 に更新します。

    h. コマンドラインから次のコマンドを実行して、適用した変更を確認します。

    kubectl get pod
    

    次のようなレスポンスが表示されます。

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          38m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          38m
    
  4. Statefulset をデプロイします。

    基盤となる Filestore インスタンスを共有する 2 つ目のアプリケーションをデプロイします。

    これを行うには、200 GiB の容量をプロビジョニングし、それが最初のアプリケーションと同じ基盤となる Filestore インスタンスを使用することを確認します。

    次に、アプリケーションを、合計 900 GiB を使用する 9 つのレプリカ(それぞれ 100 GiB を使用する 9 つのレプリカ)にスケールし、インスタンスを共有することで GKE が同じ Filestore インスタンスを使用することを確認します。

    次のような YAML 構成ファイルを作成します。

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "nginx"
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: registry.k8s.io/nginx-slim:0.8
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: test-pvc-multishare
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: test-pvc-multishare
        spec:
          accessModes: [ "ReadWriteMany" ]
          storageClassName: enterprise-multishare-rwx
          resources:
            requests:
              storage: 100Gi
    
    EOF
    
    
  5. Statefulset のレプリカとボリュームを確認します。

    コマンドラインで次のコマンドを実行します。

    kubectl get pod
    

    次のようなレスポンスが表示されます。

    NAME                                     READY   STATUS    RESTARTS   AGE
    web-0                                    1/1     Running   0          4m48s
    web-1                                    1/1     Running   0          3m32s
    web-server-multishare-76c9ffb4b5-2dhml   1/1     Running   0          57m
    web-server-multishare-76c9ffb4b5-7mtcb   1/1     Running   0          57m
    

    最初の 2 つの Pod は Statefulset に関連付けられています。後の 2 つの Pod は Deployment に関連付けられています。

    コマンドラインで次のコマンドを実行します。

    kubectl get statefulset
    

    次のようなレスポンスが表示されます。

    NAME   READY   AGE
    web    2/2     2m8s
    

    コマンドラインで次のコマンドを実行します。

    kubectl get pvc
    

    次のようなレスポンスが表示されます。

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   54m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   114s
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   38s
    

    PVC test-pvc-fs は、Deployment web-server-multishare に関連付けられています。

    PVC test-pvc-multishare-web-0test-pvc-multishare-web-1 は、Statefulset に関連付けられています。

  6. Statefulset レプリカをスケールします。

    レプリカの数を 9 に増やします。数が増えると、対応する PVC が作成されます。

    a. コマンドラインで次のコマンドを実行します。

    kubectl  edit statefulset web
    

    b. コマンドラインでファイルが開きます。spec.replicas フィールドを見つけて、その値を 9 に更新します。

    c. コマンドラインから次のコマンドを実行して、適用した変更を確認します。

    kubectl get statefulset
    

    次のようなレスポンスが表示されます。

    NAME   READY   AGE
    web    9/9     13m
    

    d. コマンドラインで次のコマンドを実行します。

    kubectl get deployment
    

    次のようなレスポンスが表示されます。

    NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
    web-server-multishare   2/2     2            2           65m
    

    e. コマンドラインで次のコマンドを実行します。

    kubectl get pvc
    

    次のようなレスポンスが表示されます。

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-fs                 Bound    pvc-056d769d-a709-4bb2-b6d3-0361871b27a2   100Gi      RWX            enterprise-multishare-rwx   65m
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   100Gi      RWX            enterprise-multishare-rwx   13m
    test-pvc-multishare-web-1   Bound    pvc-8b37cd6e-d764-4d38-80d7-d74228536cfe   100Gi      RWX            enterprise-multishare-rwx   12m
    test-pvc-multishare-web-2   Bound    pvc-3fcbd132-939f-4364-807a-7c8ac6a3e64e   100Gi      RWX            enterprise-multishare-rwx   5m12s
    test-pvc-multishare-web-3   Bound    pvc-5894afa5-2502-4ee7-9d5c-b7378cb85479   100Gi      RWX            enterprise-multishare-rwx   4m57s
    test-pvc-multishare-web-4   Bound    pvc-ebbe452b-bc8f-4624-a830-a2094cce0d67   100Gi      RWX            enterprise-multishare-rwx   4m36s
    test-pvc-multishare-web-5   Bound    pvc-5a73a698-d174-44cb-a3a1-e767966c3417   100Gi      RWX            enterprise-multishare-rwx   4m20s
    test-pvc-multishare-web-6   Bound    pvc-102da6a9-2ca6-4f9e-9896-8fe14709db7a   100Gi      RWX            enterprise-multishare-rwx   3m55s
    test-pvc-multishare-web-7   Bound    pvc-160e81cd-c5bf-4ae6-966e-518e8249e02d   100Gi      RWX            enterprise-multishare-rwx   3m38s
    test-pvc-multishare-web-8   Bound    pvc-9b52d773-2e9a-40de-881c-dc06945ba3d7   100Gi      RWX            enterprise-multishare-rwx   118s
    
  7. Filestore インスタンスの状態を確認します。

    これで、2 つのレプリカ Pod がある Deployment、9 つのレプリカ Pod がある Statefulset、合計 10 個の PVC(それぞれのサイズは 100 GiB)が作成されました。すべてのボリュームは、1 つの Filestore マルチシェア インスタンスにまとめられます。

    a. コマンドラインで instances list コマンドを実行します。

    gcloud beta filestore instances list --project=YOUR_PROJECT_ID --region=REGION
    

    ここで

    • YOUR_PROJECT_ID は、使用されているプロジェクトの名前です。例: my-project

    • REGION は、使用されているリージョンの名前です。例: us-central1

    次のようなレスポンスが表示されます。

    INSTANCE_NAME                            LOCATION     TIER        CAPACITY_GB  FILE_SHARE_NAME  IP_ADDRESS   STATE  CREATE_TIME
    fs-a767cef8-738e-4c8e-b70b-09cbb872d016  us-central1  ENTERPRISE  1024         N/A              10.192.53.2  READY  2022-06-21T21:15:30
    

    b. コマンドラインで instances describe コマンドを実行します。

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1024'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/REGION/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    
    

    ここで

    • YOUR_PROJECT_ID は、使用されているプロジェクトの名前です。例: my-project

    • REGION は、使用されているリージョンの名前です。例: us-central1

PVC を拡張して Filestore インスタンスを確認する

このセクションでは、既存の PVC を拡張して、Filestore インスタンスのサイズを確認する方法について説明します。

  1. PVC を拡張します。

    PVC(Filestore マルチシェア インスタンスの共有を基盤とするもの)は、max-volume-size パラメータで指定された最大サイズまで拡張できます。これを確認するには、Pod で Statefulset に関連付けられたボリュームのいずれかを使用しながら、それを拡張します。

    コマンドラインから次のコマンドを実行して、レプリカ 0 の現在の PVC サイズを確認します。

    kubectl get pvc test-pvc-multishare-web-0 -o json
    {
        "apiVersion": "v1",
        "kind": "PersistentVolumeClaim",
        "metadata": {
            "annotations": {
                "pv.kubernetes.io/bind-completed": "yes",
                "pv.kubernetes.io/bound-by-controller": "yes",
                "volume.beta.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io",
                "volume.kubernetes.io/storage-provisioner": "filestore.csi.storage.gke.io"
            },
            "creationTimestamp": "2022-06-21T22:07:42Z",
            "finalizers": [
                "kubernetes.io/pvc-protection"
            ],
            "labels": {
                "app": "nginx"
            },
            "name": "test-pvc-multishare-web-0",
            "namespace": "default",
            "resourceVersion": "48395",
            "uid": "7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "spec": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "resources": {
                "requests": {
                    "storage": "100Gi"
                }
            },
            "storageClassName": "enterprise-multishare-rwx",
            "volumeMode": "Filesystem",
            "volumeName": "pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7"
        },
        "status": {
            "accessModes": [
                "ReadWriteMany"
            ],
            "capacity": {
                "storage": "100Gi"
            },
            "phase": "Bound"
        }
    }
    
    
  2. コマンドラインで次のコマンドを実行して、サイズを 500 GiB に増やします。

    kubectl edit pvc test-pvc-multishare-web-0
    
  3. コマンドラインでファイルが開きます。spec.resources.requests.storage フィールドを見つけて、その値を 500Gi に更新します。

  4. コマンドラインから次のコマンドを実行して、適用した変更を確認します。

    kubectl get pvc test-pvc-multishare-web-0
    

    次のようなレスポンスが表示されます。

    NAME                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS               AGE
    test-pvc-multishare-web-0   Bound    pvc-7aa21b5a-5343-4547-b7d7-414c16af15a7   500Gi      RWX            enterprise-multishare-rwx   28m
    

    Filestore CSI ドライバがリクエストを受け入れ、まず基盤となる Filestore インスタンスを拡張し、続いて PVC を支える共有を拡張します。

    具体的には、Filestore CSI ドライバで、インスタンスが 1536 Gi に自動的に拡張され、500Gi の新しい共有サイズに対応しました。

  5. コマンドラインから、次の instances describe コマンドを実行して Filestore インスタンスの容量を確認します。

    gcloud filestore instances describe fs-a767cef8-738e-4c8e-b70b-09cbb872d016 --project=YOUR_PROJECT_ID --region=REGION
    capacityGb: '1536'
    capacityStepSizeGb: '256'
    createTime: '2022-06-21T21:15:30.464237089Z'
    labels:
      storage_gke_io_created-by: filestore_csi_storage_gke_io
      storage_gke_io_storage-class-id: enterprise-multishare-rwx
    maxCapacityGb: '10240'
    maxShareCount: '10'
    multiShareEnabled: true
    name: projects/YOUR_PROJECT_ID/locations/us-central1/instances/fs-a767cef8-738e-4c8e-b70b-09cbb872d016
    networks:
    - connectMode: DIRECT_PEERING
      ipAddresses:
      - 10.192.53.2
      modes:
      - MODE_IPV4
      network: csi-filestore-test-network
      reservedIpRange: 10.192.53.0/26
    state: READY
    tier: ENTERPRISE
    

    ここで

    • YOUR_PROJECT_ID は、使用されているプロジェクトの名前です。例: my-project

    • REGION は、使用されているリージョンの名前です。例: us-central1

共有 VPC での動的プロビジョニング

GKE 用の Filestore CSI ドライバは、共有 VPC にあるサービス プロジェクトのボリュームの動的プロビジョニングをサポートしています。以下のセクションでは、Filestore CSI ドライバを使用して、共有 VPC ネットワークにあるサービス プロジェクトの Filestore マルチシェア インスタンスに、ボリュームを動的にプロビジョニングする方法を説明します。

  1. 共有 VPC ネットワークとプライベート サービス アクセスの設定手順を済ませます。

  2. StorageClass を作成して、共有 VPC 上の Filestore マルチシェア インスタンスによって支えられるボリュームを動的にプロビジョニングします。

    次のコマンドを実行して、StorageClass リソースをデプロイします。

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-sharedvpc
    provisioner: filestore.csi.storage.gke.io
    parameters:
      network: "projects/HOST_PROJECT_ID/global/networks/SHARED_VPC_NAME"
      connect-mode: PRIVATE_SERVICE_ACCESS
      tier: enterprise
      multishare: "true"
    allowVolumeExpansion: true
    
    EOF
    

    ここで

    予約済みの IP アドレス範囲内にリソースをデプロイする場合は、コマンドで使用するパラメータに次の行を追加します。

    reserved-ip-range: RESERVED_NAME
    

    ここで、RESERVED_NAME は Filestore インスタンスをプロビジョニングできる予約済み IP アドレス範囲の名前です。例: filestore-reserved-ip-range予約済み IP 範囲を指定する場合は、CIDR 値そのものではなく名前付きアドレス範囲を指定する必要があります。

    詳細については、IP アドレス範囲の割り振りまたは予約済み IP アドレス範囲の構成をご覧ください。Google Cloud コンソールを使用して予約済みの名前を作成する方法の例については、IP の割り振りを作成するをご覧ください。

  3. Deployment を作成します。

    次のコマンドを実行して Deployment リソースを作成します。

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      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: test-pvc-fs-sharedvpc
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-sharedvpc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-sharedvpc
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

CMEK 対応の Filestore インスタンス

CMEK 対応 Filestore マルチシェア インスタンスにホストされる GKE ボリュームを作成できます。このセクションでは、Filestore インスタンスの顧客管理の暗号鍵(CMEK)を設定する方法について説明します。

顧客管理の暗号鍵の詳細は、StorageClass で指定できます。この StorageClass を参照する Filestore CSI ドライバによって動的に作成されたインスタンスで、CMEK が有効になります。

  1. CMEK 対応 StorageClass を作成します。

    a. 次のコマンドを実行します。

    cat <<EOF | kubectl apply -f -
    
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: csi-filestore-multishare-cmek
    provisioner: filestore.csi.storage.gke.io
    parameters:
      tier: enterprise
      multishare: "true"
      instance-encryption-kms-key: projects/KEY_PROJECT_ID/locations/REGION/keyRings/RING_NAME/cryptoKeys/KEY_NAME
    
    allowVolumeExpansion: true
    
    EOF
    

    ここで

    • KEY_PROJECT_ID は、鍵が置かれているプロジェクトの名前です。例: my-key-project

    • REGION は、使用されているリージョンの名前です。例: us-central1

    • RING_NAME は、キーリング名です。例: my-key-ring-name

    • KEY_NAME は、鍵名です。例: my-key-name

  2. Deployment を作成します。

    b. 次のコマンドを実行して Deployment リソースを作成します。

    cat <<EOF | kubectl apply -f -
    
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-server-multishare
      labels:
        app: nginx
    spec:
      replicas: 5
      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: test-pvc-fs-cmek
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: test-pvc-fs-cmek
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: csi-filestore-multishare-cmek
      resources:
        requests:
          storage: 100Gi
    
    EOF
    

PVC を Filestore インスタンスにマッピングする

このセクションでは、PVC を Filestore インスタンスにマッピングする方法について説明します。

Filestore マルチシェア インスタンスでは、各 PVC が Filestore CSI ドライバによって Filestore インスタンスにホストされます。ボリュームをホストする基盤となる Filestore インスタンスと、Kubernetes ボリュームを表す共有の詳細は、永続ボリューム仕様の volumeHandle フィールドでキャプチャされます。ボリューム ハンドルの形式は次のとおりです。

modeMultishare/<storageclass-prefix>/<project>/<region>/<filestore-instance-name>/<filestore-share-name>

次の kubectl コマンドを使用すると、PVC、PV、Filestore インスタンス、Filestore 共有の間のマッピングを速やかに判断できます。

コマンドラインで次のコマンドを実行します。

kubectl get pv -o jsonpath='{range .items[*]}{"pv="}{.metadata.name}{",pvc="}{.spec.claimRef.name}{",volumeHandle="}{.spec.csi.volumeHandle}{"\n"}{end}'

次のようなレスポンスが表示されます。

pv=pvc-67ad9abd-f25e-4130-b7ca-64d28bd29525,pvc=test-pvc-multishare,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_67ad9abd_f25e_4130_b7ca_64d28bd29525

pv=pvc-c80f4de0-9916-4957-b8ae-b21206650ac0,pvc=test-pvc-fs-sharedvpc,volumeHandle=modeMultishare/csi-filestore-multishare-sharedvpc/YOUR_PROJECT_ID/us-central1/fs-2109f680-3f04-4ada-b4bc-2a1c7fc47b88/pvc_c80f4de0_9916_4957_b8ae_b21206650ac0

ここで

  • YOUR_PROJECT_ID は、使用されているプロジェクトの名前です。例: my-project

クラスタ内の 2 つの永続ボリュームが、1 つの Filestore インスタンスでホストされていることがわかります。

次のステップ