アプリへのFile Storage for VPCの追加

Red Hat OpenShift on IBM Cloud クラスター内のアプリケーション向けに File Storage for VPC をプロビジョニングするために使用できる、あらかじめ定義されたストレージクラスを提供します。 各ストレージクラスでは、プロビジョニングするファイル共有に対して、利用可能な容量、IOPS、ファイルシステム、および保存期間が指定されます。 また、ユースケースに合わせて独自のストレージクラスを作成することもできます。

続行する前に、以下の注意事項を確認してください。

  • ストレージ・クラスを使用して特定のタイプのストレージをプロビジョンした後は、ストレージ・デバイスのタイプや保存ポリシーを変更することはできません。 ただし、ストレージ容量とパフォーマンスを向上させたい場合は、 サイズを変更 し、 IOPS を変更することができます。 ストレージのタイプおよび保存期間ポリシーを変更するには、新しいストレージインスタンスを作成し、古いストレージインスタンスから新しいストレージインスタンスへデータをコピーする必要があります。
  • クラスタとVPCが別々のリソースグループになっている場合、ファイル共有をプロビジョニングする前に、独自のストレージクラスを作成し、resourceGroup セクションにVPCリソースグループIDを、securityGroupIDs セクションに kube-<clusterID> セキュリティグループIDを指定する必要があります。 セキュリティグループIDを取得するには、以下のようにする。 詳細については、独自のストレージクラスを作成する を参照してください。
  • クラスターバージョンで新しいセキュリティグループルールが導入されました4.11以降。 これらのルールの変更により、セキュリティグループを同期してから使用する必要があります。File Storage for VPC 。 詳細については、追加File Storage for VPCアプリへ
  • バージョンで新しいストレージクラスが追加されました2.0アドオンの。 古いストレージ クラスを使用する新しいファイル共有をプロビジョニングすることはできなくなります。 古いストレージ クラスを使用する既存のボリュームは引き続き機能しますが、古いクラスを使用して作成されたボリュームを拡張することはできません。 詳細については、新しいストレージクラスへの移行
  • を使用したPVCの作成はサポートされていません。 StorageClassSecrets を使ったPVCの作成はサポートされていません。
  • クラスタを作成するユーザが、VPC Infrastructure ServicesのReader、Writer、およびOperator権限を持っていることを確認します。
  • ファイル共有で暗号化を使用する場合は、VPCインフラストラクチャからKMS/HPCSへの サービス認証を設定して ください。

IBM Cloudは、専用鍵管理サービスをHyper Protect Crypto ServicesからKey Protect Dedicatedに変更します。

新しいセキュリティグループ規則は、 4.11 以降のバージョンで導入されました。 これらのルール変更により、 File Storage for VPC を使用する前にセキュリティグループを同期する必要があります。 クラスターが最初に 4.11 以前のバージョンで作成された場合、セキュリティグループ設定を同期するために以下のコマンドを実行してください。

  1. クラスタのIDを取得してください。
    ibmcloud oc cluster ls
    
  2. kube-<clusterID> セキュリティー・グループの ID を取得します。
    ibmcloud is sg kube-CLUSTER_ID  | grep ID
    
  3. 前のステップで取得したIDを使って、kube-<clusterID> セキュリティグループを同期します。
    ibmcloud ks security-group sync -c CLUSTER_ID --security-group ID
    

クイックスタート: File Storage for VPC

クラスタ向けに File Storage for VPC を動的にプロビジョニングするために、パーシステント・ボリューム・クレーム(PVC)を作成します。 動的プロビジョニングにより、対応する永続ボリューム(PV)が自動的に作成され、 アカウント内のファイル共有が注文されます。

