Amazon EFS CSI ドライバー - Amazon EKS

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

Amazon EFS CSI ドライバー

Amazon EFS Container Storage Interface (CSI) ドライバーは、 で実行されている Kubernetes クラスターがAWSファイルシステムのライフサイクルAmazon EFSを管理できるようにする CSI インターフェイスを提供します。

このトピックでは、Amazon EFS CSI ドライバーを Amazon EKS クラスターにデプロイし、動作することを確認する方法を示します。

注記

Amazon EFS CSI ドライバーのアルファ機能は、Amazon EKS クラスターではサポートされていません。

使用可能なパラメータの詳細と、ドライバーの機能を示す完全な例については、GitHub の Amazon EFS コンテナストレージインターフェイス (CSI) ドライバープロジェクトを参照してください。

Considerations

  • Fargate ノードで動的永続ボリュームプロビジョニングを使用することはできませんが、静的プロビジョニングを使用できます。

  • 動的プロビジョニングには、1.2 以降のドライバーが必要です。これには、1.17 以降のクラスターが必要です。サポートされている任意のAmazon EKSクラスターバージョンで 1.1 ドライバーを使用して、永続的ボリュームを静的にプロビジョニングできます。

Prerequisites

  • OIDC – プロバイダーを使用した既存のクラスター クラスターがない場合は、 の使用を開始するAmazon EKS ガイドのいずれかを使用してクラスターを作成できます。既存の クラスターの OIDC プロバイダーがあるかどうかを判断するか、作成するにはクラスターの IAM OIDC プロバイダーを作成する、「」を参照してください。

  • AWS CLI – を含む AWS サービスを使用するためのコマンドラインツールAmazon EKS。このガイドでは、 バージョン 2.1.26 以降、または 1.19.7 以降を使用する必要があります。詳細については、の「AWS CLI のインストール、更新、アンインストール」を参照してくださいAWS Command Line Interface ユーザーガイド。をインストールしたらAWS CLI、設定も行うことをお勧めします。詳細については、の「aws 設定を使用したクイック設定」を参照してくださいAWS Command Line Interface ユーザーガイド。

  • kubectl – Kubernetes クラスターを操作するためのコマンドラインツール。このガイドでは、 バージョン 1.19 以降を使用する必要があります。詳細については、「 」を参照してくださいのインストール kubectl

IAM ポリシーとロールを作成する

IAM ポリシーを作成し、 IAM ロールに割り当てます。このポリシーによりAmazon EFS、ドライバーは ファイルシステムとやり取りできるようになります。

Amazon EFS CSI ドライバーを Amazon EKS クラスターにデプロイするには

  1. CSI ドライバーのサービスアカウントがユーザーに代わって IAM APIs を呼び出すことを許可する AWS ポリシーを作成します。

    1. GitHub からIAMポリシードキュメントをダウンロードします。ポリシードキュメントを表示することもできます。

      curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/v/docs/iam-policy-example.json
    2. ポリシーを作成します。変更することができます AmazonEKS_EFS_CSI_Driver_Policy 別の名前に変更しますが、変更する場合は、後のステップでも変更してください。

      aws iam create-policy \ --policy-name AmazonEKS_EFS_CSI_Driver_Policy \ --policy-document file://iam-policy-example.json
  2. IAM ロールを作成して、IAM ポリシーをアタッチします。Kubernetes サービスアカウントにIAMロールARNを注釈を付けIAM、ロールに Kubernetes サービスアカウント名を付けます。eksctl または を使用してロールを作成できますAWS CLI。

    eksctl

    次のコマンドは、 IAM ロールと Kubernetes サービスアカウントを作成します。また、ポリシーをロールにアタッチIAMし、Kubernetes サービスアカウントにARNロールを注釈を付け、Kubernetes サービスアカウント名をIAMロールの信頼ポリシーに追加します。クラスターに IAM OIDC プロバイダーがない場合はIAM、OIDC プロバイダーも作成されます。

    eksctl create iamserviceaccount \ --name efs-csi-controller-sa \ --namespace kube-system \ --cluster <cluster-name> \ --attach-policy-arn arn:aws:iam::<AWS account ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \ --approve \ --override-existing-serviceaccounts \ --region us-west-2
    AWS CLI
    1. クラスターの OIDC プロバイダー URL を確認します。置換 <cluster_name> ( を含む <>) を選択します。コマンドからの出力が の場合はNone、「前提条件」を参照してください。

      aws eks describe-cluster --name <cluster-name> --query "cluster.identity.oidc.issuer" --output text

      出力

      https://oidc.eks.us-west-2.amazonaws.com/id/EXAMPLEXXX45D83924220DC4815XXXXX
    2. IAM ロールを作成し、Kubernetes サービスアカウントに AssumeRoleWithWebIdentity アクションを付与します。

      1. 次の内容を という名前のファイルtrust-policy.jsonにコピーします。置換 <AWS_ACCOUNT_ID> ( を含む <>) を選択します。<EXAMPLEXXX45D83924220DC4815XXXXX> および us-west-2 前のステップで返された値を持つ 。

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/oidc.eks.us-west-2.amazonaws.com/id/<EXAMPLEXXX45D83924220DC4815XXXXX>" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.us-west-2.amazonaws.com/id/<EXAMPLEXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa" } } } ] }
      2. ロールを作成し、別の名前AmazonEKS_EFS_CSI_DriverRoleに変更することもできますが、変更する場合は、後のステップでも変更してください。

        aws iam create-role \ --role-name AmazonEKS_EFS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
    3. IAM ポリシーをロールにアタッチします。<AWS_ACCOUNT_ID> ( を含む<>) を アカウント ID に置き換えます。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AmazonEKS_EFS_CSI_Driver_Policy \ --role-name AmazonEKS_EFS_CSI_DriverRole
    4. 作成したIAMロールの ARN で注釈が付けられた Kubernetes サービスアカウントを作成します。

      1. 以下の内容を という名前のファイルに保存します。efs-service-account.yaml.

        --- apiVersion: v1 kind: ServiceAccount metadata: name: efs-csi-controller-sa namespace: kube-system labels: app.kubernetes.io/name: aws-efs-csi-driver annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/AmazonEKS_EFS_CSI_DriverRole
      2. マニフェストを適用します。

        kubectl apply -f efs-service-account.yaml

