5.4. AWS Elastic File Service CSI ドライバー Operator の設定

重要

この手順は、AWS EFS CSI ドライバー Operator (Red Hat Operator )に固有のもので、Red Hat OpenShift Service on AWS 4.10 以降のバージョンにのみ適用されます。

5.4.1. 概要

Red Hat OpenShift Service on AWS は、AWS EFS CSI ドライバー を使用して永続ボリューム(PV)をプロビジョニングできます。

CSI Operator およびドライバーを使用する場合、persistent storage および configuring CSI volumes について理解しておくことが推奨されます。

AWS EFS CSI Driver Operator をインストールした後、Red Hat OpenShift Service on AWS は、デフォルトで 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 を作成し、マウントできます。
注記

Amazon Elastic File Storage (Amazon EFS)は、zonal ボリュームではなく、リージョンボリュームのみをサポートします。

5.4.2. CSI について

ストレージベンダーはこれまで Kubernetes の一部としてストレージドライバーを提供してきました。Container Storage Interface (CSI) の実装では、サードパーティーのプロバイダーは、コア Kubernetes コードを変更せずに標準のインターフェイスを使用してストレージプラグインを提供できます。

CSI Operator は、in-tree (インツリー) ボリュームプラグインでは不可能なボリュームスナップショットなどのストレージオプションを Red Hat OpenShift Service on AWS ユーザーに付与します。

5.4.3. AWS EFS CSI ドライバー Operator の設定

  1. AWS EFS CSI ドライバー Operator (Red Hat Operator )をインストールします。
  2. AWS Secure Token Service (STS)で Amazon Elastic File Storage (Amazon EFS)を使用している場合は、AWS EFS CSI ドライバー を STS で設定します。
  3. AWS EFS CSI ドライバーをインストールします。

5.4.3.1. AWS EFS CSI ドライバー Operator のインストール

AWS EFS CSI ドライバー Operator (Red Hat Operator)は、デフォルトでは Red Hat OpenShift Service on AWS にインストールされません。以下の手順を使用して、クラスター内で AWS EFS CSI ドライバー Operator をインストールおよび設定します。

前提条件

  • Red Hat OpenShift Service on AWS Web コンソールにアクセスできる。

手順

Web コンソールから AWS EFS CSI ドライバー Operator をインストールするには、以下を実行します。

  1. Web コンソールにログインします。
  2. AWS EFS CSI Operator をインストールします。

    1. OperatorsOperatorHub をクリックします。
    2. フィルターボックスにAWS EFS CSIと入力して、AWS EFS CSI Operator を探します。
    3. AWS EFS CSI Driver Operatorボタンをクリックします。

      重要

      AWS EFS OperatorではなくAWS EFS CSI Driver Operatorを必ず選択してください。AWS EFS Operatorはコミュニティー Operator であり、Red Hat ではサポートしていません。

    4. AWS EFS CSI Driver OperatorページでInstallをクリックします。
    5. Install Operatorのページで、以下のことを確認してください。

      • All namespaces on the cluster (default)が選択されている。
      • Installed Namespaceopenshift-cluster-csi-driversに設定されている。
    6. Install をクリックします。

      インストールが終了すると、AWS EFS CSI Operator が Web コンソールのInstalled Operatorsに表示されます。

次のステップ

  • AWS Secure Token Service (STS) と共に AWS EFS を使用している場合は、AWS EFS CSI ドライバーを STS で設定する必要があります。詳細は、AWS EFS CSI ドライバーと STS の設定を参照してください。

5.4.3.2. AWS EFS CSI ドライバー Operator と Secure Token Service の設定

この手順では、AWS Secure Token Service (STS) で Red Hat OpenShift Service on AWS を使用して AWS EFS CSI Driver Operator を設定する方法を説明します。

この手順は、AWS EFS CSI Operator をインストールする前に実行しますが、AWS EFS CSI ドライバー Operator のインストール手順 の一部として AWS EFS CSI ドライバーをまだインストールしていない場合に実行します。

重要

ドライバーのインストールおよびボリュームの作成後にこの手順を実行すると、ボリュームの Pod へのマウントに失敗します。

前提条件

  • cluster-admin ロールを持つユーザーとしてクラスターにアクセスできる。
  • AWS アカウントの認証情報
  • AWS EFS CSI Operator がインストールされている。