第2世代のストレージクラスを 選択できるようになった。

  1. Red Hat OpenShift クラスターにアクセスします

  2. 以下のコマンドを実行して、プリインストールされているストレージ・クラスを確認します。 詳しくは、ストレージ・クラス・リファレンスを参照してください。

    oc get sc | grep vpc-file
    
  3. 以下の YAML をファイルに保存します。 この例では、ギガバイト・サイズ 10Giibmc-vpc-file-min-iops ストレージ・クラスを使用して、 my-pvc という名前のクレームを作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc # Enter a name for your PVC.
    spec:
      accessModes:
      - ReadWriteMany # The file share can be mounted on multiple nodes and pods.
      resources:
        requests:
          storage: 20Gi # Enter the size of the storage in gigabytes (Gi).
      storageClassName: ibmc-vpc-file-min-iops # Enter the name of the storage class that you want to use.
    
  4. PVC を作成します。

    oc apply -f my-pvc.yaml
    
  5. PVC が作成され、PV にバインドされたことを確認します。

    oc describe pvc my-pvc
    

    出力例

    Name:        my-pvc
    Namespace:    default
    StorageClass:    ""
    Status:        Bound
    Volume:        pvc-0d787071-3a67-11e7-aafc-eef80dd2dea2
    Labels:        <none>
    Capacity:    20Gi
    Access Modes:    RWX
    Events:
        FirstSeen    LastSeen    Count    From                                SubObjectPath    Type        Reason            Message
        ---------    --------    -----    ----                                -------------    --------    ------            -------
        1m        1m        1    {ibm.io/ibmc-vpc-file 31898035-3011-11e7-a6a4-7a08779efd33 }            Normal        ProvisioningSucceeded    Successfully provisioned volume pvc-0d787071-3a67-11e7-aafc-eef80dd2dea2
    
  6. 以下のデプロイメント構成を deployment.yaml というファイルに保存し、前のステップで作成した PVC を参照します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-deployment
    spec:
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox:1.28
            command: [ "sh", "-c", "sleep 1h" ]
            volumeMounts:
            - name: my-vol
              mountPath: /data/demo # Mount path for the application.
          volumes:
          - name: my-vol
            persistentVolumeClaim:
              claimName: my-pvc # Your PVC name.
    
    volumeMounts.mountPath
    containers の volumeMounts セクションに、コンテナー内部でボリュームをマウントするディレクトリーの絶対パスを入力します。 マウントパスに書き込まれたデータは、物理的な File Storage for VPC インスタンス内の root ディレクトリに保存されます。 異なるアプリ間でボリュームを共有したい場合は、各アプリごとに ボリュームのサブパスを指定することができます。
    volumeMounts.name
    containers の volumeMounts セクションで、ポッドにマウントするボリュームの名前を入力します。
    volume.name
    volumes セクションで、ポッドにマウントするボリュームの名前を入力します。 通常、この名前は volumeMounts.name と同じです。
    claimName
    volumes の persistentVolumeClaim セクションで、使用する PV をバインドする PVC の名前を入力します。
  7. デプロイメントを作成します。

    oc apply -f deployment.yaml
    
  8. PV が正常にマウントされたことを確認します。

    oc describe deployment my-deployment
    

    マウント・ポイントは Volume Mounts フィールドにあり、ボリュームは Volumes フィールドにあります。

    Containers:
      Mounts:
        /data/demo from my-vol (rw)
    Volumes:
    my-vol:
      Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
      ClaimName:  my-pvc
      ReadOnly:   false
    
  9. オプション: ポッドの実行後に、 ストレージ・ボリュームの拡張 を試行します。

新しいストレージクラスへの移行

  • バージョンで新しいストレージクラスが追加されました2.0アドオンの。
  • 古いストレージ クラスを使用する新しいファイル共有をプロビジョニングすることはできなくなります。
  • 古いストレージ クラスを使用する既存のボリュームは引き続き機能しますが、古いクラスを使用して作成されたボリュームを拡張することはできません。
  • ボリューム拡張機能が必要な場合は、次の手順を実行してアプリを新しいストレージ クラスに移行します。
  • ボリューム拡張機能が必要ない場合は、移行する必要はなく、PVC は通常どおり機能し続けます。
  • 次の手順では、手動移行について説明します。
  1. 移行する PVC を見つけて、PVC 名と関連付けられている PV 名の両方をメモします。

    oc get pvc
    
  2. PVC を使用しているアプリをスケールダウンします。

    oc scale deployment DEPLOYMENT --replicas 0
    
  3. アプリが使用しているPVオブジェクトを編集して、回収ポリシーを変更します。Retain ストレージクラス ibmc-vpc-file-min-iops

    kubectl edit pv PV
    
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 20Gi
      claimRef:
        apiVersion: v1
        kind: PersistentVolumeClaim
        name: <pvc-name>
        namespace: default
        ...
      persistentVolumeReclaimPolicy: Retain # Change delete to retain
      storageClassName: ibmc-vpc-file-min-iops # Enter a new storage class
      volumeMode: Filesystem
    
  4. 既存の PVC オブジェクトを削除します。

    kubectl delete pvc PVC
    
  5. PVを再度編集し、claimRef セクション。

    kubectl edit pv PV
    
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 20Gi
      #claimRef:
        #apiVersion: v1
        #kind: PersistentVolumeClaim
        #name: <pvc-name>
        #namespace: default
        #resourceVersion: "381270"
        #uid: 4042f319-1233-4187-8549-8249a840a8dd
    
  6. 以前の PVC と同じ名前とサイズの PVC を作成します。 これは、影響を受けるすべての PVC に対して 1 つずつ実行する必要があります。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: <pvc-name>
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: <size>Gi
      storageClassName: ibmc-vpc-file-min-iops
    
  7. PVC を使用していたアプリをスケールアップします。

    k scale deployment DEPLOYMENT --replicas x
    
  8. ボリューム拡張を引き続き使用するには、ボリューム拡張の設定

ボリューム拡張のセットアップ

拡張をサポートするボリュームをプロビジョニングするには、allowVolumeExpansiontrue に設定されているストレージ・クラスを使用する必要があります。

File Storage for VPC クラスターアドオンは、オンラインモードとオフラインモードの両方での拡張をサポートします。 ただし、拡張は File Storage for VPC プロファイルの 指定されたサイズおよびIOPs範囲内でのみ可能です。

2.0 バージョンで新しいストレージクラスが導入されました。 ボリューム拡張は、アドオンの以前のバージョンのストレージ クラスを使用する共有では機能しません。

開始前に

