ファイル・ストレージ・サービスでのPVCのプロビジョニング

File Storageサービスからファイル・システムをマウントして、Kubernetes Engine (OKE)を使用して作成したクラスタに対して永続ボリューム・クレームをプロビジョニングする方法をご紹介します。

Oracle Cloud Infrastructure File Storageサービスは、永続的でスケーラブルな分散型のエンタープライズ規模のネットワーク・ファイル・システムを提供します。CSIボリューム・プラグインを使用して、クラスタをファイル・ストレージ・サービスのファイル・システムに接続します。

File Storageサービスを使用すると、次の2つの方法で永続ボリューム要求(PVC)をプロビジョニングできます。

  • 新しいストレージ・クラスを定義および作成し(オプションで既存のマウント・ターゲットのOCIDを指定)、ストレージ・クラスに基づいて新しいPVCを定義および作成します。PVCを作成すると、CSIボリューム・プラグインによって、新しいファイル・ストレージ・サービス・ファイル・システムと、新しいファイル・システムによってバックアップされた新しい永続ボリュームの両方が動的に作成されます。「CSIボリューム・プラグインを使用した新しいファイル・システムでのPVCのプロビジョニング」を参照してください。
  • ファイル・ストレージ・サービスでファイル・システムとマウント・ターゲットを手動で作成し、新しいファイル・システムでバックアップされたPVを定義して作成し、最後に新しいPVCを定義します。PVCを作成すると、KubernetesエンジンはPVCをファイル・ストレージ・サービスによって支援されるPVにバインドします。既存のファイル・システムでのPVCのプロビジョニングを参照してください。

次の点に注意してください:

  • CSIボリューム・プラグインを使用して新しいファイル・システムを動的に作成する場合は、CSIボリューム・プラグインによって作成される新しい永続ボリュームのプロパティを手動で更新しないでください。
  • CSIボリューム・プラグインによって動的に作成されるファイル・ストレージ・サービスのファイル・システム、マウント・ターゲットおよびエクスポートには、csi-fss-で始まる名前が付けられます。
  • CSIボリューム・プラグインによって動的に作成されたファイル・ストレージ・サービスのファイル・システム、マウント・ターゲットおよびエクスポートは、コンソールに表示されます。ただし、動的に作成されるこれらのリソースの変更にコンソール(またはOracle Cloud Infrastructure CLIまたはAPI)を使用しないでください。CSIボリューム・プラグインによって動的に作成されたOracle Cloud Infrastructureリソースに加えられた変更は、Kubernetesオブジェクトと照合されません。
  • CSIボリュームプラグインによって作成されたファイルシステムによってバックアップされたPVにバインドされたPVCを削除すると、CSIボリュームプラグインはファイルシステムとそれが作成したPVを削除します。CSIボリューム・プラグインで新しいマウント・ターゲットも作成した場合(ストレージ・クラス定義で既存のマウント・ターゲットのOCIDを指定しなかったため)、CSIボリューム・プラグインもマウント・ターゲットを削除します。既存のマウント・ターゲットのOCIDを指定した場合、CSIボリューム・プラグインはマウント・ターゲットを削除しないことに注意してください。
  • CSIボリューム・プラグインによって動的に作成された新しいファイル・システムでのPVCのプロビジョニングは、クラスタがKubernetes 1.22以降を実行している場合に使用できます。「CSIボリューム・プラグインを使用した新しいファイル・システムでのPVCのプロビジョニング」を参照してください。
  • 既存のファイル・システムによってバックアップされたPVにバインドしてPVCをプロビジョニングすることは、クラスタがKubernetes 1.18以降を実行している場合に使用できます。既存のファイル・システムでのPVCのプロビジョニングを参照してください。

File Storageサービスでの保存中のデータおよび転送中のデータの暗号化

File Storageサービスを使用してPVCをプロビジョニングする場合、保存中の暗号化とは無関係に、転送中暗号化を指定します。

File Storageサービスは、デフォルトでOracle管理暗号化キーを使用して、保存時に常にデータを暗号化します。ただし、Vaultサービスで自分を管理している独自のマスター暗号化キーを使用して保存中の暗号化を指定するオプションがあります。保存時の暗号化を指定する方法は、PVCをプロビジョニングするかどうかによって異なります。

保存データを暗号化するために独自のマスター暗号化キーを管理する場合は、次のことを行う必要があります。