Amazon EFS ドライバーのインストール

Helm またはマニフェストを使用して Amazon EFS CSI ドライバーをインストールします。

重要
  • 以下のステップでは、 1.2.0 バージョンのドライバーをインストールします。これには、 1.17 以降の クラスターが必要です。バージョン 1.17 より前のクラスターにドライバーをインストールする場合は、バージョン 1.1 のドライバーをインストールする必要があります。詳細についてはGitHub のAmazon EFS「CSI ドライバー」を参照してください。

  • TLS を使用した転送中のデータの暗号化は、デフォルトで有効になっています。転送中の暗号化を使用すると、ネットワーク経由で Amazon EFS サービスに移行中にデータが暗号化されます。NFSv4 を使用してボリュームを無効にしてマウントするには、永続的なボリュームマニフェストvolumeAttributesencryptInTransit"false" フィールドを に設定します。マニフェストの例についてはGitHub の「転送時の暗号化の例」を参照してください。

Helm

この手順には、Helm V3 以降が必要です。Helm をインストールまたはアップグレードするには での Helm の使用Amazon EKS、「」を参照してください。

  1. Helm リポジトリを追加します。

    helm repo add aws-efs-csi-driver https://kubernetes-sigs.github.io/aws-efs-csi-driver/
  2. リポジトリを更新します。

    helm repo update
  3. グラフをインストールします。クラスターが にない場合 us-west-2 リージョン、その後 の変更 602401143452.dkr.ecr。us-west-2.amazonaws.com リージョンのアドレス に送信します。

    helm upgrade -i aws-efs-csi-driver aws-efs-csi-driver/aws-efs-csi-driver \ --namespace kube-system \ --set image.repository=602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-efs-csi-driver \ --set serviceAccount.controller.create=false \ --set serviceAccount.controller.name=efs-csi-controller-sa
Manifest
  1. マニフェストをダウンロードします。

    kubectl kustomize \ "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr?ref=release-" > driver.yaml
  2. ファイルを編集し、Kubernetes サービスアカウントを作成する次の行を削除します。これは、サービスアカウントが前のステップで作成されてから必要なくなりました。

    apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver name: efs-csi-controller-sa namespace: kube-system ---
  3. 次の行を見つけます。クラスターが us-west-2 リージョンにない場合は、次のアドレスをリージョンアドレスに置き換えます。変更を行ったら、変更したマニフェストを保存します。

    image: 602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-efs-csi-driver:v
  4. マニフェストを適用します。

    kubectl apply -f driver.yaml

Amazon EFS ファイルシステムを作成する