マウントされたボリュームの拡張

  1. PVC がアプリ・ポッドによってマウントされた後、PVC の spec.resources.requests.storage フィールドの値を編集して、ボリュームを拡張できます。 ボリュームを拡張するには、PVC を編集して、spec.resources.requests.storage フィールドの値を大きくします。

    kubectl edit pvc my-pvc
    
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 50Gi
    
  2. PVC を保存して閉じます。 ボリュームが拡張されるまで数分待ちます。

  3. ボリュームが展開されていることを確認してください。

    kubectl get pvc
    

    出力例

    NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
    my-pvc   Bound    pvc-25b6912e-75bf-41ca-b6b2-567fa4f9d245   50Gi       RWX            ibmc-vpc-file-min-iops   3m31s
    

アプリへの既存のファイル・ストレージの添付

クラスター用に File Storage for VPC を静的にプロビジョニングするために、パーシステント・ボリューム・クレーム(PVC)を作成します。 静的プロビジョニングにより、クラスター管理者は既存のストレージ・デバイスをクラスターで使用できるようにすることができます。

  1. クラスター ID を取得します。

    ibmcloud ks cluster ls
    
  2. kube-<clusterID> セキュリティグループのIDを取得します。

    ibmcloud is sg kube-CLUSTER_ID  | grep ID
    
  3. ファイル共有を作成する。 詳しくは、「 ファイル共有およびマウント・ターゲットの作成」を参照してください。

    ibmcloud is share-create --name my-file-share --zone us-south-2 --profile dp2 --size 1000 --iops 1000
    
  4. 共有マウントターゲットを作成し、--vni-sgs オプションで先ほど取得した kube-<clusterID> セキュリティグループIDを指定します。

    ibmcloud is share-mount-target-create my-file-share --subnet my-subnet --name NAME --vni-name my-share-vni-1  --vni-sgs kube-CLUSTER_ID --resource-group-name Default --vpc ID
    
  5. 永続ボリューム (PV) を作成する前に、ファイル共有に関する詳細を取得します。

    ibmcloud is shares
    
  6. ご自身の株式の詳細をご確認ください。 マウント・ターゲットをメモします。

    ibmcloud is share SHARE-ID
    

    コマンドの例。

    ibmcloud is share r134-bad98878-1f63-45d2-a3fd-60447094c2e6
    

    出力例

    ID                           r134-bad98878-1f63-45d2-a3fd-60447094c2e6   
    Name                         pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0   
    CRN                          crn:v1:staging:public:is:us-south-1:a/77f2bceddaeb577dcaddb4073fe82c1c::share:r134-bad98878-1f63-45d2-a3fd-60447094c2e6   
    Lifecycle state              stable   
    Access control mode          security_group   
    Zone                         us-south-1   
    Profile                      dp2   
    Size(GB)                     10   
    IOPS                         100   
    User Tags                    clusterid:cpjao3l20dl78jadqkd0,namespace:default,provisioner:vpc.file.csi.ibm.io,pv:pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0,pvc:pv-file,reclaimpolicy:delete,storageclass:custom-eni   
    Encryption                   provider_managed   
    Mount Targets                ID                                          Name      
                                r134-aa2aabb8-f616-47be-886b-99220852b728   pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0      
    Resource group               ID                                 Name      
                                300b9469ee8676f9a038ecdf408c1a9d   Default      
    Created                      2024-06-11T19:55:11+05:30   
    Replication role             none   
    Replication status           none   
    Replication status reasons   Status code   Status message      
    
  7. Mount Path とも呼ばれる nfsServerPath を取得します。

    ibmcloud is share-mount-target SHARE-ID SHARE-TARGET-ID
    

    コマンドの例。

    ibmcloud is share-mount-target  r134-bad98878-1f63-45d2-a3fd-60447094c2e6 r134-aa2aabb8-f616-47be-886b-99220852b728
    

    出力例

    ID                          r134-aa2aabb8-f616-47be-886b-99220852b728   
    Name                        pvc-e7e005a9-e96b-41ad-9d6e-74650a9110a0   
    VPC                         ID                                          Name      
                                r134-f05922d4-d8ab-4f64-9a3d-82664b303bc1   vpc-public      
    Access control mode         security_group   
    Resource type               share_mount_target   
    Virtual network interface   ID                                          Name      
                                0716-6407fb4b-e962-49c4-8556-dc94f4574b4b   defective-chloride-huffy-gladly      
    Lifecycle state             stable   
    Mount path                  10.240.0.23:/89d8a454_f552_42bf_8374_4d31481edf4d   
    Transit Encryption          none   
    Created                     2024-06-11T19:55:12+05:30
    
  8. ファイル共有を参照する static-file-share.yaml という PV 構成ファイルを作成します。

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: static-file-share
    spec:
      mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 10Gi
      csi:
        volumeAttributes:
          nfsServerPath: NFS-SERVER-PATH
        driver: vpc.file.csi.ibm.io
        volumeHandle: FILE-SHARE-ID#SHARE-TARGET-ID
    
  9. PV を作成します。

    oc apply -f static-file-share.yaml
    
  10. PVC を作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-static
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: "" #Leave the storage class blank.
    
  11. PVC を作成して PV をバインドします。

    oc apply -f pvc-static.yaml
    
  12. デプロイメントファイル名 testpod.yaml を作成し、ファイルシェアをアプリケーションポッドにアタッチします。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: testpod
      labels:
        app: testpod
    spec:
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox:1.28
            command: [ "sh", "-c", "sleep 1h" ]
            volumeMounts:
            - name: my-vol
              mountPath: /data/demo # Mount path for the application.
          volumes:
          - name: pvc-name
            persistentVolumeClaim:
              claimName: pvc-static # The name of the PVC that you created earlier
    
    spec.containers.volumeMounts.mountPath
    コンテナー内でボリュームがマウントされるディレクトリーの絶対パスを入力します。 マウントパスに書き込まれたデータは、物理的な File Storage for VPC インスタンス内の root ディレクトリに保存されます。 異なるアプリ間でボリュームを共有したい場合は、各アプリごとに ボリュームのサブパスを指定することができます。
    volumeMounts.name
    ポッドにマウントするボリュームの名前を入力します。
    volume.name
    ポッドにマウントするボリュームの名前を入力します。 通常、この名前は volumeMounts.name と同じです。
    volumes.persistentVolumeClaim.claimName
    使用したいPVをバインドしているPVCの名前を入力してください。
  13. デプロイメントを作成します。

    oc apply -f testpod.yaml
    