File Storageサービスは、オプションで転送中のデータを暗号化できます。転送中暗号化を指定すると、保存中のデータがOracle管理キーを使用して暗号化されるか、ユーザー管理キーを使用して暗号化されるかに関係なく、転送中のデータは常にOracle管理であるTLS (Transport Layer Security)証明書を使用して暗号化されます。転送中暗号化は、TLS v. 1.2暗号化を使用して、インスタンスとマウントされたファイル・システム間で転送されるデータを保護します。転送中暗号化およびファイル・ストレージ・サービスの詳細は、転送中TLS暗号化の使用を参照してください。転送中暗号化の指定方法は、PVCをプロビジョニングするかどうかによって異なります。

File Storageサービスを使用してPVCをプロビジョニングする場合、転送中暗号化は、ワーカー・ノードをホストしているコンピュート・インスタンスがOracle Linux 7およびOracle Linux 8を実行している場合にのみサポートされます。

CSIボリューム・プラグインを使用した新しいファイル・システムでのPVCのプロビジョニング

ノート

CSIボリューム・プラグインによって動的に作成された新しいファイル・システムにPVCをプロビジョニングする場合、次の前提条件が適用されます:
  • CSIボリューム・プラグインによって動的に作成される新しいファイル・システムにPVCをプロビジョニングするには、クラスタでKubernetes 1.22以降が実行されている必要があります。
  • CSIボリューム・プラグインがファイル・ストレージ・リソースを作成および管理できるようにするには、適切なIAMポリシーが存在する必要があります。詳細は次のとおりです:

    • ファイル・システム、マウント・ターゲットおよびエクスポート・パスを作成および管理するポリシー。例:
      ALLOW any-user to manage file-family in compartment <compartment-name> where request.principal.type = 'cluster'
    • VNIC、プライベートIP、プライベートDNSゾーンおよびサブネットを使用するポリシー。例:
      ALLOW any-user to use virtual-network-family in compartment <compartment-name> where request.principal.type = 'cluster'
  • ノード・プール、ワーカー・ノード・サブネット、ファイル・システムまたはマウント・ターゲットが属するコンパートメントがクラスタが属するコンパートメントと異なる場合、CSIボリューム・プラグインが適切な場所にアクセスできるようにするには、IAMポリシーが存在する必要があります。例:

    ALLOW any-user to manage file-family in TENANCY where request.principal.type = 'cluster'
    ALLOW any-user to use virtual-network-family in TENANCY where request.principal.type = 'cluster'
  • Vaultサービスから特定のユーザー管理マスター暗号化キーを指定してファイル・システムのデータを暗号化するには、CSIボリューム・プラグインがそのマスター暗号化キーにアクセスできるように、適切なIAMポリシーが存在する必要があります。ブート・ボリューム、ブロック・ボリュームまたはファイル・システム(あるいはその両方)を暗号化するためのユーザー管理暗号化キーにアクセスするポリシーの作成を参照してください。

