Amazon EBS CSI ドライバー - Amazon EKS

Amazon EBS CSI ドライバー

Amazon Elastic Block Store (Amazon EBS) Container Storage Interface (CSI) ドライバーは、Amazon Elastic Kubernetes Service (Amazon EKS) クラスターが永続的ボリュームの Amazon EBS ボリュームのライフサイクルを管理できるようにする CSI インターフェイスを提供します。

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

注記

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

すべての使用可能なパラメータの詳細と、ドライバーの機能を示す完全な例については、GitHub の「Amazon EBS Container Storage Interface (CSI) driver」プロジェクトを参照してください。

Prerequisites

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

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

    1. GitHub から IAM ポリシードキュメントをダウンロードします。

      curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v1.0.0/docs/example-iam-policy.json
    2. ポリシーを作成します。AmazonEKS_EBS_CSI_Driver_Policy を別の名前に変更できますが、変更する場合は、後の手順でも変更してください。

      aws iam create-policy \ --policy-name AmazonEKS_EBS_CSI_Driver_Policy \ --policy-document file://example-iam-policy.json
  2. IAM ロールを作成して、それに IAM ポリシーをアタッチします。eksctl または AWS CLI を使用できます。

    eksctl

    my-cluster をクラスター名に、111122223333をアカウント ID に置き換えます。

    eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster my-cluster \ --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --approve \ --override-existing-serviceaccounts

    作成したロールの ARN を取得し、後のステップで使用するために、返された値をメモします。

    aws cloudformation describe-stacks \ --stack-name eksctl-my-cluster-addon-iamserviceaccount-kube-system-ebs-csi-controller-sa \ --query='Stacks[].Outputs[?OutputKey==`Role1`].OutputValue' \ --output text

    出力

    arn:aws:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
    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/XXXXXXXXXX45D83924220DC4815XXXXX
    2. IAM ロールを作成します。

      1. 以下の内容を trust-policy.json というファイルにコピーします。111122223333 をアカウント ID に、REGION をリージョンに、XXXXXXXXXX45D83924220DC4815XXXXX を前のステップで返された値に置き換えます。

        { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.REGION.amazonaws.com/id/XXXXXXXXXX45D83924220DC4815XXXXX" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.REGION.amazonaws.com/id/XXXXXXXXXX45D83924220DC4815XXXXX:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] }
      2. ロールを作成する。AmazonEKS_EBS_CSI_DriverRole を別の名前に変更できますが、変更する場合は、後の手順でも変更してください。

        aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
    3. IAM ポリシーをロールにアタッチします。

      aws iam attach-role-policy \ --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
      region="BJS"aws iam attach-role-policy \ --policy-arn arn:aws-cn:iam::AWS_ACCOUNT_ID:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --role-name AmazonEKS_EBS_CSI_DriverRole
  3. ドライバーは、Helm またはマニフェストを使用してデプロイできます。

    Helm

    Helm V3 以降を使用して Amazon EBS CSI ドライバーをインストールします。Helm をインストールまたは更新するには、「Amazon EKS での Helm の使用」を参照してください。

    1. aws-ebs-csi-driver Helm リポジトリを追加します。

      helm repo add aws-ebs-csi-driver https://kubernetes-sigs.github.io/aws-ebs-csi-driver helm repo update
    2. Helm チャートを使用して、ドライバーのリリースをインストールします。クラスターが us-west-2 リージョンにない場合は、602401143452.dkr.ecr.us-west-2.amazonaws.com を、自分が使用しているリージョンでのコンテナイメージアドレスに変更します。

      helm upgrade -install aws-ebs-csi-driver aws-ebs-csi-driver/aws-ebs-csi-driver \ --namespace kube-system \ --set image.repository=602401143452.dkr.ecr.us-west-2.amazonaws.com/eks/aws-ebs-csi-driver \ --set enableVolumeResizing=true \ --set enableVolumeSnapshot=true \ --set serviceAccount.controller.create=true \ --set serviceAccount.controller.name=ebs-csi-controller-sa
    Manifest

    ドライバーをデプロイして、タグの有無にかかわらず、ボリュームを作成できます。

    • タグ付き — ドライバーをデプロイして、ユーザーが指定するタグを使用して作成される、すべての Amazon EBS ボリュームにタグ付けを行います。

      1. Amazon EBS Container Storage Interface (CSI) ドライバー GitHub リポジトリをコンピュータにクローンします。

        git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
      2. base の例のフォルダに移動します。

        cd aws-ebs-csi-driver/deploy/kubernetes/base/
      3. controller.yaml ファイルを編集します。以下のテキストを含むファイルのセクションを見つけて、そこに --extra-tags を追加します。次のテキストは、既存のテキストと追加されたテキストを含むファイルのセクションを示しています。この例では、コントローラーは、作成するすべてのボリュームに department および environment タグを追加します。

        ... containers: - name: ebs-plugin image: amazon/aws-ebs-csi-driver:latest imagePullPolicy: IfNotPresent args: # - {all,controller,node} # specify the driver mode - --endpoint=$(CSI_ENDPOINT) - --logtostderr - --v=5 - --extra-tags=department=accounting,environment=dev ...
      4. ecr フォルダに移動します。

        cd ../overlays/stable/ecr
        注記

        クラスターが us-west-2 リージョンにない場合は、kustomization.yaml ファイル内の 602401143452.dkr.ecr.us-west-2.amazonaws.com を、自分が使用するリージョンでのコンテナイメージのアドレスに変更します。

      5. 変更したマニフェストをクラスターに適用します。

        kubectl apply -k ../ecr
      6. 以前に作成した IAM ロールの ARN を使用して、ebs-csi-controller-sa Kubernetes サービスアカウントに注釈を付けます。前のステップでロール作成に使用したツールに一致するコマンドを使用します。111122223333 をアカウント ID に置き換えます。

        • eksctl を使用してロールを作成します。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
        • AWS CLI を使用して作成されたロール。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
      7. ドライバーポッドを削除します。ロールに割り当てられた IAM ポリシーの IAM アクセス許可を使用して、自動的に再デプロイされます。

        kubectl delete pods \ -n kube-system \ -l=app=ebs-csi-controller
    • タグなし — ドライバーをデプロイして、作成する Amazon EBS ボリュームにタグを付けないようにします。kustomization.yaml ファイルを手動で表示またはダウンロードするには、GitHub で file を参照してください。

      注記

      クラスターが us-west-2 リージョンにない場合は、kustomization.yaml ファイル内の 602401143452.dkr.ecr.us-west-2.amazonaws.com を、自分が使用するリージョンでのコンテナイメージのアドレスに変更し、マニフェストをローカルに適用する必要があります。

      1. マニフェストを適用する

        kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=master"
      2. 以前に作成した IAM ロールの ARN を使用して、ebs-csi-controller-sa Kubernetes サービスアカウントに注釈を付けます。前のステップでロール作成に使用したツールに一致するコマンドを使用します。111122223333 をアカウント ID に置き換えます。

        • eksctl を使用してロールを作成します。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/eksctl-my-cluster-addon-iamserviceaccount-kube-sy-Role1-1J7XB63IN3L6T
        • AWS CLI を使用して作成されたロール。

          kubectl annotate serviceaccount ebs-csi-controller-sa \ -n kube-system \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKS_EBS_CSI_DriverRole
      3. ドライバーポッドを削除します。ロールに割り当てられた IAM ポリシーの IAM アクセス許可を使用して、自動的に再デプロイされます。

        kubectl delete pods \ -n kube-system \ -l=app=ebs-csi-controller

サンプルアプリケーションをデプロイし、CSI ドライバーが動作していることを確認するには

この手順では、Amazon EBS Container Storage Interface (CSI) ドライバー GitHub リポジトリの動的ボリュームプロビジョニングの例を使用して、から、動的にプロビジョニングされた Amazon EBS ボリュームを消費します。GitHub の指示に従って、ボリュームスナップショットまたはボリュームのサイズ変更を使用するサンプルアプリケーションをデプロイできます。

  1. Amazon EBS Container Storage Interface (CSI) ドライバー GitHub リポジトリをローカルシステムにクローンします。

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

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. specs ディレクトリから、ebs-sc ストレージクラス、ebs-claim 永続ボリュームクレーム、および app サンプルアプリケーションをデプロイします。

    kubectl apply -f specs/
  4. ebs-sc ストレージクラスについて説明します。

    kubectl describe storageclass ebs-sc

    出力:

    Name: ebs-sc IsDefaultClass: No Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"ebs-sc"},"provisioner":"ebs.csi.aws.com","volumeBindingMode":"WaitForFirstConsumer"} Provisioner: ebs.csi.aws.com Parameters: <none> AllowVolumeExpansion: <unset> MountOptions: <none> ReclaimPolicy: Delete VolumeBindingMode: WaitForFirstConsumer Events: <none>

    このストレージクラスは WaitForFirstConsumer ボリュームバインドモードを使用していることに注意してください。つまり、ポッドが永続的ボリュームのクレームを行うまで、ボリュームは動的にプロビジョニングされません。詳細については、Kubernetes ドキュメントの「ボリュームバインドモード」を参照してください。

  5. デフォルトの名前空間のポッドを監視し、app ポッドのステータスが Running になるまで待ちます。

    kubectl get pods --watch

    Ctrl + C を入力して、シェルプロンプトに戻ります。

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

    kubectl get pv

    出力:

    NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a 4Gi RWO Delete Bound default/ebs-claim ebs-sc 30s
  7. 永続的ボリュームの詳細を表示し、pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a を前のステップの出力の値で置き換えます。

    kubectl describe pv pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a

    出力:

    Name: pvc-37717cd6-d0dc-11e9-b17f-06fad4858a5a Labels: <none> Annotations: pv.kubernetes.io/provisioned-by: ebs.csi.aws.com Finalizers: [kubernetes.io/pv-protection external-attacher/ebs-csi-aws-com] StorageClass: ebs-sc Status: Bound Claim: default/ebs-claim Reclaim Policy: Delete Access Modes: RWO VolumeMode: Filesystem Capacity: 4Gi Node Affinity: Required Terms: Term 0: topology.ebs.csi.aws.com/zone in [us-west-2d] Message: Source: Type: CSI (a Container Storage Interface (CSI) volume source) Driver: ebs.csi.aws.com VolumeHandle: vol-0d651e157c6d93445 ReadOnly: false VolumeAttributes: storage.kubernetes.io/csiProvisionerIdentity=1567792483192-8081-ebs.csi.aws.com Events: <none>

    Amazon EBS ボリューム ID は、前の出力の VolumeHandle の値です。

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

    kubectl exec -it app -- cat /data/out.txt

    出力:

    Wed May 5 16:17:03 UTC 2021 Wed May 5 16:17:08 UTC 2021 Wed May 5 16:17:13 UTC 2021 Wed May 5 16:17:18 UTC 2021 ...
  9. 実験が終了したら、このサンプルアプリケーションのリソースを削除してクリーンアップします。

    kubectl delete -f specs/