Amazon EFS CSI ドライバーはAmazon EFS、アクセスポイントをサポートします。アクセスポイントはAmazon EFS、複数のポッド間でファイルシステムを簡単に共有できる、 ファイルシステムへのアプリケーション固有のエントリポイントです。アクセスポイントは、アクセスポイントを介して行われたすべてのファイルシステムリクエストに対してユーザー ID を適用し、各ポッドにルートディレクトリを適用できます。詳細についてはGitHub の「 Amazon EFS アクセスポイント」を参照してください。

重要

変数はステップ間で設定および使用されるため、同じターミナルで次のステップを完了する必要があります。

Amazon EFS クラスターの Amazon EKS ファイルシステムを作成するには

  1. クラスターがある VPC ID を取得し、後のステップで使用するために変数に保存します。を置き換える <cluster-name> ( を含む) <>) を選択します。

    vpc_id=$(aws eks describe-cluster \ --name <cluster-name> \ --query "cluster.resourcesVpcConfig.vpcId" \ --output text)
  2. クラスターの VPC の CIDR 範囲を取得し、後のステップで使用するために変数に保存します。

    cidr_range=$(aws ec2 describe-vpcs \ --vpc-ids $vpc_id \ --query "Vpcs[].CidrBlock" \ --output text)
  3. Amazon EFS マウントポイントのインバウンド NFS トラフィックを許可するインバウンドルールを持つセキュリティグループを作成します。

    1. セキュリティグループを作成します。の置き換え 値の例 独自の を使用します。

      security_group_id=$(aws ec2 create-security-group \ --group-name MyEfsSecurityGroup \ --description "My EFS security group" \ --vpc-id $vpc_id \ --output text)
    2. クラスターの VPC の CIDR からのインバウンド NFS トラフィックを許可するインバウンドルールを作成します。

      aws ec2 authorize-security-group-ingress \ --group-id $security_group_id \ --protocol tcp \ --port 2049 \ --cidr $cidr_range
      重要

      ファイルシステムへのアクセスをさらに制限するには、VPC の代わりにサブネットの CIDR を使用できます。

  4. Amazon EFS クラスターの Amazon EKS ファイルシステムを作成します。

    1. ファイルシステムを作成します。

      file_system_id=$(aws efs create-file-system \ --region us-west-2 \ --performance-mode generalPurpose \ --query 'FileSystemId' \ --output text)
    2. マウントターゲットを作成します。

      1. クラスターノードの IP アドレスを確認します。

        kubectl get nodes

        出力

        NAME STATUS ROLES AGE VERSION ip-192-168-56-0.us-west-2.compute.internal Ready <none> 19m v1.19.6-eks-49a6c0
      2. VPC 内のサブネットとサブネットがあるサブネットの IDs アベイラビリティーゾーン を確認します。

        aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=$vpc_id" \ --query 'Subnets[*].{SubnetId: SubnetId,AvailabilityZone: AvailabilityZone,CidrBlock: CidrBlock}' \ --output table

        出力

        | DescribeSubnets | +------------------+--------------------+----------------------------+ | AvailabilityZone | CidrBlock | SubnetId | +------------------+--------------------+----------------------------+ | us-west-2c | 192.168.128.0/19 | subnet-EXAMPLE6e421a0e97 | | us-west-2b | 192.168.96.0/19 | subnet-EXAMPLEd0503db0ec | | us-west-2c | 192.168.32.0/19 | subnet-EXAMPLEe2ba886490 | | us-west-2b | 192.168.0.0/19 | subnet-EXAMPLE123c7c5182 | | us-west-2a | 192.168.160.0/19 | subnet-EXAMPLE0416ce588p | | us-west-2a | 192.168.64.0/19 | subnet-EXAMPLE12c68ea7fb | +------------------+--------------------+----------------------------+
      3. ノードがあるサブネットのマウントターゲットを追加します。前の 2 つのステップの出力から、クラスターには IP アドレスが の 1 つのノードがあります192.168.56.0。その IP アドレスは、ID を持つサブネットCidrBlockの 内にありますsubnet-EXAMPLEe2ba886490。その結果、次のコマンドは、ノードが存在するサブネットのマウントターゲットを作成します。クラスターにさらにノードがある場合は、ノードがあった各 AZ のサブネットに対して コマンドを 1 回実行し、 を適切なサブネット ID subnet-EXAMPLEe2ba886490 に置き換えます。

        aws efs create-mount-target \ --file-system-id $file_system_id \ --subnet-id subnet-EXAMPLEe2ba886490 \ --security-groups $security_group_id