ファイル・ストレージ・サービスのCSIボリューム・プラグインによって動的に作成された新しいファイル・システムにPVCを動的にプロビジョニングするには:

  1. (オプション)ファイル・ストレージ・サービスにマウント・ターゲットを作成します。マウント・ターゲットの作成を参照してください。

    CSIボリューム・プラグインでは、新しいファイル・システムを作成するには、アクティブなマウント・ターゲット(つまり、IPアドレスが割り当てられたマウント・ターゲット)が必要です。マウント・ターゲットを事前に作成しない場合は、ストレージ・クラスの定義時にCSIボリューム・プラグインが新しいマウント・ターゲットを作成するサブネットを指定します。

  2. fss.csi.oracleclould.comプロビジョナを使用する新しいストレージ・クラスを定義します。
    1. マニフェスト・ファイル(たとえば、fss-dyn-st-class.yamlという名前のファイル)を作成し、新しいストレージ・クラスの名前を指定し、必須パラメータとオプション・パラメータの値を指定します。
      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: <storage-class-name>
      provisioner: fss.csi.oraclecloud.com
      parameters:
        availabilityDomain: <ad-name>
        mountTargetOcid: <mt-ocid> | mountTargetSubnetOcid: <mt-subnet-ocid>
        compartmentOcid: <compartment-ocid>
        kmsKeyOcid: <key-ocid>
        exportPath: <path>
        exportOptions: "[{<options-in-json-format>}]"
        encryptInTransit: "true"|"false"
        oci.oraclecloud.com/initial-defined-tags-override: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}'
        oci.oraclecloud.com/initial-freeform-tags-override: '{"<tag-key>": "<tag-value>"}'

      ここでは:

      • name: <storage-class-name>: 必須。ストレージ・クラスに選択した名前。
      • availabilityDomain: <ad-name>: 必須。新しいファイル・システムを作成する可用性ドメインの名前(および既存のマウント・ターゲットOCIDが指定されていない場合、新しいマウント・ターゲットを作成する可用性ドメインの名前)。たとえば、US-ASHBURN-AD-1です。使用する可用性ドメイン名を確認するには、oci iam availability-domain list CLIコマンドを実行します(または、ListAvailabilityDomains操作を使用します)。詳細は、テナンシのアベイラビリティ・ドメイン名を参照してください。
      • mountTargetOcid: <mt-ocid> | mountTargetSubnetOcid: <mt-subnet-ocid>: 必須。既存のアクティブ・マウント・ターゲット(mountTargetOcid: <mt-ocid>)のOCID、または新しいマウント・ターゲットを作成するサブネットのOCID (mountTargetSubnetOcid: <mt-subnet-ocid>)。mountTargetOcidまたはmountTargetSubnetOcidのいずれかを指定します。ストレージ・クラス定義でmountTargetOcidmountTargetSubnetOcidの両方を指定すると、mountTargetOcidで指定された既存のマウント・ターゲットが使用され、mountTargetSubnetOcidは無視されます。例:
        • mountTargetSubnetOcid: ocid1.subnet.oc1.iad.aaaaaaaa2xpk______zva
        • mountTargetOcid: ocid1.mounttarget.oc1.iad.aaaaaaaa4np______fuy
      • compartmentOcid: <compartment-ocid>: オプション。新しいファイル・システム(および既存のマウント・ターゲットOCIDが指定されていない場合は、新しいマウント・ターゲット)が属するコンパートメントのOCID。指定しない場合、デフォルトでクラスタと同じコンパートメントに設定されます。たとえば、compartmentOcid: ocid1.compartment.oc1..aaaaaaaay______t6qです。
      • kmsKeyOcid: <key-ocid>: オプション。保存データの暗号化に使用する、管理するマスター暗号化キーのOCID。指定しない場合、データはOracleによって管理される暗号化キーを使用して保存時に暗号化されます。新しいファイル・システムでの保存データの暗号化を参照してください。たとえば、kmsKeyOcid: ocid1.key.oc1.iad.anntl______usjhです。
      • exportPath: <path>: オプション。マウント・ターゲット内のファイル・システムを一意に識別するエクスポート内のパス。このエクスポート・パスの先頭にはスラッシュ(/)を付ける必要があり、その後にゼロ個以上のスラッシュ区切り要素を続けます。たとえば、/FileSystem1です。詳細は、ファイル・システム内のパスを参照してください。

        ストレージ・クラス定義にexportPath: <path>を含める場合は、すでに存在するパス(パスとして、または既存のパスのサブパスとして)を指定しないでください。すでに存在するパスを指定すると、同じマウント・ターゲットを持つ複数のファイル・システムに同じエクスポート・パスを指定できないため、エラーが返されます。したがって、ストレージ・クラス定義にexportPath: <path>を含める場合は、このストレージ・クラス定義を使用して1つのファイル・システムを作成します。

        ストレージ・クラス定義にexportPath: <path>を含めない場合、パスはデフォルトで、CSIボリューム・プラグインによって作成されたファイル・システムの表示名になります(/csi-fss-から開始)。

      • exportOptions: "[{<options-in-json-format>}]"オプション。NFSクライアントがマウント・ターゲットに接続するときに付与されるアクセス・レベルを指定する、エクスポート内の一連のパラメータ(有効なJSON形式)。エクスポート内のNFSエクスポート・オプション・エントリでは、単一のIPアドレスまたはCIDRブロック範囲に対するアクセス権を定義します。詳細は、NFSエクスポートおよびエクスポート・オプションの作業を参照してください。指定しない場合、次のデフォルトが使用されます。
        exportOptions: "[{\"source\":\"0.0.0.0/0\",\"requirePrivilegedSourcePort\":false,\"access\":\"READ_WRITE\",\"identitySquash\":\"NONE\"}]"
      • encryptInTransit: "true"|"false": オプション。転送中のデータを暗号化するかどうかを示します。"true"を指定する場合は、「新規ファイル・システムでの転送中のデータの暗号化」で説明されている設定ステップを完了してください。指定しなかった場合は、デフォルトで"false"に設定されます。たとえば、encryptInTransit: "true"です。
      • oci.oraclecloud.com/initial-defined-tags-override: '{"<tag-namespace>": {"<tag-key>": "<tag-value>"}}'オプション。新しいファイル・システムの定義済タグを指定します。たとえば、oci.oraclecloud.com/initial-defined-tags-override: '{"Operations": {"CostCenter": "42"}}'です。

        あるコンパートメントに属するタグ・ネームスペースの定義済タグを別のコンパートメントに属するファイルシステム・リソースに適用するには、クラスタでタグ・ネームスペースを使用できるようにするポリシー・ステートメントを含める必要があります。クラスタおよびタグ・ネームスペースが異なるコンパートメントにある場合の追加のIAMポリシーを参照してください。

      • oci.oraclecloud.com/initial-freeform-tags-override: '{"<tag-key>": "<tag-value>"}'オプション。新しいファイル・システムのフリーフォーム・タグを指定します。たとえば、oci.oraclecloud.com/initial-freeform-tags-override: '{"Department": "Finance"}'です。

      例:

      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: fss-dyn-storage
      provisioner: fss.csi.oraclecloud.com
      parameters:
        availabilityDomain: US-ASHBURN-AD-1
        mountTargetSubnetOcid: ocid1.subnet.oc1.iad.aaaaaaaa2xpk______zva
        compartmentOcid: ocid1.compartment.oc1..aaaaaaaay______t6q
        kmsKeyOcid: ocid1.key.oc1.iad.anntl______usjh
        exportPath: /FileSystem1
        exportOptions: "[{\"source\":\"0.0.0.0/0\",\"requirePrivilegedSourcePort\":false,\"access\":\"READ_WRITE\",\"identitySquash\":\"NONE\"}]"
        encryptInTransit: "true"
    2. 次のように入力して、マニフェストファイルからストレージクラスを作成します。
      kubectl create -f <filename>
      例:
      kubectl create -f fss-dyn-st-class.yaml
  3. セキュリティ・ルールは、ネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで、ストレージ・クラス定義で参照(または作成者)されたマウント・ターゲットと、クラスタのワーカー・ノードの両方に対して作成します。

    作成するセキュリティ・ルールは、次のシナリオに従って、マウント・ターゲットおよびワーカー・ノードの相対ネットワークの場所によって異なります:

    これらのシナリオ、作成するセキュリティ・ルールおよび作成場所は、File Storageサービスのドキュメント(ファイル・ストレージのVCNセキュリティ・ルールの構成を参照)で詳しく説明されています。

  4. 次のように、File Storageサービスの新しいファイル・システムによってプロビジョニングされるPVCを作成します。
    1. PVCを定義するマニフェスト・ファイルを作成します。
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: <pvc-name>
      spec:
        accessModes:
          - ReadWriteMany
        storageClassName: "<storage-class-name>"
        resources:
          requests:
            storage: 50Gi

      ここでは:

      • name: <pvc-name>: 必須。たとえば、fss-dynamic-claimです。
      • storageClassName: "<storage-class-name>": 必須。前に定義したストレージクラスの名前。たとえば、fss-dyn-storageです。
      • accessModes: - ReadWriteMany: 必須。accessModes:にはReadWriteManyを指定する必要があります。
      • storage: 50Gi: 必須。Kubernetesでは、PVCマニフェストでstorage:の値を指定する必要があります。ただし、ファイル・ストレージ・サービスは、storage:に指定した値に関係なく、ファイル・システム・サイズの指定をサポートせず、デフォルト・サイズの新しいファイル・システムを作成します。

      たとえば、次のマニフェスト・ファイル(fss-dyn-claim.yamlという名前)は、fss-dyn-storageストレージ・クラスで定義されたファイル・システムによってプロビジョニングされるfss-dynamic-claimという名前のPVCを定義します。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: fss-dynamic-claim
      spec:
        accessModes:
          - ReadWriteMany
        storageClassName: "fss-dyn-storage"
        resources:
          requests:
            storage: 50Gi
    2. 次のように入力して、マニフェスト・ファイルからPVCを作成します。
      kubectl create -f <filename>
      例:
      kubectl create -f fss-dyn-claim.yaml

    新しいPVCが作成されます。CSIボリューム・プラグインは、新しい永続ボリューム(PV)と新しいファイル・システムをファイル・ストレージ・サービス(既存のマウント・ターゲットを指定しなかった場合は新しいマウント・ターゲットとともに)に作成します。

    新しいPVCは新しいPVに結合されます。データは、Oracleまたはユーザーが管理する暗号化キーを使用して、保存時に暗号化されます。

  5. 次を入力して、PVCが新しい永続ボリュームにバインドされていることを確認します:
    kubectl get pvc

    前述のコマンドの出力で、PVCが正常にバインドされていることを確認します:

    			
    NAME                STATUS    VOLUME                 CAPACITY   ACCESSMODES   STORAGECLASS      AGE
    fss-dynamic-claim   Bound     csi-fss-<unique_ID>    50Gi       RWX           fss-dyn-storage   4m
  6. ポッドなどの他のオブジェクトを作成するときに、新しいPVCを使用します。たとえば、次のポッド定義から新しいポッドを作成できます:
    apiVersion: v1
    kind: Pod
    metadata:
      name: fss-dynamic-app
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - name: http
              containerPort: 80
          volumeMounts:
            - name: persistent-storage
              mountPath: /usr/share/nginx/html
      volumes:
      - name: persistent-storage
        persistentVolumeClaim:
          claimName: fss-dynamic-claim
  7. 前のステップの例で説明したように、新しいポッドを作成したら、次のように入力して、ポッドが新しいPVCを使用していることを確認できます。

    kubectl describe pod nginx