独自のストレージ・クラスの作成

File Storage for VPC インスタンスに最適な設定を反映させた、独自のストレージクラスを作成することができます。 コストを低く抑えるために、最初は最小スループットでPVCのプロビジョニングを行い、その後、ニーズが明確になってきたら、PVCにアクセスして スループットを 調整することができます。

以下の機能が必要な場合は、 独自のストレージ・クラスを作成 する必要があります。

  • アプリは非 root として実行する必要があります。
  • クラスターは、VPC およびサブネットとは異なるリソース・グループ内にあります。
  • 指定されたノード上または指定されたゾーン内のポッドへのファイル共有アクセスを制限する必要があります。
  • HPCS や Key Protectなどの KMS プロバイダーを使用して、独自の (BYOK) 暗号化を使用する必要があります。
  • 仮想ネットワーク・インターフェース(VNI) のサブネットまたは IP アドレスを手動で指定する必要があります。
  • 容量と帯域幅をもっとコントロールする必要がある。 この場合、 rfs プロファイルを使用できます。 詳細については、 地域ファイル共有の概要を 参照してください。
  • 特定の固定IOPSの dp2 プロファイルについて、要求されたPVC容量を、サポートされる最小容量に切り上げるように設定したい。 詳細については、「 固定IOPSプロファイルでの自動キャパシティ丸めを有効にする 」を参照してください。

