5.9. AWS Elastic File Service CSI ドライバー Operator
5.9.1. 概要
OpenShift Container Platform は、AWS Elastic File Service (EFS) の Container Storage Interface (CSI) ドライバーを使用して永続ボリューム (PV) をプロビジョニングできます。
CSI Operator およびドライバーを使用する場合、永続ストレージ および CSI ボリュームの設定 について理解しておくことが推奨されます。
AWS EFS CSI ドライバー Operator をインストールすると、OpenShift Container Platform はデフォルトで AWS EFS CSI Operator と AWS EFS CSI ドライバーを openshift-cluster-csi-drivers
namespace にインストールします。これにより、AWS EFS CSI ドライバー Operator は、AWS EFS アセットにマウントする CSI がプロビジョニングする PV を作成することができます。
-
AWS EFS CSI ドライバー Operatorをインストールしても、永続ボリューム要求 (PVC) の作成に使用するストレージクラスがデフォルトで作成されません。ただし、AWS EFS
StorageClass
を手動で作成することは可能です。AWS EFS CSI ドライバー Operator は、ストレージボリュームをオンデマンドで作成できるようにし、クラスター管理者がストレージを事前にプロビジョニングする必要がなくすことで、動的ボリュームのプロビジョニングをサポートします。 - AWS EFS CSI ドライバー を使用すると、AWS EFS PV を作成し、マウントできます。
AWS EFS はリージョナルボリュームのみをサポートしており、ゾーンボリュームはサポートしていません。
5.9.2. CSI について
ストレージベンダーはこれまで Kubernetes の一部としてストレージドライバーを提供してきました。Container Storage Interface (CSI) の実装では、サードパーティーのプロバイダーは、コア Kubernetes コードを変更せずに標準のインターフェイスを使用してストレージプラグインを提供できます。
CSI Operator は、in-tree (インツリー) ボリュームプラグインでは不可能なボリュームスナップショットなどのストレージオプションを OpenShift Container Platform ユーザーに付与します。
5.9.3. AWS EFS CSI ドライバー Operator のインストール
AWS EFS CSI ドライバー Operator はデフォルトでは OpenShift Container Platform にインストールされません。以下の手順を使用して、クラスター内で AWS EFS CSI ドライバー Operator をインストールおよび設定します。
前提条件
- OpenShift Container Platform Web コンソールにアクセスできる。
手順
Web コンソールから AWS EFS CSI ドライバー Operator をインストールするには、以下を実行します。
- Web コンソールにログインします。
AWS EFS CSI Operator をインストールします。
-
Operators
OperatorHub をクリックします。 - フィルターボックスにAWS EFS CSIと入力して、AWS EFS CSI Operator を探します。
AWS EFS CSI Driver Operatorボタンをクリックします。
重要AWS EFS OperatorではなくAWS EFS CSI Driver Operatorを必ず選択してください。AWS EFS Operatorはコミュニティー Operator であり、Red Hat ではサポートしていません。
- AWS EFS CSI Driver OperatorページでInstallをクリックします。
Install Operatorのページで、以下のことを確認してください。
- All namespaces on the cluster (default)が選択されている。
- Installed Namespaceがopenshift-cluster-csi-driversに設定されている。
Install をクリックします。
インストールが終了すると、AWS EFS CSI Operator が Web コンソールのInstalled Operatorsに表示されます。
-
Operators
- AWS Security Token Service (STS) と共に AWS EFS を使用している場合は、AWS EFS CSI ドライバーを STS で設定する必要があります。詳細は、AWS EFS CSI ドライバー と STS の設定を参照してください。
AWS EFS CSI ドライバーをインストールします。
-
administration
CustomResourceDefinitions ClusterCSIDriverをクリックします。 - InstancesタブでCreate ClusterCSIDriverをクリックします。
以下の YAML ファイルを使用します。
apiVersion: operator.openshift.io/v1 kind: ClusterCSIDriver metadata: name: efs.csi.aws.com spec: managementState: Managed
- Create をクリックします。
以下の条件が "true"に変わるのを待ちます。
- AWSEFSDriverCredentialsRequestControllerAvailable
- AWSEFSDriverNodeServiceControllerAvailable
- AWSEFSDriverControllerServiceControllerAvailable
-
administration
5.9.4. Security Token Service を使用した AWS EFS CSI ドライバー Operator の設定
この手順では、AWS Security Token Service (STS) で OpenShift Container Platform と共に AWS EFS CSI ドライバー Operator を設定する方法を説明します。
AWS EFS CSI Operator のインストール後に、AWS EFS CSI ドライバー Operator のインストール 手順の一部として AWS EFS CSI ドライバーをインストールする前に、以下の手順を実行します。ドライバーのインストールおよびボリュームの作成後にこの手順を実行すると、ボリュームの Pod へのマウントに失敗します。
前提条件
- AWS アカウントの認証情報
手順
AWS EFS CSI ドライバー Operator と STS を設定するには、以下を実行します。
-
STS とクラスターのインストールに使用した OpenShift Container Platform リリースイメージから CCO ユーティリティー (
ccoctl
) バイナリーを展開します。詳細は、Cloud Credential Operator ユーティリティーの設定を参照してください。 以下の例に示されているように EFS
CredentialsRequest
YAML ファイルを作成および保存してから、それをcredrequests
ディレクトリーに配置します。例
apiVersion: cloudcredential.openshift.io/v1 kind: CredentialsRequest metadata: name: openshift-aws-efs-csi-driver namespace: openshift-cloud-credential-operator spec: providerSpec: apiVersion: cloudcredential.openshift.io/v1 kind: AWSProviderSpec statementEntries: - action: - elasticfilesystem:* effect: Allow resource: '*' secretRef: name: aws-efs-cloud-credentials namespace: openshift-cluster-csi-drivers serviceAccountNames: - aws-efs-csi-driver-operator - aws-efs-csi-driver-controller-sa
ccoctl
ツールを実行して AWS に新規の IAM ロールを生成し、その YAML ファイルをローカルファイルシステムに作成します (<path_to_ccoctl_output_dir>/manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml
)。$ ccoctl aws create-iam-roles --name=<name> --region=<aws_region> --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests --identity-provider-arn=arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com
-
name=<name>
は、追跡用に作成されたクラウドリソースにタグを付けるために使用される名前です。 -
region=<aws_region>
は、クラウドリソースが作成される AWS リージョンです。 -
dir=<path_to_directory_with_list_of_credentials_requests>/credrequests
は、前のステップの EFS CredentialsRequest ファイルが含まれるディレクトリーです。 <aws_account_id>
は AWS アカウント ID です。例
$ ccoctl aws create-iam-roles --name my-aws-efs --credentials-requests-dir credrequests --identity-provider-arn arn:aws:iam::123456789012:oidc-provider/my-aws-efs-oidc.s3.us-east-2.amazonaws.com
出力例
2022/03/21 06:24:44 Role arn:aws:iam::123456789012:role/my-aws-efs -openshift-cluster-csi-drivers-aws-efs-cloud- created 2022/03/21 06:24:44 Saved credentials configuration to: /manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml 2022/03/21 06:24:45 Updated Role policy for Role my-aws-efs-openshift-cluster-csi-drivers-aws-efs-cloud-
-
AWS EFS クラウド認証情報およびシークレットを作成します。
$ oc create -f <path_to_ccoctl_output_dir>/manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml
例
$ oc create -f /manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml
出力例
secret/aws-efs-cloud-credentials created
5.9.5. AWS EFS ストレージクラスの作成
ストレージクラスを使用すると、ストレージのレベルや使用状況を区別し、記述することができます。ストレージクラスを定義することにより、ユーザーは動的にプロビジョニングされた永続ボリュームを取得できます。
AWS EFS CSI ドライバー Operatorをインストールしても、ストレージクラスがデフォルトで作成されません。ただし、AWS EFS ストレージクラスを手動で作成することは可能です。
5.9.5.1. コンソールを使用した AWS EFS ストレージクラスの作成
手順
-
OpenShift Container Platform コンソールで、Storage
StorageClasses をクリックします。 - StorageClasses ページで、Create StorageClass をクリックします。
StorageClass ページで、次の手順を実行します。
- ストレージクラスを参照するための名前を入力します。
- オプション: 説明を入力します。
- 回収ポリシーを選択します。
-
Provisionerドロップダウンリストから
efs.csi.aws.com
を選択します。 - オプション: 選択したプロビジョナーの設定パラメーターを設定します。
- Create をクリックします。
5.9.5.2. CLI を使用した AWS EFS ストレージクラスの作成
手順
StorageClass
オブジェクトを作成します。kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: efs-sc provisioner: efs.csi.aws.com parameters: provisioningMode: efs-ap 1 fileSystemId: fs-a5324911 2 directoryPerms: "700" 3 gidRangeStart: "1000" 4 gidRangeEnd: "2000" 5 basePath: "/dynamic_provisioning" 6
- 1
- 動的プロビジョニングを有効にするには、
provisioningMode
にefs-ap
を指定する必要があります。 - 2
fileSystemId
は、手動で作成した EFS ボリュームの ID でなければなりません。- 3
directoryPerms
は、ボリュームのルートディレクトリーのデフォルトパーミッションです。この場合、ボリュームには所有者のみがアクセスできます。- 4 5
gidRangeStart
とgidRangeEnd
は、AWS アクセスポイントの GID を設定する際に使用する POSIX グループ ID(GID) の範囲を設定します。指定しない場合、デフォルトの範囲は 50000 - 7000000 です。プロビジョニングされた各ボリューム、つまり AWS のアクセスポイントには、この範囲からの固有 GID が割り当てられます。- 6
basePath
は、動的にプロビジョニングされたボリュームを作成する際に使用される EFS ボリューム上のディレクトリーです。この場合、EFS ボリューム上に/dynamic_provisioning/<random uuid>として PV がプロビジョニングされます。PV を使用する Pod には、そのサブディレクトリーのみがマウントされます。
注記クラスター管理者は、それぞれが異なる EFS ボリュームを使用する複数の
StorageClass
オブジェクトを作成することができます。
5.9.6. AWS における EFS ボリュームへのアクセスの作成と設定
この手順では、OpenShift Container Platform で使用できるように、AWS で EFS ボリュームを作成および設定する方法を説明します。
前提条件
- AWS アカウントの認証情報
手順
AWS で EFS ボリュームへのアクセスを作成および設定するには、以下の手順を実施します。
- AWS のコンソールで、https://console.aws.amazon.com/efs を開きます。
Create file systemをクリックします。
- ファイルシステムの名前を入力します。
- Virtual Private Cloud(VPC)には、OpenShift Container Platform の仮想プライベートクラウド (VPC) を選択します。
- その他の選択項目については、デフォルト設定を受け入れます。
ボリュームとマウントターゲットが完全に作成され終わるのを待ちます。
- https://console.aws.amazon.com/efs#/file-systems にアクセスしてください。
- ボリュームをクリックし、Networkタブで、すべてのマウントターゲットが利用可能になるまで待ちます (最長で 1 - 2 分間)。
- Networkタブでセキュリティーグループ ID をコピーします (次のステップで必要になります)。
- https://console.aws.amazon.com/ec2/v2/home#SecurityGroups にアクセスし、EFS ボリュームで使用されているセキュリティーグループを探します。
Inbound rulesタブで[Edit inbound rules] をクリックし、OpenShift Container Platform ノードが EFS ボリュームにアクセスできるようにするために、次の設定で新しいルールを追加します。
- Type: NFS
- Protocol: TCP
- Port range: 2049
Source: ノードのカスタム/IP アドレス範囲 (例:"10.0.0.0/16")
このステップで、OpenShift Container Platform がクラスターから NFS ポートを使用できるようになります。
- ルールを保存します。
5.9.7. AWS EFS の動的プロビジョニング
AWS EFS CSI ドライバーは、他の CSI ドライバーとは異なる形態の動的プロビジョニングをサポートしています。既存の EFS ボリュームのサブディレクトリーとして新しい PV をプロビジョニングします。PV はお互いに独立しています。しかし、これらはすべて同じ EFS ボリュームを共有しています。ボリュームが削除されると、そのボリュームからプロビジョニングされたすべての PV も削除されます。EFS CSI ドライバーは、そのようなサブディレクトリーごとに AWS アクセスポイントを作成します。AWS AccessPoint の制限により、単一の StorageClass
/EFS ボリュームから動的にプロビジョニングできるのは 1000 PV のみです。
なお、PVC.spec.resources
は EFS では強制されません。
以下の例では、5GiB の容量を要求しています。しかし、作成された PV は無限であり、どんな量のデータ (ペタバイトのような) も保存することができます。ボリュームに大量のデータを保存してしまうと、壊れたアプリケーション、あるいは不正なアプリケーションにより、多額の費用が発生します。
AWS の EFS ボリュームサイズのモニタリングを使用することを強く推奨します。
前提条件
- AWS EFS ボリュームを作成している。
- AWS EFS ストレージクラスを作成している。
手順
動的プロビジョニングを有効にするには、以下の手順を実施します。
上記で作成した
StorageClass
を参照して、通常通り PVC(または StatefulSet や Template) を作成します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test spec: storageClassName: efs-sc accessModes: - ReadWriteMany resources: requests: storage: 5Gi
動的プロビジョニングのセットアップに問題がある場合は、AWS EFS のトラブルシューティング を参照してください。
5.9.8. AWS EFS による静的 PV の作成
動的プロビジョニングを行わずに、単一の PV として AWS EFS ボリュームを使用することが可能です。ボリューム全体が Pod にマウントされます。
前提条件
手順
以下の YAML ファイルで PV を作成します。
apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: 1 storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteMany - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: efs.csi.aws.com volumeHandle: fs-ae66151a 2 volumeAttributes: encryptInTransit: "false" 3
- 1
spec.capacity
には意味がなく、CSI ドライバーでは無視されます。PVC へのバインディング時にのみ使用されます。アプリケーションは、ボリュームに任意の量のデータを保存することができます。- 2
volumeHandle
は、AWS で作成した EFS ボリュームと同じ ID である必要があります。独自のアクセスポイントを提供する場合、volumeHandle
は<EFS volume ID>::<access point ID>
とします。例:fs-6e633ada::fsap-081a1d293f0004630
- 3
- 必要に応じて、転送中の暗号化を無効にすることができます。デフォルトでは、暗号化が有効になっています。
静的 PV の設定に問題がある場合は、AWS EFS のトラブルシューティング を参照してください。
5.9.9. AWS EFS のセキュリティー
以下の情報は、AWS EFS のセキュリティーにとって重要です。
前述の動的プロビジョニングなどでアクセスポイントを使用する場合、Amazon はファイルの GID をアクセスポイントの GID に自動的に置き換えます。また、EFS では、ファイルシステムの権限を評価する際に、アクセスポイントのユーザー ID、グループ ID、セカンダリーグループ ID を考慮します。EFS は、NFS クライアントの ID を無視します。アクセスポイントの詳細については、https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html を参照してください。
その結果、EFS ボリュームは FSGroup を静かに無視します。OpenShift Container Platform は、ボリューム上のファイルの GID を FSGroup で置き換えることができません。マウントされた EFS アクセスポイントにアクセスできる Pod は、そこにあるすべてのファイルにアクセスできます。
これとは関係ありませんが、転送中の暗号化はデフォルトで有効になっています。詳しくは、https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html を参照してください。
5.9.10. AWS EFS のトラブルシューティング
以下の情報は、AWS EFS の問題をトラブルシューティングするためのガイダンスです。
-
AWS EFS Operator と CSI ドライバーは、namespace
openshift-cluster-csi-drivers
で実行されます。 AWS EFS Operator と CSI ドライバーのログ収集を開始するには、以下のコマンドを実行します。
$ oc adm must-gather [must-gather ] OUT Using must-gather plugin-in image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5 [must-gather ] OUT namespace/openshift-must-gather-xm4wq created [must-gather ] OUT clusterrolebinding.rbac.authorization.k8s.io/must-gather-2bd8x created [must-gather ] OUT pod for plug-in image quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5 created
AWS EFS Operator のエラーを表示するには、
ClusterCSIDriver
のステータスを表示します。$ oc get clustercsidriver efs.csi.aws.com -o yaml
Pod にボリュームをマウントできない場合 (以下のコマンドの出力に示す):
$ oc describe pod ... Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2m13s default-scheduler Successfully assigned default/efs-app to ip-10-0-135-94.ec2.internal Warning FailedMount 13s kubelet MountVolume.SetUp failed for volume "pvc-d7c097e6-67ec-4fae-b968-7e7056796449" : rpc error: code = DeadlineExceeded desc = context deadline exceeded 1 Warning FailedMount 10s kubelet Unable to attach or mount volumes: unmounted volumes=[persistent-storage], unattached volumes=[persistent-storage kube-api-access-9j477]: timed out waiting for the condition
- 1
- ボリュームがマウントされていないことを示す警告メッセージ。
このエラーは、OpenShift Container Platform ノードと AWS EFS 間のパケットを AWS がドロップすることで頻繁に発生します。
以下の内容が正しいことを確認してください (AWS における EFS ボリュームへのアクセスの作成と設定 を参照)。
- AWS のファイアウォールとセキュリティーグループ
- ネットワーク: ポート番号と IP アドレス
5.9.11. AWS EFS CSI ドライバー Operator のアンインストール
AWS EFS CSI ドライバー Operator をアンインストールすると、すべての EFS PV にアクセスできなくなる。
前提条件
- OpenShift Container Platform Web コンソールにアクセスできる。
手順
Web コンソールから AWS EFS CSI ドライバー Operator をアンインストールするには、以下を実行します。
- Web コンソールにログインします。
- AWS EFS PV を使用するすべてのアプリケーションを停止します。
すべての AWS EFS PV を削除します。
-
Storage
PersistentVolumeClaims をクリックします。 - AWS EFS CSI ドライバー Operator が使用している各 PVC を選択し、PVC の右端にあるドロップダウンメニューをクリックして、Delete PersistentVolumeClaimsをクリックします。
-
Storage
AWS EFS CSI ドライバーをアンインストールします。
注記Operator をアンインストールする前に、まず CSI ドライバーを削除する必要があります。
-
administration
CustomResourceDefinitions ClusterCSIDriverをクリックします。 - Instancesタブのefs.csi.aws.comの左端にあるドロップダウンメニューをクリックし、Delete ClusterCSIDriverをクリックします。
- プロンプトが表示されたら、Deleteをクリックします。
-
administration
AWS EFS CSI Operator をアンインストールします。
-
Operators
Installed Operators をクリックします。 - Installed Operatorsページで、スクロールするか、Search by nameボックスに AWS EFS CSI と入力してオペレーターを見つけ、クリックします。
-
Installed Operators > Operator detailsページの右上にあるActions
Uninstall Operatorをクリックします。 Uninstall Operator ウィンドウでプロンプトが表示されたら、Uninstall ボタンをクリックして namespace から Operator を削除します。Operator によってクラスターにデプロイされたアプリケーションは手動でクリーンアップする必要があります。
アンインストールすると、AWS EFS CSI ドライバー Operator が Web コンソールの Installed Operators セクションに一覧表示されなくなります。
-
Operators
クラスターを破棄 (openshift-install destroy cluster
) する前に、AWS の EFS ボリュームを削除する必要があります。クラスターの VPC を使用する EFS ボリュームがある場合、OpenShift Container Platform クラスターを破棄することはできません。Amazon はこのような VPC の削除を許可していません。