ヒント

PVCの作成時に新しいPVおよび新しいファイルシステムを動的に作成するという頻繁な要件が予想される場合は、作成した新しいストレージ・クラスを新しいPVCをプロビジョニングするためのデフォルトのストレージ・クラスとして使用するように指定できます。詳細は、Kubernetesのドキュメントを参照してください。

新しいファイル・システムでの保存データの暗号化

File Storageサービスは、デフォルトでOracle管理暗号化キーを使用して、保存時に常にデータを暗号化します。ただし、Vaultサービスで自分を管理している独自のマスター暗号化キーを使用して保存データを暗号化することもできます。

保存データの暗号化方法に応じて、次の適切な手順に従ってください。

新しいファイル・システムでの転送中のデータの暗号化

転送中暗号化では、TLS 1.2 (Transport Layer Security)暗号化を使用して、インスタンスとマウントされたファイル・システム間のデータ転送が保護されます。転送中暗号化およびファイル・ストレージ・サービスの詳細は、転送中TLS暗号化の使用を参照してください。

保存時の暗号化とは関係なく、転送中暗号化を指定します。移動中のデータは、保存中のデータがOracle管理キーを使用して暗号化されるか、ユーザー管理キーを使用して暗号化されるかに関係なく、常にOracle管理であるTLS証明書を使用して暗号化されます。