クラスタとVPCが同じリソースグループにない場合は、resourceGroup セクションにVPCリソースグループIDを、securityGroupIDs セクションに kube-<clusterID> セキュリティグループIDを指定する必要があります。 ibmcloud is sg kube-CLUSTER_ID | grep ID を実行すれば、kube-<clusterID> セキュリティ・グループのIDがわかります。

  1. ストレージクラスの設定ファイルを作成します。 以下の例では、 dp2 プロファイルを 使用しています。 第 1 世代と第 2 世代の ストレージ クラスから選択します。

    第一世代の例:

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-vpc-file-custom-sc
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
        profile: "dp2" # or rfs
        billingType: "hourly" # hourly or monthly
        encrypted: "false"
        encryptionKey: "" # If encrypted is true, then a user must specify the CRK-CRN.
        resourceGroup: "" # Resource group ID. By default, the resource group of the cluster will be used from storage-secrete-store secret.
        isENIEnabled: "true" # VPC File Share VNI feature will be used by all PVCs created with this storage class.
        securityGroupIDs: "" # By default cluster security group i.e kube-<clusterID> will be used. User can provide their own comma separated SGs.
        subnetID: "" # User can provide subnetID in which the VNI will be created. Zone and region are mandatory for this. If not provided CSI driver will use the subnetID available in the cluster's VPC zone.
        region: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        zone: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        primaryIPID: "" # Existing ID of reserved IP from the same subnet as the file share zone. Zone and region are mandatory for this. SubnetID is not mandatory for this.
        primaryIPAddress: "" # IPAddress for VNI to be created in the subnet of the zone. Zone, region and subnetID are mandatory for this.
        iops: "" # Example: 100, this option is valid only for the dp2 profile.
        allowCapacityRoundoffForIops: "true" # Optional. Enables automatic capacity roundoff for fixed IOPS dp2 profiles. When set to "true", if the requested PVC size is lower than the minimum supported capacity for the requested IOPS, the driver automatically provisions the volume at the minimum supported capacity. Disabled by default. Requires a Virtual Private Endpoint Gateway (VPEG) to IBM Global Catalog.
        throughput: "" # Example: 2000, this option is valid only for the rfs profile
        tags: "" # User can add a list of tags "a, b, c" that will be used at the time of provisioning file share, by default CSI driver has its own tags.
        uid: "0" # The initial user identifier for the file share, by default its root.
        gid: "0" # The initial group identifier for the file share, by default its root.
        classVersion: "1"
    reclaimPolicy: "Delete"
    allowVolumeExpansion: true
    

    第二世代の例:

    第一世代の ibmc-vpc-file-min-iops ストレージクラスを使用して 10Gi PVC をプロビジョニングする場合、最大 IOPS は 1,000 です。 デフォルトの割り当ては100で、スループットは210Mbpsに固定され、チューニングはできない。

    ただし、第2世代の ibmc-vpc-file-regional ストレージ・クラスを使用して 10Gi PVCをプロビジョニングする場合、IOPSは35,000に固定され、最大スループットはデフォルトで8 Mbpsであるにもかかわらず、8192 Mbpsまで調整可能です。

    別の例として、サイズが16TB未満でIOPS 500固定のPVCを、第一世代の ibmc-vpc-file-500-iops ストレージクラスを使って最初にプロビジョニングする場合、IOPSとスループットは固定され、サイズとIOPSに基づいて計算されます。

    このPVCを16TBを超えて拡張するには、第一世代の ibmc-vpc-file-500-iops ストレージクラスは使えない。 代わりに第2世代の ibmc-vpc-file-regional-max-bandwidth ストレージ・クラスを使用することで、任意のサイズのPVCを最大32TBまでプロビジョニングすることができ、最大35000IOPSと8192Mbpsのデフォルト・スループットを持ち、これは調整可能である。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-vpc-file-regional-max-bandwidth
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
      annotations:
        version: v2.0
        revision: "1"
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
      profile: "rfs" # general-purpose, sdp, 5iops-tier, 10iops-tier, or custom
      billingType: "hourly"
      encrypted: "false"
      encryptionKey: ""
      resourceGroup: ""
      throughput: "8192" # Example: 2000
      classVersion: "1"
      isENIEnabled: "true"   # VPC File Share ENI/VNI feature will be used by all PVCs created with this storage class.
      securityGroupIDs: ""   # By default cluster security group i.e kube-<clusterID> will be used. User can provide their own command separated SGs.
      subnetID: ""         # User can provide subnetID in which the ENI/VNI will be created.If not provided CSI driver will use the subnetID available in the cluster' VPC zone.
      primaryIPID: ""      # Existing ID of reserved IP from any of subnets within the VPC,subnetID is not mandatory for this.
      primaryIPAddress: "" # IPAddress for ENI/VNI to be created in the respective subnet,subnetID is mandatory for this.
      uid: "0"             # The initial user identifier for the file share, by default its root.
      gid: "0"             # The initial group identifier for the file share, by default its root.
    allowVolumeExpansion: true # Select true or false. Only supported on version 3.0.1 and later
    reclaimPolicy: "Delete"
    
  2. カスタマイズしたストレージ・クラスをクラスターに作成します。

    oc apply -f custom-storageclass.yaml
    
  3. ストレージ・クラスがクラスター内に存在することを確認します。

    oc get sc
    

    出力例

    ibmc-vpc-file-custom-sc                       vpc.file.csi.ibm.io
    

デフォルトのストレージクラスの設定

  • デフォルトのストレージクラスの変更は、アドオンのバージョン2.0以降でのみ可能です。
  • デフォルトのストレージ・クラスは、プリインストールされたFile Storage for VPC クラスか、独自のカスタム・ストレージ・クラスのいずれかに設定できます。 カスタム・ストレージ・クラスを使用している場合は、プロビジョナーが vpc.file.csi.ibm.io に設定されていることを確認してください。
  • クラスタ内で複数のストレージ・クラスがデフォルトとして設定されている場合、デフォルトのストレージ・クラスのいずれかが使用される可能性があります。 ベスト・プラクティスとして、また正しいストレージ・クラスが使用されるように、新しいデフォルト・クラスを設定する前に、クラスタ内の既存のデフォルト・ストレージ・クラスをすべて削除してください。 VPC ブロックストレージ・アドオンもインストールされている場合、VPC ブロックストレージ・クラスがすでにデフォルトとして設定されている可能性があります。 新しいデフォルトを設定する前にこれを削除するには、「 VPC ブロックストレージのデフォルトのストレージクラスの変更 」を参照してください。
  1. addon-vpc-file-csi-driver-configmap configmapを編集し、SET_DEFAULT_STORAGE_CLASS パラメータにストレージクラス名を指定します。

    oc edit cm addon-vpc-file-csi-driver-configmap -n kube-system
    

    出力例

    SET_DEFAULT_STORAGE_CLASS: "ibmc-vpc-file-eit"
    
  2. file-csi-driver-status configmapを記述して、デフォルトが正しく設定されていることを確認してください。

    oc describe cm file-csi-driver-status -n kube-system
    

    出力例。

    events:
    ----
    - event: EnableVPCFileCSIDriver
      description: 'VPC File CSI Driver enable successful, DriverVersion: v2.0.6'
      timestamp: "2024-09-20 12:01:02"
    - event: Change default storage class request
      description: Successfully set 'ibmc-vpc-file-eit' as default storage class
      timestamp: "2024-09-20 12:01:36"
    

非 root として実行されるアプリのデプロイ