手順

  1. AWS アカウントを準備します。

    1. 以下の内容を含む IAM ポリシー JSON ファイルを作成します。

      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": [
              "elasticfilesystem:DescribeAccessPoints",
              "elasticfilesystem:DescribeFileSystems",
              "elasticfilesystem:DescribeMountTargets",
              "ec2:DescribeAvailabilityZones"
            ],
            "Resource": "*"
          },
          {
            "Effect": "Allow",
            "Action": [
              "elasticfilesystem:CreateAccessPoint"
            ],
            "Resource": "*",
            "Condition": {
              "StringLike": {
                "aws:RequestTag/efs.csi.aws.com/cluster": "true"
              }
            }
          },
          {
            "Effect": "Allow",
            "Action": "elasticfilesystem:DeleteAccessPoint",
            "Resource": "*",
            "Condition": {
              "StringEquals": {
                "aws:ResourceTag/efs.csi.aws.com/cluster": "true"
              }
            }
          }
        ]
      }
    2. 以下の内容で IAM 信頼 JSON ファイルを作成します。

      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Federated": "arn:aws:iam::<your_aws_account_ID>:oidc-provider/<openshift_oidc_provider>"  1
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
              "StringEquals": {
                "<openshift_oidc_provider>:sub": [  2
                  "system:serviceaccount:openshift-cluster-csi-drivers:aws-efs-csi-driver-operator",
                  "system:serviceaccount:openshift-cluster-csi-drivers:aws-efs-csi-driver-controller-sa"
                ]
              }
            }
          }
        ]
      }
      1
      AWS アカウント ID および OpenShift OIDC プロバイダーエンドポイントを指定します。次のコマンドを実行して、エンドポイントを取得します。
      $ rosa describe cluster \
        -c $(oc get clusterversion -o jsonpath='{.items[].spec.clusterID}{"\n"}') \
        -o yaml | awk '/oidc_endpoint_url/ {print $2}' | cut -d '/' -f 3,4
      2
      OpenShift OIDC エンドポイントを再度指定します。
    3. IAM ロールを作成します。

      $ aws iam create-role \
        --role-name "<your_cluster_name>-aws-efs-csi-operator" \
        --assume-role-policy-document file://<your_trust_file_name>.json \
        --query "Role.Arn" --output text

      出力を保存します。これは次のステップで使用します。

    4. IAM ポリシーを作成します。

      $ aws iam create-policy \
        --policy-name "<your_rosa_cluster_name>-rosa-efs-csi" \
        --policy-document file://<your_policy_file_name>.json \
        --query 'Policy.Arn' --output text) || \
        POLICY=$(aws iam list-policies \
        --query 'Policies[?PolicyName==`rosa-efs-csi`].Arn' \
        --output text

      出力を保存します。これは次のステップで使用します。

    5. IAM ポリシーを IAM ロールに割り当てます。

      $ aws iam attach-role-policy \
           --role-name "<your_rosa_cluster_name>-aws-efs-csi-operator" \
           --policy-arn <policy_ARN> 1
      1
      policy_ARN を、ポリシーの作成時に保存した出力に置き換えます。
  2. ドライバー Operator の Secret YAML ファイルを作成します。

    apiVersion: v1
    kind: Secret
    metadata:
     name: aws-efs-cloud-credentials
     namespace: openshift-cluster-csi-drivers
    stringData:
      credentials: |-
        [default]
        sts_regional_endpoints = regional
        role_arn = <role_ARN> 1
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    1
    role_ARN を、ロールの作成時に保存した出力に置き換えます。
  3. シークレットを作成します。

    $ oc apply -f aws-efs-cloud-credentials.yaml

    AWS EFS CSI ドライバーをインストールする準備が整いました。

5.4.3.3. AWS EFS CSI ドライバーのインストール

AWS EFS CSI Driver Operator をインストールして STS で設定したら、AWS EFS CSI Driver をインストールします。

前提条件

  • Red Hat OpenShift Service on AWS Web コンソールにアクセスできる。

手順

  1. AdministrationCustomResourceDefinitionsClusterCSIDriver をクリックします。
  2. InstancesタブでCreate ClusterCSIDriverをクリックします。
  3. 以下の YAML ファイルを使用します。

    apiVersion: operator.openshift.io/v1
    kind: ClusterCSIDriver
    metadata:
        name: efs.csi.aws.com
    spec:
      managementState: Managed
  4. Create をクリックします。
  5. 以下の条件が "true" に変わるのを待ちます。

    • AWSEFSDriverNodeServiceControllerAvailable
    • AWSEFSDriverControllerServiceControllerAvailable

5.4.4. AWS EFS ストレージクラスの作成

ストレージクラスを使用すると、ストレージのレベルや使用状況を区別し、記述することができます。ストレージクラスを定義することにより、ユーザーは動的にプロビジョニングされた永続ボリュームを取得できます。

AWS EFS CSI ドライバー Operator (Red Hat Operator)の インストール後、デフォルトではストレージクラスは作成されません。ただし、AWS EFS ストレージクラスを手動で作成することは可能です。

5.4.4.1. コンソールを使用した AWS EFS ストレージクラスの作成

手順

  1. Red Hat OpenShift Service on AWS コンソールで、StorageStorageClasses をクリックします。
  2. StorageClasses ページで、Create StorageClass をクリックします。
  3. StorageClass ページで、次の手順を実行します。

    1. ストレージクラスを参照するための名前を入力します。
    2. オプション: 説明を入力します。
    3. 回収ポリシーを選択します。
    4. Provisionerドロップダウンリストからefs.csi.aws.comを選択します。
    5. オプション: 選択したプロビジョナーの設定パラメーターを設定します。
  4. Create をクリックします。

5.4.4.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
    動的プロビジョニングを有効にするには、provisioningModeefs-ap を指定する必要があります。
    2
    fileSystemId は、手動で作成した EFS ボリュームの ID でなければなりません。
    3
    directoryPerms は、ボリュームのルートディレクトリーのデフォルトパーミッションです。この場合、ボリュームには所有者のみがアクセスできます。
    4 5
    gidRangeStartgidRangeEnd は、AWS アクセスポイントの GID を設定する際に使用する POSIX グループ ID(GID) の範囲を設定します。指定しない場合、デフォルトの範囲は 50000 - 7000000 です。プロビジョニングされた各ボリューム、つまり AWS のアクセスポイントには、この範囲からの固有 GID が割り当てられます。
    6
    basePath は、動的にプロビジョニングされたボリュームを作成する際に使用される EFS ボリューム上のディレクトリーです。この場合、EFS ボリューム上に/dynamic_provisioning/<random uuid>として PV がプロビジョニングされます。PV を使用する Pod には、そのサブディレクトリーのみがマウントされます。
    注記

    クラスター管理者は、それぞれが異なる EFS ボリュームを使用する複数の StorageClass オブジェクトを作成することができます。

5.4.5. AWS における EFS ボリュームへのアクセスの作成と設定

この手順では、Red Hat OpenShift Service on AWS で使用できるように、AWS で EFS ボリュームを作成および設定する方法を説明します。

前提条件

  • AWS アカウントの認証情報

手順

AWS で EFS ボリュームへのアクセスを作成および設定するには、以下の手順を実施します。

  1. AWS のコンソールで、https://console.aws.amazon.com/efs を開きます。
  2. Create file systemをクリックします。

    • ファイルシステムの名前を入力します。
    • Virtual Private Cloud (VPC) の場合、Red Hat OpenShift Service on AWS の仮想プライベートクラウド (VPC) を選択します。
    • その他の選択項目については、デフォルト設定を受け入れます。
  3. ボリュームとマウントターゲットが完全に作成され終わるのを待ちます。

    1. https://console.aws.amazon.com/efs#/file-systems にアクセスしてください。
    2. ボリュームをクリックし、Networkタブで、すべてのマウントターゲットが利用可能になるまで待ちます (最長で 1 - 2 分間)。
  4. Networkタブでセキュリティーグループ ID をコピーします (次のステップで必要になります)。
  5. https://console.aws.amazon.com/ec2/v2/home#SecurityGroups にアクセスし、EFS ボリュームで使用されているセキュリティーグループを探します。
  6. Inbound rules タブで Edit inbound rules をクリックし、次の設定で新しいルールを追加して、Red Hat OpenShift Service on AWS ノードが EFS ボリュームにアクセスできるようにします。

    • Type: NFS
    • Protocol: TCP
    • Port range: 2049
    • Source: ノードのカスタム/IP アドレス範囲 (例:"10.0.0.0/16")

      この手順により、Red Hat OpenShift Service on AWS がクラスターから NFS ポートを使用できるようになります。

  7. ルールを保存します。

5.4.6. Amazon Elastic File Storage の動的プロビジョニング

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 ボリュームサイズのモニタリングを使用することを強く推奨します。

前提条件

  • Amazon Elastic File Storage (Amazon EFS)ボリュームを作成している。
  • AWS EFS ストレージクラスを作成している。

手順

動的プロビジョニングを有効にするには、以下の手順を実施します。

  • 以前に作成した StorageClass を参照して、通常どおり PVC (または StatefulSet や Template) を作成します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test
    spec:
      storageClassName: efs-sc
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi

動的プロビジョニングのセットアップに問題がある場合は、Amazon Elastic File Storage Troubleshooting を参照してください

5.4.7. Amazon Elastic File Storage を使用した静的 PV の作成

Amazon Elastic File Storage (Amazon EFS)ボリュームを、動的プロビジョニングなしで単一の PV として使用できます。ボリューム全体が Pod にマウントされます。

前提条件

  • Amazon EFS ボリュームを作成している。

手順

  • 以下の 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 の設定に問題がある場合は、Amazon Elastic File Storage Troubleshooting を参照してください

5.4.8. Amazon Elastic File Storage のセキュリティー

以下の情報は、Amazon Elastic File Storage (Amazon 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 を無視します。Red Hat OpenShift Service on AWS は、ボリューム上のファイルの GID を FSGroup に置き換えることができません。マウントされた EFS アクセスポイントにアクセスできる Pod は、そこにあるすべてのファイルにアクセスできます。

これとは関係ありませんが、転送中の暗号化はデフォルトで有効になっています。詳しくは、https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html を参照してください。

5.4.9. Amazon Elastic File Storage のトラブルシューティング

以下の情報は、Amazon Elastic File Storage (Amazon 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
    ボリュームがマウントされていないことを示す警告メッセージ。

    このエラーは、AWS が Red Hat OpenShift Service on AWS ノードと AWS EFS の間でパケットをドロップすることで頻繁に発生します。

    以下が正しいことを確認します。

    • AWS のファイアウォールとセキュリティーグループ
    • ネットワーク: ポート番号と IP アドレス

5.4.10. AWS EFS CSI ドライバー Operator のアンインストール

AWS EFS CSI ドライバー Operator (Red Hat Operator)をアンインストールすると、すべての EFS PV にアクセスできなくなります。

前提条件

  • Red Hat OpenShift Service on AWS Web コンソールにアクセスできる。

手順

Web コンソールから AWS EFS CSI ドライバー Operator をアンインストールするには、以下を実行します。

  1. Web コンソールにログインします。
  2. AWS EFS PV を使用するすべてのアプリケーションを停止します。
  3. すべての AWS EFS PV を削除します。

    1. StoragePersistentVolumeClaims をクリックします。
    2. AWS EFS CSI ドライバー Operator が使用している各 PVC を選択し、PVC の右端にあるドロップダウンメニューをクリックして、Delete PersistentVolumeClaimsをクリックします。
  4. AWS EFS CSI ドライバーをアンインストールします。

    注記

    Operator をアンインストールする前に、まず CSI ドライバーを削除する必要があります。

    1. AdministrationCustomResourceDefinitionsClusterCSIDriver をクリックします。
    2. Instancesタブのefs.csi.aws.comの左端にあるドロップダウンメニューをクリックし、Delete ClusterCSIDriverをクリックします。
    3. プロンプトが表示されたら、Deleteをクリックします。
  5. AWS EFS CSI Operator をアンインストールします。

    1. OperatorsInstalled Operators をクリックします。
    2. Installed Operatorsページで、スクロールするか、Search by nameボックスに AWS EFS CSI と入力してオペレーターを見つけ、クリックします。
    3. Installed Operators > Operator detailsページの右上にあるActionsUninstall Operatorをクリックします。
    4. Uninstall Operator ウィンドウでプロンプトが表示されたら、Uninstall ボタンをクリックして namespace から Operator を削除します。Operator によってクラスターにデプロイされたアプリケーションは手動でクリーンアップする必要があります。

      アンインストールすると、AWS EFS CSI ドライバー Operator が Web コンソールの Installed Operators セクションに一覧表示されなくなります。

注記

クラスターを破棄 (openshift-install destroy cluster) する前に、AWS の EFS ボリュームを削除する必要があります。クラスターの VPC を使用する EFS ボリュームがある場合は、Red Hat OpenShift Service on AWS クラスターを破棄できません。Amazon はこのような VPC の削除を許可していません。

5.4.11. 関連情報