File Storageサービスを使用してPVCをプロビジョニングする場合、転送中暗号化は、ワーカー・ノードをホストしているコンピュート・インスタンスがOracle Linux 7およびOracle Linux 8を実行している場合にのみサポートされます。

CSIボリューム・プラグインを使用して、転送中暗号化で新しいファイル・システムを動的に作成するには:

  1. 「Linuxでの転送中暗号化の設定」の手順に従って、ファイル・システムに転送中暗号化を設定します。詳細は次のとおりです:
    1. ファイル・システムをエクスポートするマウント・ターゲットのネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで次のセキュリティ・ルールを設定して、前提条件を完了します:
      • 2051宛先ポート範囲へのTCPトラフィックを許可するステートフル・イングレス・ルール(任意のソースIPアドレスまたはCIDRブロックのすべてのポートから、またはすべてのソースから)。
      • 2051ソース・ポート範囲からのTCPトラフィックを、任意の宛先IPアドレスまたはCIDRブロックのすべてのポート、またはすべての宛先に許可するステートフル・エグレス・ルール。

      詳細は、シナリオC: マウント・ターゲットおよびインスタンスでTLS転送中暗号化を使用を参照してください。

    2. 各ワーカー・ノードでoci-fss-utilsパッケージをダウンロードします。ライセンス契約に同意する必要があります。タスク1: OCI-FSS-UTILSパッケージのダウンロードを参照してください。
    3. 各ワーカー・ノードにoci-fss-utilsパッケージをインストールします。タスク2: Oracle LinuxまたはCentOSでのOCI-FSS-UTILSパッケージのインストールを参照してください。
  2. CSIボリューム・プラグインを使用した新しいファイル・システムでのPVCのプロビジョニングの手順に従って、ストレージ・クラス定義にencryptInTransit: "true"パラメータを含めます。データは、Oracleによって管理される暗号化キーを使用して、転送中に暗号化されます。

既存のファイル・システムでのPVCのプロビジョニング