(オプション) サンプルアプリケーションをデプロイする

永続的ボリュームを動的に作成するサンプルアプリケーションをデプロイすることも、手動で永続的ボリュームを作成することもできます。

Dynamic
重要

Fargate ノードで動的プロビジョニングを使用することはできません。

Prerequisite

Amazon EFS CSI ドライバーのバージョン 2x 以降を使用する必要があります。これには、 1.17 以降のクラスターが必要です。クラスターを更新するには、「」クラスターの更新を参照してください。

コントローラーが作成する永続ボリュームを使用するサンプルアプリケーションをデプロイするには

この手順ではhttps://github.com/kubernetes-sigs/aws-efs-csi-driver/tree/master/examples/kubernetes/dynamic_provisioning、Container Storage Interface (CSI) ドライバー GitHub リポジトリのAmazon EFS動的プロビジョニングの例を使用します。EFS アクセスポイントと、ポッドによって消費される永続ボリューム要求 (VPC) を使用して、永続ボリュームを動的に作成します。

.

  1. EFS のストレージクラスを作成します。すべてのパラメータと設定オプションについてはGitHub のAmazon EFS「CSI ドライバー」を参照してください。

    1. StorageClassマニフェストをダウンロードAmazon EFSします。

      curl -o storageclass.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/storageclass.yaml
    2. ファイルを編集し、 の値を ファイルシステム ID fileSystemId に置き換えます。

    3. ストレージクラスをデプロイします。

      kubectl apply -f storageclass.yaml
  2. を利用する Pod をデプロイして自動プロビジョニングをテストしますPersistentVolumeClaim

    1. ポッドと PersistentVolumeClaim をデプロイするマニフェストをダウンロードします。

      curl -o pod.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/examples/kubernetes/dynamic_provisioning/specs/pod.yaml
    2. サンプルアプリケーションと Pod によって使用される PersistentVolumeClaim を使用してポッドをデプロイします。

      kubectl apply -f pod.yaml
  3. コントローラーを実行しているポッドの名前を確認します。

    kubectl get pods -n kube-system | grep efs-csi-controller

    出力

    efs-csi-controller-74ccf9f566-q5989 3/3 Running 0 40m efs-csi-controller-74ccf9f566-wswg9 3/3 Running 0 40m
  4. 数秒後、コントローラーが変更を取得するのを確認できます (読みやすくするために編集されています)。置換 74ccf9f566-q5989 前のコマンドからの出力のいずれかのポッドの値を持つ 。

    kubectl logs efs-csi-controller-74ccf9f566-q5989 \ -n kube-system \ -c csi-provisioner \ --tail 10

    出力

    ... 1 controller.go:737] successfully created PV pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca for PVC efs-claim and csi volume name fs-95bcec92::fsap-02a88145b865d3a87

    前の出力が表示されない場合は、他のいずれかのコントローラーポッドを使用して前のコマンドを実行します。

  5. ステータスが の永続的なボリュームが から Bound に作成されたことを確認しますPersistentVolumeClaim

    kubectl get pv

    出力

    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca 20Gi RWX Delete Bound default/efs-claim efs-sc 7m57s
  6. PersistentVolumeClaim 作成された の詳細を表示します。

    kubectl get pvc

    出力

    NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE efs-claim Bound pvc-5983ffec-96cf-40c1-9cd6-e5686ca84eca 20Gi RWX efs-sc 9m7s
  7. サンプルアプリポッドのステータスを表示します。

    kubectl get pods -o wide

    出力

    NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES efs-example 1/1 Running 0 10m 192.168.78.156 ip-192-168-73-191.us-west-2.compute.internal <none> <none>

    データがボリュームに書き込まれていることを確認します。

    kubectl exec efs-app -- bash -c "cat data/out"

    出力

    ... Tue Mar 23 14:29:16 UTC 2021 Tue Mar 23 14:29:21 UTC 2021 Tue Mar 23 14:29:26 UTC 2021 Tue Mar 23 14:29:31 UTC 2021 ...
  8. (オプション) ポッドが実行されているAmazon EKSノードを終了し、ポッドが再スケジュールされるのを待ちます。または、ポッドを削除して再デプロイすることもできます。ステップ 7 をもう一度実行し、出力に前の出力が含まれていることを確認します。

Static

作成した永続的ボリュームを使用するサンプルアプリケーションをデプロイするには