ストレージクラスの uid および gid パラメータは、インフラストラクチャレベルでファイル共有の初期ユーザーおよびグループ識別子を設定します。 VPC ファイルストレージにおける補助 ID の仕組みに関する背景情報については、「 VPC ファイル共有の補助 ID 」を参照してください。

  1. 独自のストレージ・クラスを作成し、アプリに使用するグループ ID またはユーザー ID を指定します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: ibmc-vpc-file-custom-sc
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
        profile: "dp2"
        iops: "100"
        billingType: "hourly" # hourly or monthly
        encrypted: "false"
        uid: "3000" # The initial user identifier for the file share.
        gid: "1000" # The initial group identifier for the file share.
        classVersion: "1"
    reclaimPolicy: "Delete"
    allowVolumeExpansion: true
    
  2. 以下の YAML を my-pvc.yaml というファイルに保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: ibmc-vpc-file-custom-sc
    
  3. PVC を作成します。

    oc apply -f my-pvc.yaml
    
  4. PVC をマウントするポッドを作成します。

    apiVersion: v1
    kind: Pod
    metadata:
      name: security-context-demo
    spec:
      securityContext:
        runAsUser: 3000
        runAsGroup: 1000
      volumes:
      - name: sec-ctx-vol
        persistentVolumeClaim:
            claimName: my-pvc
      containers:
      - name: sec-ctx-demo
        image: busybox:1.28
        command: [ "sh", "-c", "sleep 1h" ]
        volumeMounts:
        - name: sec-ctx-vol
          mountPath: /data/demo
        securityContext:
          allowPrivilegeEscalation: false
    
  5. ポッドが実行中であることを確認してください。

    oc get pods
    

KMS暗号File Storage for VPCの設定

IBM® Key Protect や Hyper Protect Crypto Services などのキー管理サービス(KMS)プロバイダーを利用して、 File Storage for VPC インスタンスで、ストレージへの書き込み時にデータを暗号化するために使用するプライベートルートキーを作成します。 秘密のルートキーを作成したら、そのルートキーを使用して独自のストレージクラスまたは Kubernetes のシークレットを作成し、そのストレージクラスまたはシークレットを使用して File Storage for VPC インスタンスをプロビジョニングしてください。

  1. 使用するKMSプロバイダーのインスタンスを作成します。

  2. KMSインスタンスにルートキーを作成します。

  3. 顧客管理型暗号化の前提条件を 完了し、 IBM® Key Protect へのアクセスを File Storage for VPC に許可する。 必ず与えてくださいFile Storage for VPC少なくとも Reader KMS インスタンスへのアクセス。

  4. カスタム・ストレージ・クラスを作成し、KMSの詳細を指定します。

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: custom-sc-encrypted
      labels:
        app.kubernetes.io/name: ibm-vpc-file-csi-driver
    provisioner: vpc.file.csi.ibm.io
    mountOptions:
      - hard
      - nfsvers=4.1
      - sec=sys
    parameters:
        profile: "dp2"
        billingType: "hourly" # hourly or monthly
        encrypted: "true"
        encryptionKey: "" # Specify the root key CRN.
        resourceGroup: "" # Resource group ID. By default, the resource group of the cluster will be used from storage-secrete-store secret.
        isENIEnabled: "true" # VPC File Share VNI feature will be used by all PVCs created with this storage class.
        securityGroupIDs: "" # By default cluster security group i.e kube-<clusterID> will be used. User can provide their own comma separated SGs.
        subnetID: "" # User can provide subnetID in which the VNI will be created. Zone and region are mandatory for this. If not provided CSI driver will use the subnetID available in the cluster's VPC zone.
        region: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        zone: "" # VPC CSI driver will select a region from cluster node's topology. The user can override this default.
        primaryIPID: "" # Existing ID of reserved IP from the same subnet as the file share zone. Zone and region are mandatory for this. SubnetID is not mandatory for this.
        primaryIPAddress: "" # IPAddress for VNI to be created in the subnet of the zone. Zone, region and subnetID are mandatory for this.
        tags: "" # User can add a list of tags "a, b, c" that will be used at the time of provisioning file share, by default CSI driver has its own tags.
        uid: "0" # The initial user identifier for the file share, by default its root.
        gid: "0" # The initial group identifier for the file share, by default its root.
        classVersion: "1"
    reclaimPolicy: "Delete"
    allowVolumeExpansion: true
    
  5. ストレージ・クラスを作成します。

    oc apply -f encrypted-class.yaml
    
  6. 以下の YAML を my-pvc.yaml というファイルに保存します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: custom-sc-encrypted
    
  7. PVC を作成します。

    oc apply -f my-pvc.yaml
    
  8. 以下のデプロイメント構成を deployment.yaml というファイルに保存し、前のステップで作成した PVC を参照します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      labels:
        app: my-deployment
    spec:
      selector:
        matchLabels:
          app: busybox
      template:
        metadata:
          labels:
            app: busybox
        spec:
          containers:
          - name: busybox
            image: busybox:1.28
            command: [ "sh", "-c", "sleep 1h" ]
            volumeMounts:
            - name: my-vol
              mountPath: /data/demo # Mount path for the application.
          volumes:
          - name: my-vol
            persistentVolumeClaim:
              claimName: my-pvc # Your PVC name.
    
    volumeMounts.mountPath
    containers の volumeMounts セクションに、コンテナー内部でボリュームをマウントするディレクトリーの絶対パスを入力します。 マウントパスに書き込まれたデータは、物理的な File Storage for VPC インスタンス内の root ディレクトリに保存されます。 異なるアプリ間でボリュームを共有したい場合は、各アプリごとに ボリュームのサブパスを指定することができます。
    volumeMounts.name
    containers の volumeMounts セクションで、ポッドにマウントするボリュームの名前を入力します。
    volume.name
    volumes セクションで、ポッドにマウントするボリュームの名前を入力します。 通常、この名前は volumeMounts.name と同じです。
  9. デプロイメントを作成します。

    oc apply -f deployment.yaml
    