ファイル・ストレージ・サービスの既存のファイル・システムにPVCを作成するには(Oracle管理の暗号化キーを使用して保存データを暗号化します):

  1. ファイル・ストレージ・サービスでマウント・ターゲットを含むファイル・システムを作成し、「Oracle管理キーを使用した暗号化」暗号化オプションを選択します。ファイル・システムの作成を参照してください。
  2. セキュリティ・ルールは、ファイル・システムをエクスポートするマウント・ターゲットとクラスタのワーカー・ノードの両方について、ネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで作成します。
    作成するセキュリティ・ルールは、次のシナリオに従って、マウント・ターゲットおよびワーカー・ノードの相対ネットワークの場所によって異なります:

    これらのシナリオ、作成するセキュリティ・ルールおよび作成場所は、File Storageサービスのドキュメント(ファイル・ストレージのVCNセキュリティ・ルールの構成を参照)で詳しく説明されています。

  3. 次のように、ファイル・ストレージ・サービスのファイル・システムでバックアップされたPVを作成します。
    1. PVを定義するマニフェスト・ファイルを作成し、csi:セクションで次のように設定します。

      • driverからfss.csi.oraclecloud.com
      • volumeHandleから<FileSystemOCID>:<MountTargetIP>:<path>
        ここでは:
        • <FileSystemOCID>は、ファイル・ストレージ・サービスで定義されたファイル・システムのOCIDです。
        • <MountTargetIP>は、マウント・ターゲットに割り当てられたIPアドレスです。
        • <path>は、マウント・ターゲットのIPアドレスに対するファイル・システムへのマウント・パスで、スラッシュで始まります。
        たとえば: ocid1.filesystem.oc1.iad.aaaa______j2xw:10.0.0.6:/FileSystem1

      たとえば、次のマニフェスト・ファイル(fss-pv.yamlという名前)は、ファイル・ストレージ・サービスのファイル・システムによってバックアップされるfss-pvというPVを定義します。

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: fss-pv
      spec:
        capacity:
          storage: 50Gi
        volumeMode: Filesystem
        accessModes:
          - ReadWriteMany
        persistentVolumeReclaimPolicy: Retain
        csi:
          driver: fss.csi.oraclecloud.com
          volumeHandle: ocid1.filesystem.oc1.iad.aaaa______j2xw:10.0.0.6:/FileSystem1
    2. 次のように入力して、マニフェスト・ファイルからPVを作成します。
      kubectl create -f <filename>

      例:

      kubectl create -f fss-pv.yaml
  4. 次のように、作成したPVによってプロビジョニングされるPVCを作成します。
    1. PVCを定義するマニフェスト・ファイルを作成し、次のように設定します。
      • storageClassNameから""
      • volumeName: 作成したPVの名前(fss-pvなど)

      たとえば、次のマニフェスト・ファイル(fss-pvc.yamlという名前)は、fss-pvという名前のPVによってプロビジョニングされるfss-pvcという名前のPVCを定義します。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: fss-pvc
      spec:
        accessModes:
          - ReadWriteMany
        storageClassName: ""
        resources:
          requests:
            storage: 50Gi
        volumeName: fss-pv

      requests: storage:要素はPVCのマニフェスト・ファイルに存在する必要があり、その値はPVのマニフェスト・ファイルのcapacity: storage:要素に指定された値と一致する必要があります。それ以外に、requests: storage:要素の値は無視されます。

    2. 次のように入力して、マニフェスト・ファイルからPVCを作成します。
      kubectl create -f <filename>
      例:
      kubectl create -f fss-pvc.yaml

PVCは、ファイル・ストレージ・サービス・ファイル・システムによってバックアップされたPVにバインドされます。データは、Oracleによって管理される暗号化キーを使用して、保存時に暗号化されます。

既存のファイル・システムでの保存データの暗号化

File Storageサービスは、デフォルトでOracle管理暗号化キーを使用して、保存時に常にデータを暗号化します。ただし、Vaultサービスで自分で管理する独自のマスター暗号化キーを使用して、ファイル・システムを暗号化することもできます。

保存データの暗号化方法に応じて、次の適切な手順に従ってください。

  • Oracle管理の暗号化キーを使用して保存データを暗号化するファイル・システムにPVCを作成するには、「既存のファイル・システムでのPVCのプロビジョニング」のステップに従って、説明に従って「Oracle管理キーを使用した暗号化」暗号化オプションを選択します。データは、Oracleによって管理される暗号化キーを使用して、保存時に暗号化されます。
  • 保存時にデータを暗号化するために管理するマスター暗号化キーを使用してファイル・システムにPVCを作成するには、「既存のファイル・システムでのPVCのプロビジョニング」のステップに従いますが、「顧客管理キーを使用した暗号化」暗号化オプションを選択し、Vaultサービスでマスター暗号化キーを指定します。データは、指定した暗号化キーを使用して保存時に暗号化されます。

