ファイル・ストレージ・サービスでの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をプロビジョニングするかどうかによって異なります。
- CSIボリューム・プラグインによって動的に作成される新しいファイル・システム(新しいファイル・システムでの保存データの暗号化を参照)
- 手動で作成した既存のファイル・システム(既存のファイル・システムでの保存データの暗号化を参照)
保存データを暗号化するために独自のマスター暗号化キーを管理する場合は、次のことを行う必要があります。
- Vaultで適切なマスター暗号化キーを作成します(または、そのようなキーのOCIDを取得します)。キーの管理を参照してください。
- マスター暗号化キーへのアクセス権を付与するポリシーを作成します。ブート・ボリューム、ブロック・ボリュームまたはファイル・システム(あるいはその両方)を暗号化するためのユーザー管理暗号化キーにアクセスするポリシーの作成を参照してください。
File Storageサービスは、オプションで転送中のデータを暗号化できます。転送中暗号化を指定すると、保存中のデータがOracle管理キーを使用して暗号化されるか、ユーザー管理キーを使用して暗号化されるかに関係なく、転送中のデータは常にOracle管理であるTLS (Transport Layer Security)証明書を使用して暗号化されます。転送中暗号化は、TLS v. 1.2暗号化を使用して、インスタンスとマウントされたファイル・システム間で転送されるデータを保護します。転送中暗号化およびファイル・ストレージ・サービスの詳細は、転送中TLS暗号化の使用を参照してください。転送中暗号化の指定方法は、PVCをプロビジョニングするかどうかによって異なります。
- CSIボリューム・プラグインによって動的に作成される新しいファイル・システム(新しいファイル・システムでの転送中のデータの暗号化を参照)
- 手動で作成した既存のファイル・システム(既存のファイル・システムでの転送中のデータの暗号化を参照)
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を動的にプロビジョニングするには:
- (オプション)ファイル・ストレージ・サービスにマウント・ターゲットを作成します。マウント・ターゲットの作成を参照してください。
CSIボリューム・プラグインでは、新しいファイル・システムを作成するには、アクティブなマウント・ターゲット(つまり、IPアドレスが割り当てられたマウント・ターゲット)が必要です。マウント・ターゲットを事前に作成しない場合は、ストレージ・クラスの定義時にCSIボリューム・プラグインが新しいマウント・ターゲットを作成するサブネットを指定します。
fss.csi.oraclecloud.com
プロビジョナを使用する新しいストレージ・クラスを定義します。- マニフェスト・ファイル(たとえば、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
のいずれかを指定します。ストレージ・クラス定義でmountTargetOcid
とmountTargetSubnetOcid
の両方を指定すると、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"
- 次のように入力して、マニフェストファイルからストレージクラスを作成します。
kubectl create -f <filename>
例:kubectl create -f fss-dyn-st-class.yaml
- マニフェスト・ファイル(たとえば、fss-dyn-st-class.yamlという名前のファイル)を作成し、新しいストレージ・クラスの名前を指定し、必須パラメータとオプション・パラメータの値を指定します。
-
セキュリティ・ルールは、ネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで、ストレージ・クラス定義で参照(または作成者)されたマウント・ターゲットと、クラスタのワーカー・ノードの両方に対して作成します。
作成するセキュリティ・ルールは、次のシナリオに従って、マウント・ターゲットおよびワーカー・ノードの相対ネットワークの場所によって異なります:これらのシナリオ、作成するセキュリティ・ルールおよび作成場所は、File Storageサービスのドキュメント(ファイル・ストレージのVCNセキュリティ・ルールの構成を参照)で詳しく説明されています。
- 次のように、File Storageサービスの新しいファイル・システムによってプロビジョニングされるPVCを作成します。
- 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
- 次のように入力して、マニフェスト・ファイルからPVCを作成します。
kubectl create -f <filename>
例:kubectl create -f fss-dyn-claim.yaml
新しいPVCが作成されます。CSIボリューム・プラグインは、新しい永続ボリューム(PV)と新しいファイル・システムをファイル・ストレージ・サービス(既存のマウント・ターゲットを指定しなかった場合は新しいマウント・ターゲットとともに)に作成します。
新しいPVCは新しいPVに結合されます。データは、Oracleまたはユーザーが管理する暗号化キーを使用して、保存時に暗号化されます。
- PVCを定義するマニフェスト・ファイルを作成します。
- 次を入力して、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
- ポッドなどの他のオブジェクトを作成するときに、新しい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
-
前のステップの例で説明したように、新しいポッドを作成したら、次のように入力して、ポッドが新しいPVCを使用していることを確認できます。
kubectl describe pod nginx
PVCの作成時に新しいPVおよび新しいファイルシステムを動的に作成するという頻繁な要件が予想される場合は、作成した新しいストレージ・クラスを新しいPVCをプロビジョニングするためのデフォルトのストレージ・クラスとして使用するように指定できます。詳細は、Kubernetesのドキュメントを参照してください。
新しいファイル・システムでの保存データの暗号化
File Storageサービスは、デフォルトでOracle管理暗号化キーを使用して、保存時に常にデータを暗号化します。ただし、Vaultサービスで自分を管理している独自のマスター暗号化キーを使用して保存データを暗号化することもできます。
保存データの暗号化方法に応じて、次の適切な手順に従ってください。
- CSIボリューム・プラグインを使用して、Oracle管理の暗号化キーを使用して保存データを暗号化する新しいファイル・システムを動的に作成するには、CSIボリューム・プラグインを使用した新規ファイル・システムでのPVCのプロビジョニングのステップに従って、ストレージ・クラス定義に
kmsKeyOcid: <key-ocid>
パラメータを含めないでください。データは、Oracleによって管理される暗号化キーを使用して、保存時に暗号化されます。 - CSIボリューム・プラグインを使用して、保存時にデータを暗号化するために管理するマスター暗号化キーを使用する新しいファイル・システムを動的に作成するには、「プロビジョニング」のステップに従いますCSIボリューム・プラグインを使用した新規ファイル・システムのPVCでは、ストレージ・クラス定義に
kmsKeyOcid: <key-ocid>
パラメータを含めて、Vaultサービスでマスター暗号化キーのOCIDを指定します。データは、指定した暗号化キーを使用して保存時に暗号化されます。
新しいファイル・システムでの転送中のデータの暗号化
転送中暗号化では、TLS 1.2 (Transport Layer Security)暗号化を使用して、インスタンスとマウントされたファイル・システム間のデータ転送が保護されます。転送中暗号化およびファイル・ストレージ・サービスの詳細は、転送中TLS暗号化の使用を参照してください。
保存時の暗号化とは関係なく、転送中暗号化を指定します。移動中のデータは、保存中のデータがOracle管理キーを使用して暗号化されるか、ユーザー管理キーを使用して暗号化されるかに関係なく、常にOracle管理であるTLS証明書を使用して暗号化されます。
File Storageサービスを使用してPVCをプロビジョニングする場合、転送中暗号化は、ワーカー・ノードをホストしているコンピュート・インスタンスがOracle Linux 7およびOracle Linux 8を実行している場合にのみサポートされます。
CSIボリューム・プラグインを使用して、転送中暗号化で新しいファイル・システムを動的に作成するには:
- 「Linuxでの転送中暗号化の設定」の手順に従って、ファイル・システムに転送中暗号化を設定します。詳細は次のとおりです:
- ファイル・システムをエクスポートするマウント・ターゲットのネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで次のセキュリティ・ルールを設定して、前提条件を完了します:
- 2051の宛先ポート範囲へのTCPトラフィックを許可するステートフル・イングレス・ルール(任意のソースIPアドレスまたはCIDRブロックのすべてのポートから、またはすべてのソースから)。
- 2051のソース・ポート範囲からのTCPトラフィックを、任意の宛先IPアドレスまたはCIDRブロックのすべてのポート、またはすべての宛先に許可するステートフル・エグレス・ルール。
詳細は、シナリオC: マウント・ターゲットおよびインスタンスでTLS転送中暗号化を使用を参照してください。
- 各ワーカー・ノードで
oci-fss-utils
パッケージをダウンロードします。ライセンス契約に同意する必要があります。タスク1: OCI-FSS-UTILSパッケージのダウンロードを参照してください。 - 各ワーカー・ノードに
oci-fss-utils
パッケージをインストールします。タスク2: Oracle LinuxまたはCentOSでのOCI-FSS-UTILSパッケージのインストールを参照してください。
- ファイル・システムをエクスポートするマウント・ターゲットのネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで次のセキュリティ・ルールを設定して、前提条件を完了します:
-
CSIボリューム・プラグインを使用した新しいファイル・システムでのPVCのプロビジョニングの手順に従って、ストレージ・クラス定義に
encryptInTransit: "true"
パラメータを含めます。データは、Oracleによって管理される暗号化キーを使用して、転送中に暗号化されます。
既存のファイル・システムでのPVCのプロビジョニング
ファイル・ストレージ・サービスの既存のファイル・システムにPVCを作成するには(Oracle管理の暗号化キーを使用して保存データを暗号化します):
- ファイル・ストレージ・サービスでマウント・ターゲットを含むファイル・システムを作成し、「Oracle管理キーを使用した暗号化」暗号化オプションを選択します。ファイル・システムの作成を参照してください。
- セキュリティ・ルールは、ファイル・システムをエクスポートするマウント・ターゲットとクラスタのワーカー・ノードの両方について、ネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで作成します。作成するセキュリティ・ルールは、次のシナリオに従って、マウント・ターゲットおよびワーカー・ノードの相対ネットワークの場所によって異なります:
これらのシナリオ、作成するセキュリティ・ルールおよび作成場所は、File Storageサービスのドキュメント(ファイル・ストレージのVCNセキュリティ・ルールの構成を参照)で詳しく説明されています。
- 次のように、ファイル・ストレージ・サービスのファイル・システムでバックアップされたPVを作成します。
-
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
- 次のように入力して、マニフェスト・ファイルからPVを作成します。
kubectl create -f <filename>
例:
kubectl create -f fss-pv.yaml
-
- 次のように、作成したPVによってプロビジョニングされるPVCを作成します。
- 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:
要素の値は無視されます。 - 次のように入力して、マニフェスト・ファイルからPVCを作成します。
kubectl create -f <filename>
例:kubectl create -f fss-pvc.yaml
- PVCを定義するマニフェスト・ファイルを作成し、次のように設定します。
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を作成するには:
- 「Linuxでの転送中暗号化の設定」の手順に従って、ファイル・システムに転送中暗号化を設定します。詳細は次のとおりです:
- ファイル・システムをエクスポートするマウント・ターゲットのネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで次のセキュリティ・ルールを設定して、前提条件を完了します:
- 2051の宛先ポート範囲へのTCPトラフィックを許可するステートフル・イングレス・ルール(任意のソースIPアドレスまたはCIDRブロックのすべてのポートから、またはすべてのソースから)。
- 2051のソース・ポート範囲からのTCPトラフィックを、任意の宛先IPアドレスまたはCIDRブロックのすべてのポート、またはすべての宛先に許可するステートフル・エグレス・ルール。
詳細は、シナリオC: マウント・ターゲットおよびインスタンスで-transit暗号化でTLSを使用を参照してください。
- 各ワーカー・ノードで
oci-fss-utils
パッケージをダウンロードします。ライセンス契約に同意する必要があります。タスク1: OCI-FSS-UTILSパッケージのダウンロードを参照してください。 - 各ワーカー・ノードに
oci-fss-utils
パッケージをインストールします。タスク2: Oracle LinuxまたはCentOSでのOCI-FSS-UTILSパッケージのインストールを参照してください。
- ファイル・システムをエクスポートするマウント・ターゲットのネットワーク・セキュリティ・グループ(推奨)またはセキュリティ・リストのいずれかで次のセキュリティ・ルールを設定して、前提条件を完了します:
-
保存データの暗号化に必要な「既存のファイル・システムでの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
- ポッドに対してコマンドを実行して、マウントされたボリューム上のディレクトリにファイルを書き込みます。たとえば、次のように入力します:
kubectl exec -it security-context-demo -- sh -c "cd /data/demo && echo hello > testfile"
- 新しく作成したファイルのプロパティを調べ、アクセス権を確認します。たとえば、次のように入力します:
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ポリシーを参照してください。
アクション
ポッドがアクセスするファイルのボリューム所有者のグループIDがわかっていて、ボリューム所有者のグループIDがルート(0)でない場合、ポッド仕様のsecurityContext
にサプリメンタル・グループを指定することをお薦めします。たとえば、ボリューム所有者のユーザーIDが0 (root)で、ボリューム所有者のグループIDが1000の場合、次のようにポッドのsecurityContext
でサプリメンタル・グループとして1000を指定します:
spec:
securityContext:
supplementalGroups: [1000]
ポッドのsecurityContext
でボリューム所有者のグループIDをサプリメンタル・グループとして割り当てることができない場合は、次の2つの代替ソリューションを提案します。
- 代替の解決策1: CSIDriverオブジェクトを有効にして、ポッドの
securityContext
で指定されたfsGroup
属性と一致するようにボリュームの所有権および権限を変更します。 - 代替の解決策2:ファイル・システムの「Squash」エクスポート・オプションを使用して、ポッドがボリュームの所有権を変更せずにボリューム内のファイルおよびディレクトリにアクセスできるようにします。
ソリューションを選択する前に、各ソリューションに説明されている利点と欠点を考慮してください。
代替の解決策1: CSIDriverオブジェクトを有効にして、ポッドのsecurityContext
で指定されたfsGroup
属性と一致するようにボリュームの所有権および権限を変更します
CSIDriverオブジェクトが、ポッドのsecurityContext
で指定されたfsGroup
属性と一致するようにボリュームの所有権および権限を変更できるようにするには、CSIDriverオブジェクトのfsGroupPolicy
属性を次のようにFile
に設定します。
- 次のように入力して、CSIDriver構成ファイルを取得します。
kubectl get csiDriver fss.csi.oraclecloud.com -oyaml > fss_csi_driver.yaml
- テキスト・エディタで、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
の値のみを変更します。その他の値は変更しません。 - fss_csi_driver.yamlファイルを保存して閉じます。
- 次のように入力して、既存のCSIDriverオブジェクトを削除します。
kubectl delete csiDriver fss.csi.oraclecloud.com
- 次のように入力して、新しいCSIDriverオブジェクトを作成します。
kubectl apply -f fss_csi_driver.yaml
- 「Permission Denied」メッセージが表示されたポッドを再起動します。
このソリューションを選択する前に考慮すべき事項:
- 多数のネストされたファイルおよびディレクトリを含む大容量ボリュームをマウントする場合、ボリュームのマウントに時間がかかることがあります。このボリューム・マウント・レイテンシは、
fsGroupPolicy
がFile
に設定されている場合、Kubernetesはchown()
およびchmod()
をコールして、すべてのネストされたファイルおよびディレクトリのボリューム所有権を再帰的に変更するためです。ボリューム・マウントの待機時間を短縮するには、次のように、ポッドのsecurityContext
でfsGroupChangePolicy
属性を"OnRootMismatch"
に設定してみてください:securityContext: fsGroup: <sample-fsGroup> fsGroupChangePolicy: "OnRootMismatch"
fsGroupChangePolicy
を"OnRootMismatch"
に設定すると、ルート・レベルのファイル権限がポッドのfsGroup
設定と一致しない場合のみ、Kubernetesによってボリュームの所有権が変更されるため、ボリューム・マウントの待機時間が短縮されます。 -
ボリュームにアクセスするすべてのポッドに対して
fsGroup
の値として指定したグループIDは、ボリュームのサプリメンタル・グループ所有者として追加されます。その結果、そのボリュームへのアクセスは、fsGroup
の値として指定したグループIDに制限されます。たとえば、同じボリュームをマウントする
fsGroup
値が異なる2つのポッドを作成する場合、2番目のポッドのfsGroup
に指定するグループIDはボリューム所有者のグループで、最初のポッドは引き続きボリュームにアクセスできます。 - Kubernetesが、ボリューム所有者とポッド仕様で定義された
fsGroup
の間で所有権の不一致を検出すると、Kubernetesはすべてのファイルのボリューム所有権を変更します。ボリュームにネストされたファイルおよびディレクトリが多数ある場合は、ボリュームのマウントに時間がかかることがあります。
代替の解決策2: ファイル・システムのSquashエクスポート・オプションを使用して、ポッドがボリュームの所有権を変更せずにボリューム内のファイルおよびディレクトリにアクセスできるようにします。
このソリューションでは、ファイル・システムの「Squash」エクスポート・オプションを「すべて」に設定する必要があります。「Squash」を「All」に設定すると、ボリュームがマウントされているノードで実行されているすべてのプロセス(他のポッドを含む)に対する無制限のファイル・システム・アクセス権が付与されます。したがって、このソリューションを選択する前に、セキュリティ要件への準拠を確認します。
ファイル・システムの「Squash」エクスポート・オプションを設定することで、ボリュームの所有権を変更せずに、ボリューム内のファイルおよびディレクトリへのポッド・アクセスを有効にできます。「Squash」エクスポート・オプションは、ファイル・システムにアクセスするソース・クライアントに、「Squash UID」および「Squash GID」に再マップされたユーザーID (UID)およびグループID (GID)があるかどうかを判断します。詳細は、NFSエクスポート・オプションを参照してください。
このソリューションを使用する場合は、CSIDriverオブジェクトのfsGroupPolicy
属性をFile
に変更しないでください。
既存のファイル・システムにPVCをプロビジョニングするときに「Squash」エクスポート・オプションを設定するには:
- ナビゲーション・メニューを開き、「ストレージ」をクリックします。「ファイル・ストレージ」で、「ファイル・システム」をクリックします。
- 「リスト範囲」セクションの「コンパートメント」を選択します。選択したコンパートメント内のすべてのファイル・システムが表示されます。
- エクスポート・オプションを設定するファイル・システムの名前をクリックします。
- ファイル・システムの詳細ページの「リソース」で、「エクスポート」をクリックします。
- 「エクスポート」リストで、オプションを設定するエクスポートの名前をクリックします。
- エクスポートの詳細ページの「NFSクライアント・エクスポート・オプション」で、「オプションの編集」をクリックします。
-
「オプションの編集」パネルで、次のように「Squash」エクスポート・オプションを更新します:
- Squash: 「すべて」に変更します。
- Squash UID:ボリューム所有者のUIDまたはルートUID (0)に変更します。
- Squash GUID:ボリューム所有者のGID、またはルートGID (0)に変更します。
詳細は、NFSエクスポート・オプションを参照してください。
- 「更新」をクリックします。
新しいファイル・システムにPVCをプロビジョニングするときに「Squash」エクスポート・オプションを設定するには:
- CSIボリューム・プラグインを使用した新しいファイル・システムでのPVCのプロビジョニングの手順に従いますが、
fss.csi.oraclecloud.com
プロビジョナを使用するストレージ・クラスのマニフェスト・ファイルを作成する場合は、exportOptions
パラメータを設定して、Squashエクスポート・オプションの値を指定します。exportOptions: "[\"identitySquash\":\"ALL\",\"anonymous-uid\":\"0\",\"anonymous-gid\":\"0\"]"
例:
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: "[\"identitySquash\":\"ALL\",\"anonymous-uid\":\"0\",\"anonymous-gid\":\"0\"]" encryptInTransit: "true"
- 次のように入力して、マニフェストファイルからストレージクラスを作成します。
kubectl create -f <filename>
例:kubectl create -f fss-dyn-st-class.yaml
- CSIボリューム・プラグインを使用した新しいファイル・システムでのPVCのプロビジョニングの残りの手順に従って、セキュリティ・ルールを作成し、PVCを作成します。
CSIボリューム・プラグインは、新しい永続ボリューム(PV)と新しいファイル・システムをファイル・ストレージ・サービス内に作成します。新しいファイルシステムには、ストレージクラスで指定した Squashエクスポートオプションがあります。
このソリューションを選択する前に考慮すべき事項:
- 「Squash」を「All」に設定すると、ボリュームがマウントされているノードで実行されているすべてのプロセス(他のポッドを含む)に対する無制限のファイル・システム・アクセス権が付与されます。したがって、このソリューションを選択する前に、セキュリティ要件への準拠を確認します。
- 代替ソリューション1とは異なり、ボリュームの所有権は、その
fsGroup
属性が別のグループに設定されている新しいポッドによってボリュームがマウントされるたびに変更されません。 - 代替ソリューション1とは異なり、ネストされたファイルおよびディレクトリが多数ある大容量ボリュームをマウントする場合、Kubernetesはネストされたファイルおよびディレクトリのボリューム所有権を再帰的に変更しないため、ボリューム・マウント・レイテンシはありません。
- 代替ソリューション1とは異なり、fss_csi_driver.yamlファイルを編集したり、CSIDriverオブジェクトの
fsGroupPolicy
属性をFile
に変更したりすることはありません。かわりに、デフォルトの属性値fsGroupPolicy: ReadWriteOnceWithFSType
は、CSIDriverオブジェクトがファイル・ストレージ・サービスによって提供される機能を確実に利用します。