この手順ではhttps://github.com/kubernetes-sigs/aws-efs-csi-driver/tree/master/examples/kubernetes/multiple_pods、Container Storage Interface (CSI) GitHub リポジトリの Amazon EFSMultiple Pods Read Write Many の例を使用して、静的にプロビジョニングされたAmazon EFS永続ボリュームを消費しReadWriteMany、アクセスモードで複数のポッドからアクセスします。

  1. Amazon EFS コンテナストレージインターフェイス (CSI) ドライバー GitHub リポジトリをローカルシステムにクローンします。

    git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
  2. multiple_pods サンプルディレクトリに移動します。

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
  3. Amazon EFS ファイルシステム ID を取得します。これは Amazon EFS コンソールで確認するか、次の AWS CLI コマンドを使用します。

    aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text

    出力:

    fs-<582a03f3>
  4. specs/pv.yaml ファイルを編集し、volumeHandle 値を Amazon EFS ファイルシステム ID に置き換えます。

    apiVersion: v1 kind: PersistentVolume metadata: name: efs-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain storageClassName: efs-sc csi: driver: efs.csi.aws.com volumeHandle: fs-<582a03f3>
    注記

    Amazon EFS は伸縮自在なファイルシステムであるため、ファイルシステムの容量制限は強制されません。永続ボリュームと永続ボリュームクレームの実際のストレージ容量の値は、ファイルシステムを作成するときには使用されません。ただし、ストレージ容量は Kubernetes の必須フィールドであるため5Gi、この例では などの有効な値を指定する必要があります。この値は、Amazon EFS ファイルシステムのサイズを制限しません。

  5. efs-sc ディレクトリからefs-claim、ストレージクラス、efs-pv永続ボリュームクレーム、specsおよび永続ボリュームをデプロイします。

    kubectl apply -f specs/pv.yaml kubectl apply -f specs/claim.yaml kubectl apply -f specs/storageclass.yaml
  6. デフォルトの名前空間の永続的ボリュームを一覧表示します。default/efs-claim クレームがある永続的なボリュームを探します。

    kubectl get pv -w

    出力:

    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE efs-pv 5Gi RWX Retain Bound default/efs-claim efs-sc 2m50s

    STATUS が になるまで次のステップに進まないでくださいBound

  7. app1 ディレクトリから app2 および specs サンプルアプリケーションをデプロイします。

    kubectl apply -f specs/pod1.yaml kubectl apply -f specs/pod2.yaml
  8. デフォルトの名前空間のポッドを監視し、[] app1 および [] のapp2ポッドが [] STATUS になるまで待ちますRunning

    kubectl get pods --watch
    注記

    ポッドが Running ステータスになるまでに数分かかる場合があります。

  9. 永続的ボリュームの詳細を表示します。

    kubectl describe pv efs-pv

    出力:

    Name: efs-pv Labels: none Annotations: kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"efs-pv"},"spec":{"accessModes":["ReadWriteMany"],"capaci... pv.kubernetes.io/bound-by-controller: yes Finalizers: [kubernetes.io/pv-protection] StorageClass: efs-sc Status: Bound Claim: default/efs-claim Reclaim Policy: Retain Access Modes: RWX VolumeMode: Filesystem Capacity: 5Gi Node Affinity: none Message: Source: Type: CSI (a Container Storage Interface (CSI) volume source) Driver: efs.csi.aws.com VolumeHandle: fs-582a03f3 ReadOnly: false VolumeAttributes: none Events: none

    Amazon EFS ファイルシステム ID は VolumeHandle として表示されます。

  10. app1 ポッドがボリュームにデータを正常に書き込んでいることを確認します。

    kubectl exec -ti app1 -- tail /data/out1.txt

    出力:

    ... Mon Mar 22 18:18:22 UTC 2021 Mon Mar 22 18:18:27 UTC 2021 Mon Mar 22 18:18:32 UTC 2021 Mon Mar 22 18:18:37 UTC 2021 ...
  11. app2 ポッドに、ボリュームにapp1書き込んだボリュームの同じデータが表示されていることを確認します。

    kubectl exec -ti app2 -- tail /data/out1.txt

    出力:

    ... Mon Mar 22 18:18:22 UTC 2021 Mon Mar 22 18:18:27 UTC 2021 Mon Mar 22 18:18:32 UTC 2021 Mon Mar 22 18:18:37 UTC 2021 ...
  12. 実験が終了したら、このサンプルアプリケーションのリソースを削除してクリーンアップします。

    kubectl delete -f specs/

    また、作成したファイルシステムとセキュリティグループを手動で削除することもできます。