既存のファイル・システムでの転送中のデータの暗号化

転送中暗号化では、TLS v. 1.2 (Transport Layer Security)暗号化を使用して、インスタンスとマウントされたファイル・システム間のデータ転送が保護されます。転送中暗号化およびファイル・ストレージ・サービスの詳細は、転送中TLS暗号化の使用を参照してください。

保存時の暗号化とは関係なく、転送中暗号化を指定します。移動中のデータは、保存中のデータがOracle管理キーを使用して暗号化されるか、ユーザー管理キーを使用して暗号化されるかに関係なく、常にOracle管理であるTLS証明書を使用して暗号化されます。

File Storageサービスを使用してPVCをプロビジョニングする場合、転送中暗号化は、ワーカー・ノードをホストしているコンピュート・インスタンスがOracle Linux 7およびOracle Linux 8を実行している場合にのみサポートされます。

転送中にデータが暗号化されているファイル・システムにPVCを作成するには:

  1. 「Linuxでの転送中暗号化の設定」の手順に従って、ファイル・システムに転送中暗号化を設定します。詳細は次のとおりです:
    1. ファイル・システムをエクスポートするマウント・ターゲットのネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで次のセキュリティ・ルールを設定して、前提条件を完了します:
      • 2051宛先ポート範囲へのTCPトラフィックを許可するステートフル・イングレス・ルール(任意のソースIPアドレスまたはCIDRブロックのすべてのポートから、またはすべてのソースから)。
      • 2051ソース・ポート範囲からのTCPトラフィックを、任意の宛先IPアドレスまたはCIDRブロックのすべてのポート、またはすべての宛先に許可するステートフル・エグレス・ルール。

      詳細は、シナリオC: マウント・ターゲットおよびインスタンスで-transit暗号化でTLSを使用を参照してください。

    2. 各ワーカー・ノードでoci-fss-utilsパッケージをダウンロードします。ライセンス契約に同意する必要があります。タスク1: OCI-FSS-UTILSパッケージのダウンロードを参照してください。
    3. 各ワーカー・ノードにoci-fss-utilsパッケージをインストールします。タスク2: Oracle LinuxまたはCentOSでのOCI-FSS-UTILSパッケージのインストールを参照してください。
  2. 保存データの暗号化に必要な「既存のファイル・システムでのPVCのプロビジョニング」の手順に従って、「Oracle管理キーを使用した暗号化」オプションまたは「顧客管理キーを使用した暗号化」オプションのいずれかを選択します。ただし、PVを定義するマニフェスト・ファイルを作成する場合は、ファイルのcsiセクションでencryptInTransit"true"に設定します。例:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: fss-encrypted-it-pv
    spec:
      capacity:
        storage: 50Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: fss.csi.oraclecloud.com
        volumeHandle: ocid1.filesystem.oc1.iad.aaaa______j2xw:10.0.0.6:/FileSystem1
        volumeAttributes:
          encryptInTransit: "true"

PVCのファイル・ストレージ・サービス・プロビジョニングのトラブルシューティング

権限が不十分なため、ポッドはファイル・システムにアクセスできません

説明:ポッドがファイル・ストレージ・サービスのファイル・システムによってバックアップされた永続ボリューム(PV)にアクセスしようとすると、試行が失敗し、「Permission Denied」メッセージが表示されることがあります。

原因:ファイル・ストレージ・サービスでファイル・システムによってバックアップされたPVを定義するときに、PVのaccessModes属性をReadWriteManyに設定し、PVのfsType属性の値を指定する必要はありません。

CSIボリューム・プラグインは、CSIDriverオブジェクトとして実装されます。CSIDriverオブジェクトのfsGroupPolicy属性を使用して、CSIDriverがボリュームをマウントするポッドのsecurityContextで指定されたfsGroup属性と一致するようにボリュームの所有権および権限を変更するかどうかを制御します。ボリュームの所有権および権限を変更すると、マウント後にポッドがボリュームにアクセスできるようになります。

デフォルトでは、CSIDriverオブジェクトのfsGroupPolicy属性がReadWriteOnceWithFSTypeに設定され、CSIDriverがPV定義を調べて、次のようにポッドのfsGroup属性と一致するようにボリュームの所有権および権限を変更するかどうかを判断することを示します。

  • PVのfsType属性が設定されている場合、CSIDriverは、ポッドのsecurityContextで指定されたfsGroup属性と一致するようにボリュームの所有権および権限を変更します。その結果、ポッドからボリュームにアクセスできます。
  • PVのfsType属性が設定されていない場合、CSIDriverはボリュームの所有権および権限を変更しません。ボリュームにアクセスできるのは、rootとして実行されているプロセスのみです。その結果、rootとして実行されていないポッドは、マウントされたボリューム内のディレクトリまたはファイルにアクセスしようとしたときに「Permission Denied」メッセージを受信します。