転送中の暗号化 (EIT) の設定

File Storage for VPC で転送中の暗号化を設定するには、 「 IBM Cloud File Storage for VPC の転送中の暗号化」を 参照してください。 このトピックでは、ゾーン単位のファイル共有(dp2 プロファイル)と地域単位のファイル共有(rfs プロファイル、ベータ版)の両方について扱っています。

コンテナのリソース要求値と上限値の更新

File Storage for VPC アドオンで実行されるコンテナについて、CPUおよびメモリのリソース要求値と上限値をカスタマイズできます。 これらの値を調整することで、大規模なクラスタやリソースに制約のある環境において、パフォーマンスを最適化することができます。

パラメータの命名規則は、 <ContainerName>CPULimit<ContainerName>CPURequest<ContainerName>MemoryLimit、および <ContainerName>MemoryRequest の形式に従います。 これらをコントローラーおよびノードサーバーのコンテナに適用してください。

  1. addon-vpc-file-csi-driver-configmap のコンフィグマップを編集し、調整したいコンテナのリソースパラメータを追加します。 次の例では、コントローラおよびノードサーバーのコンテナに対して、CPU およびメモリの値を設定しています。

    oc edit cm addon-vpc-file-csi-driver-configmap -n kube-system
    

    値の例:

    controllerCPULimit: "200m"
    controllerCPURequest: "100m"
    controllerMemoryLimit: "256Mi"
    controllerMemoryRequest: "128Mi"
    nodeServerCPULimit: "200m"
    nodeServerCPURequest: "100m"
    nodeServerMemoryLimit: "256Mi"
    nodeServerMemoryRequest: "128Mi"
    
  2. file-csi-driver-status のconfigmapを記述し、リソースの変更が正常に適用されたことを確認してください。 「 events 」のセクションで、「 Successfully set container resources 」のイベントを探してみてください。

    oc describe cm file-csi-driver-status -n kube-system
    

    出力例:

    events:
    ----
    - description: Successfully set container resources
      event: Change container resources
      timestamp: "2026-06-26 08:32:05"
    

ワーカー・プール、ゾーン、またはワーカー・ノードによるファイル共有アクセスの制限

File Storage for VPC クラスター・アドオンのデフォルトの動作では、すべてのノード上のポッドがファイル共有にアクセスできます。 ポッドがファイル共有にアクセスする方法をより細かく制御することもできます。 例えば、ファイル共有アクセスを、特定のゾーンの特定のノード上の特定のワーカー・プール上のポッドのみに制限することができます。 ファイル共有へのポッド・アクセスを構成する方法については、以下のシナリオを確認してください。

PVCが作成されると、PVCごとに1つのファイル共有ターゲットが作成され、ゾーン内のそのサブネットに1つのVNI IPが予約される。 つまり、VPC ファイル・ストレージの PVC の最大数は、そのサブネット上の使用可能な IP アドレスによって異なります。

以下の VNI 機能を使用してファイル共有へのポッド・アクセスを制限すると、アプリの可用性が高くない可能性があります。

開始前に

ノード、ゾーン、またはリソース・グループごとにファイル共有アクセスを制限するには、最初にカスタム VPC セキュリティー・グループを作成する必要があります。

  1. クラスターをリストし、ファイル・ストレージをデプロイするクラスター ID をメモします。

    ibmcloud ks cluster ls
    
  2. 労働者プールの詳細を入手する。

    ibmcloud ks worker-pool ls --cluster CLUSTER
    
  3. サブネットの詳細を取得する。

    ibmcloud ks worker-pool get WORKER_POOL --cluster CLUSTER | grep -A 3 Subnets
    
  4. サブネットのCIDRを取得する。 各サブネットについて、この手順を繰り返してください。 このCIDR範囲は後で使用する。

    ibmcloud is subnet SUBNET_ID | grep "IPv4 CIDR"
    
  5. セキュリティー・グループをリストし、クラスターの ID kube-<clusterID> セキュリティー・グループをメモします。 後でセキュリティー・グループ・ルールを追加するときに、セキュリティー・グループ ID が必要になります。

    ibmcloud is sg
    

    出力例

    ID                                          Name                                             Rules   Targets   VPC       Resource group
    r006-4aaec88f-4986-4b7c-a737-401f7fef1555   kube-clusterID                       15      0         my-vpc   default
    
  6. クラスターと同じ VPC にカスタム・セキュリティー・グループを作成します。 このセキュリティー・グループを使用して、セキュリティー・グループ・ルールを追加することにより、ファイル共有へのアクセスを制御できます。

    ibmcloud is security-group-create my-custom-security-group VPC-ID
    
  7. 独自のストレージ・クラスを作成 し、前に作成したカスタム・セキュリティー・グループの ID を入力します。 このストレージ・クラスから作成されたすべての PVC は、カスタム・セキュリティー・グループ内にあります。

  8. 独自のストレージクラスを使用するPVCを作成します。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: pvc-custom-vni
      spec:
        accessModes:
        - ReadWriteMany
        resources:
          requests:
            storage: 10Gi
        storageClassName: "" # For example: my-custom-storage-class
    
  9. PV が PVC にバインドされたら、PV の詳細を取得し、 nfsServerPath 値をメモして VNI IP アドレスを見つけます。

    kubectl get pv pvc-XXXX -o yaml | grep nfsServerPath
    

    出力例

    nfsServerPath: XXX.XX.XX.XXX:/XX # VNI IP address
    