ポッドが「Permission Denied」メッセージを受信する理由は、CSIDriverオブジェクトのfsGroupPolicy属性がReadWriteOnceWithFSTypeに設定されていて、PVのfsType属性が設定されていないことが原因であることを確認できます。ポッドに対してコマンドを実行して、マウントされたボリューム上のディレクトリにファイルを書き込み、ファイルのプロパティを調べて、グループ所有者がポッドのsecurityContextで指定されたfsGroup属性と一致するかどうかを確認します。たとえば、ポッドに次のマニフェストがあるとします。

apiVersion: v1
kind: Pod
metadata:
  name: security-context-demo
spec:
  securityContext:
    fsGroup: 2000
  containers:
  - name: sec-ctx-demo
    image: busybox:1.28
    command: [ "sh", "-c", "sleep 1h" ]
    volumeMounts:
    - name: sec-ctx-vol
      mountPath: /data/demo
  1. ポッドに対してコマンドを実行して、マウントされたボリューム上のディレクトリにファイルを書き込みます。たとえば、次のように入力します:
    kubectl exec -it security-context-demo -- sh -c "cd /data/demo && echo hello > testfile"
  2. 新しく作成したファイルのプロパティを調べ、アクセス権を確認します。たとえば、次のように入力します:
    kubectl exec -it security-context-demo -- sh -c "ls -l /data/demo/testfile"

    出力には、ポッドのfsGroup属性で指定されたものと同じであるファイルのグループ所有者が表示され、ポッドがファイルにアクセスできるようになります。例:

    -rw-r--r-- 1 root 2000 6 Jun  6 20:08 testfile

    ただし、CSIDriverオブジェクトのfsGroupPolicy属性がReadWriteOnceWithFSTypeに設定されていて、PVのfsType属性が設定されていない場合、出力にはファイルのグループ所有者がrootとして表示され、ポッドはそのファイルにアクセスできません。例:

    -rw-r--r-- 1 root root 6 Jun  6 20:08 testfile

詳細は、KubernetesドキュメントのCSIボリュームのfsGroupポリシーを参照してください。

処置: CSIDriverオブジェクトが、ポッドのsecurityContextで指定されたfsGroup属性と一致するようにボリュームの所有権および権限を変更できるようにするには、CSIDriverオブジェクトのfsGroupPolicy属性を次のようにFileに設定します。

  1. 次のように入力して、CSIDriver構成ファイルを取得します。
    kubectl get csiDriver fss.csi.oraclecloud.com -oyaml > fss_csi_driver.yaml
  2. テキスト・エディタで、fss_csi_driver.yamlファイルを編集し、CSIDriverオブジェクトのfsGroupPolicy属性を ReadWriteOnceWithFSTypeからFileに変更します。

    たとえば:

    apiVersion: storage.k8s.io/v1
    kind: CSIDriver
    metadata:
      creationTimestamp: "<timestamp>"
      name: fss.csi.oraclecloud.com
      resourceVersion: "<version>"
      uid: <identifier>
    spec:
      attachRequired: false
      fsGroupPolicy: ReadWriteOnceWithFSType
      podInfoOnMount: false
      requiresRepublish: false
      storageCapacity: false
      volumeLifecycleModes:
      - Persistent 

    先:

    apiVersion: storage.k8s.io/v1
    kind: CSIDriver
    metadata:
      creationTimestamp: "<timestamp>"
      name: fss.csi.oraclecloud.com
      resourceVersion: "<version>"
      uid: <identifier>
    spec:
      attachRequired: false
      fsGroupPolicy: File
      podInfoOnMount: false
      requiresRepublish: false
      storageCapacity: false
      volumeLifecycleModes:
      - Persistent 

    fsGroupPolicyの値のみを変更します。その他の値は変更しません。

  3. fss_csi_driver.yamlファイルを保存して閉じます。
  4. 次のように入力して、既存のCSIDriverオブジェクトを削除します。
    kubectl delete csiDriver fss.csi.oraclecloud.com
  5. 次のように入力して、新しいCSIDriverオブジェクトを作成します。
    kubectl apply -f fss_csi_driver.yaml 
  6. 「Permission Denied」メッセージが表示されたポッドを再起動します。