1 つのワーカー・ノード上のポッドへのファイル共有アクセスの制限

  1. 前提条件を満たして いることを確認してください。

  2. 前に作成したカスタム・セキュリティー・グループに以下のルールを追加します。

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.20 # Worker node IP
    
  3. kube-clusterID 」セキュリティグループに、以下のルールを追加してください。

    ibmcloud is sg-rulec kube-<cluster-id> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.10 # VNI IP
    
  4. PVC を使用するデプロイメントを作成します。 作成したルールに一致するワーカー・ノードにデプロイされたポッドのみが、PVC をマウントまたは使用できます。 他のノードにデプロイされたポッドは、コンテナーの creating 状態のままになります。

単一ゾーン内のワーカー・ノード上のポッドへのファイル共有アクセスの制限

  1. 前提条件を満たして いることを確認してください。

  2. 前に作成したカスタム・セキュリティー・グループに以下のルールを追加します。

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.0/24 # zone subnet cidr range
    
  3. kube-clusterID 」セキュリティグループに、以下のルールを追加してください。 仮想ネットワーク・インターフェース (VNI) の IP アドレスを指定します。

    ibmcloud is sg-rulec kube-<cluster-ID> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.10 # VNI IP
    
  4. PVC を使用するデプロイメントを作成します。 PVC をマウントできるのは、前のルールにリストされているゾーンにデプロイされているポッドのみです。 他のゾーンにデプロイされたポッドは PVC にアクセスできず、コンテナー creating 状態のままになります。

単一ワーカー・プール内のワーカー・ノード上のポッドへのファイル共有アクセスの制限

  1. 前提条件を満たして いることを確認してください。

  2. 各ワーカー プールのサブネット範囲に対して受信ルールを作成します。

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.0/24 # zone 1 subnet cidr range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.0/24 # zone 2 subnet cidr range
    
  3. kube-clusterID 」セキュリティグループに、以下のルールを追加してください。 仮想ネットワーク・インターフェース (VNI) の IP アドレスをリモートまたはソースとして指定します。

    ibmcloud is sg-rulec kube-<cluster-ID> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.0.10 # VNI IP
    
  4. 先ほど作成したPVCを使用するアプリをデプロイします。 前のルールで示されたワーカー・プール上のポッドのみが PVC をマウントできます。 あるいは、デーモン・セットにアプリをデプロイした場合、ポッドは、セキュリティー・グループ・ルールを作成したワーカー・ノードにのみ正常にデプロイされます。 指定されたワーカー・プール内にないワーカー・プール上のポッドは、 MountVolume.SetUp failed for volume "pvc-184b8c92-33ea-4874-b2ac-17665e53c060" : rpc error: code = DeadlineExceeded desc = context deadline exceeded エラーで失敗します。

複数のワーカー・プール内のワーカー・ノード上のポッドへのファイル共有アクセスの制限

  1. 前提条件を満たして いることを確認してください。

  2. カスタムセキュリティグループに、以下のルールを追加してください。 ワーカー・プールとサブネット CIDR 範囲をリモートまたはソースとして指定します。

    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.0/24 # worker pool 1, zone 1 subnet CIDR range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.0/24 # worker pool 1, zone 2 subnet CIDR range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.241.0.0/24 # worker pool 2, zone 1 subnet CIDR range
    ibmcloud is sg-rulec CUSTOM-SG inbound tcp --port-min 111 --port-max 2049 --remote 10.241.1.0/24 # worker pool 2, zone 2subnet CIDR range
    
  3. kube-<clusterID> 」セキュリティグループに、以下のルールを追加してください。 仮想ネットワーク・インターフェース (VNI) の IP アドレスをリモートまたはソースとして指定します。

    ibmcloud is sg-rulec kube-<clusterID> outbound tcp --port-min 111 --port-max 2049 --remote 10.240.1.7 # VNI-IP
    
  4. PVC を使用するデプロイメントを作成します。 PVC をマウントできるのは、ルールに示されているゾーンにデプロイされているポッドのみです。 制限付きワーカー・ノードにデプロイされたポッドは、コンテナーの creating 状態のままになります。