Amazon EKS で永続ストレージを使用する方法を教えてください。

所要時間5分
0

Amazon Elastic Kubernetes Service (Amazon EKS) で永続ストレージを使用したいと考えています。

簡単な説明

次のいずれかのオプションを使用して、Amazon EKS に永続ストレージをセットアップします。

これらのオプションのどれかを使用するには、次のいずれかのセクションのステップを実行します。

  • オプション A: Amazon EBS CSI ドライバーをデプロイしてテストする
  • オプション B: Amazon EFS CSI ドライバーをデプロイしてテストする

この記事のコマンドには、kubectl バージョン 1.14 以降が必要です。お使いの kubectl のバージョンを確認するには、次のコマンドを実行します。

kubectl version --client --short

: ベストプラクティスとして、必ず最新バージョンのドライバーをインストールしてください。詳細については、GitHub リポジトリの 「Amazon EBS CSI ドライバー」および「Amazon EFS CSI ドライバー」のページを参照してください。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、使用している AWS CLI が、最新バージョンであることを確認してください

どちらのセクションであっても、手順を完了する前に次のことを行う必要があります。

  1. AWS CLI をインストールします。

  2. ポリシーを作成して、Amazon EKS ワーカーノードロール CSI ドライバーロールにアタッチするために、AWS Identity and Access Management (IAM) 権限を設定します。
    注: 以下のセクションのコマンドでは、常に --region 変数を使用するとは限りません。--region を使用しない場合、コマンドは AWS リージョンのデフォルト値を使用します。AWS CLI configure コマンドを実行すると、デフォルト値を確認することができます。

  3. Amazon EKS クラスターを作成し、ワーカーノードをクラスターに組み入れます。
    注: kubectl get nodes コマンドを実行して、ワーカーノードがクラスターにアタッチされていることを確認してください。

  4. 次のコマンドを実行して、クラスターに AWS IAM OpenID Connect (OIDC) プロバイダーが存在することを確認します。

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

    注: your_cluster_name を自分のクラスター名に置き換えてください。

  5. IAM OIDC プロバイダーが設定されていることを確認します。

    aws iam list-open-id-connect-providers | grep OIDC_PROVIDER_ID

    注: OIDC プロバイダーの ID を自分の OIDC ID に置き換えてください。「No OpenIDConnect provider found in your account」というエラーが表示された場合は、IAM OIDC プロバイダーを作成する必要があります。

  6. eksctl をインストールするか、更新します。

  7. IAM OIDC プロバイダーを作成します。

    eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve

    注: my-cluster を自分のクラスター名に置き換えてください。

オプション A: Amazon EBS CSI ドライバーをデプロイしてテストする

Amazon EBS CSI ドライバーをデプロイします:

  1. 次の例のように IAM 信頼ポリシーファイルを作成します。

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/YOUR_OIDC ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:aud": "sts.amazonaws.com",
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    注: YOUR_AWS_ACCOUNT_ID は自分のアカウント ID に置き換えてください。YOUR_AWS_REGION は自分のリージョンに置き換えてください。自分の OIDC ID は IAM OIDC プロバイダーを作成したときの出力に置き換えてください。

  2. Amazon_EBS_CSI_Driverという名前の IAM ロールを作成します。

    aws iam create-role \
     --role-name AmazonEKS_EBS_CSI_Driver \
     --assume-role-policy-document file://"trust-policy.json"
  3. 作成した IAM ロールに、EBS CSI ドライバーの AWS マネージド IAM ポリシーをアタッチします。

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
    --role-name AmazonEKS_EBS_CSI_Driver
  4. Amazon EBS CSI ドライバーをデプロイします。

    aws eks create-addon \
     --cluster-name my-cluster \
     --addon-name aws-ebs-csi-driver \
     --service-account-role-arn arn:aws:iam::
    YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole

    注: my-cluster をクラスター名で、YOUR_AWS_ACCOUNT_ID をアカウント ID で置き換えてください。

    EBS CSI ドライバーは、Kustomize、Helm、または Amazon EKS マネージドアドオンを使用してデプロイできます。この例では、Amazon EKS アドオン機能を使用してドライバーをデプロイします。詳細については、GitHub の「aws-ebs-csi-driver インストールガイド」を参照してください。

  5. EBS CSI ドライバーが正常にインストールされたことを確認します。

    eksctl get addon --cluster my-cluster | grep ebs

    インストールに成功すると、次の出力が返されます。

    aws-ebs-csi-driver    v1.20.0-eksbuild.1    ACTIVE    0    arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_Driver

Amazon EBS CSI ドライバーをテストします:

Amazon EBS CSI ドライバーは、ポッドの動的プロビジョニングを使用するサンプルアプリケーションでテストできます。Amazon EBS ボリュームはオンデマンドでプロビジョニングされます。

  1. AWS GitHub から aws-ebs-csi-driver リポジトリのクローンを作成します。

    git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
  2. 作業ディレクトリを、Amazon EBS ドライバーテストファイルがあるフォルダーに変更します。

    cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
  3. テストに必要な Kubernetes リソースを作成します。

    kubectl apply -f manifests/

    注: kubectl コマンドで、StorageClass、PersistentVolumeClaim(PVC)、およびポッドが作成されます。このポッドは PVC を参照します。Amazon EBS ボリュームは、ポッドが作成されたときにのみプロビジョニングされます。詳細については、Kubernetes ウェブサイトの「ストレージクラス」と「PersistentVolumeClaims」を参照してください。

  4. ebs-sc ストレージクラスを記述します。

    kubectl describe storageclass ebs-sc
  5. デフォルトの名前空間でポッドを監視し、アプリポッドのステータスが Running に変わるのを待ちます。例:

    kubectl get pods --watch
  6. PVC を参照するポッドのために作成された永続ボリュームを表示します。

    kubectl get pv
  7. 永続ボリュームに関する情報を表示します。

    kubectl describe pv your_pv_name

    注: your_pv_name を、前のセクションのステップ 6 で返された永続ボリュームの名前に置き換えます。出力の Source.VolumeHandle プロパティの値は、アカウントで作成された物理的な Amazon EBS ボリュームの ID です。

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

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

    注: コマンド出力には、/data/out.txt ファイルに保存されている現在の日付と時刻が表示されます。このファイルに保存されるのは、曜日、月、日付、時刻です。

オプション B: Amazon EFS CSI ドライバーをデプロイしてテストする

CSI ドライバーをデプロイする前に、CSI ドライバーのサービスアカウントに、ユーザーに代わって AWS API を呼び出すことを許可する IAM ロールを作成します。

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

    curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
  2. IAM ポリシーを作成します。

    aws iam create-policy \
        --policy-name AmazonEKS_EFS_CSI_Driver_Policy \
        --policy-document file://iam-policy-example.json
  3. 次のコマンドを実行して、クラスターの OIDC プロバイダー URL を確認します。

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

    **注:**ステップ 3 で、your_cluster_name を自分のクラスター名に置き換えてください。

  4. 次の IAM 信頼ポリシーを作成してから、Kubernetes サービスアカウントに AssumeRoleWithWebIdentity アクションの実行を認めます。

    cat <<EOF > trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::YOUR_AWS_ACCOUNT_ID:oidc-provider/oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/<XXXXXXXXXX45D83924220DC4815XXXXX>:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    **注:**ステップ 4 で、YOUR_AWS_ACCOUNT_ID を自分のアカウント ID に置き換えてください。YOUR_AWS_REGION は自分のリージョンに置き換えてください。XXXXXXXXXX45D83924220DC4815XXXXX は、ステップ 3 で返された値に置き換えてください。

  5. IAM ロールを作成します。

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

    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
  7. 以下の内容を efs-service-account.yamlという名前のファイルに保存します。

    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::<AWS_ACCOUNT_ID>:role/AmazonEKS_EFS_CSI_DriverRole
  8. クラスターに Kubernetes サービスアカウントを作成します。efs-csi-controller-sa という名前の Kubernetes サービスアカウントには、作成した IAM ロールの注釈が付いています。

    kubectl apply -f efs-service-account.yaml
  9. マニフェストをダウンロードして、パブリック Amazon ECR レジストリに保存されているイメージを使用してドライバーをインストールします。

    kubectl kustomize "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.5" > public-ecr-driver.yaml

    **注:**EFS CSI ドライバーは Helm および Kustomize を使用して AWS プライベートまたはパブリックレジストリでインストールできます。詳細については、Amazon EFS CSI ドライバーのドキュメントを参照してください。

    次に、public-ecr-driver.yaml ファイルを編集して efs-csi-controller-sa マニフェストを削除します。

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      labels:
        app.kubernetes.io/name: aws-efs-csi-driver
      name: efs-csi-controller-sa
      namespace: kube-system

Amazon EFS CSI ドライバーをデプロイする

Amazon EFS CSI ドライバーにより、ReadWriteMany モードで複数のポッドが同時にボリュームに書き込めるようになります。

  1. Amazon EFS CSI ドライバーをデプロイするには、マニフェストを適用します。

    kubectl apply -f public-ecr-driver.yaml
  2. クラスターに AWS Fargate ポッドのみ (ノードなし) が含まれている場合は、以下のコマンド (すべてのリージョン) を使用してドライバーをデプロイします。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml

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

  1. Amazon EKS クラスターの VPC ID を取得します。

    aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text

    **注:**ステップ 3 で、your_cluster_name を自分のクラスター名に置き換えてください。

  2. VPC クラスターの CIDR 範囲を取得します。

    aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text

    **注:**ステップ 4 では、YOUR_VPC_ID を前のセクションのステップ 3 の VPC ID に置き換えてください。

  3. Amazon EFS マウントポイントのインバウンドネットワークファイルシステム (NFS) トラフィックを許可するセキュリティグループを作成します。

    aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID

    **注:**YOUR_VPC_ID を前のセクションのステップ 3 の出力に置き換えてください。GroupId は後で使用できるように保存してください。

  4. VPC 内のリソースが Amazon EFS ファイルシステムと通信できるように、NFS インバウンドルールを追加します。

    aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR

    **注:**YOUR_VPC_CIDR を前のセクションのステップ 4 の出力に置き換えてください。sg-xxx を前のセクションのステップ 5 のセキュリティグループ ID に置き換えてください。

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

    aws efs create-file-system --creation-token eks-efs

    **注:**後で使用できるように、FileSystemId を保存してください。

  6. Amazon EFS のマウントターゲットを作成するには、次のコマンドを実行します。

    aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-xxx

    **重要:このコマンドは、**ワーカーノードが稼働しているアベイラビリティーゾーンの SubnetID を持つすべてのアベイラビリティーゾーンに対して必ず実行してください。FileSystemId を、前のセクション (Amazon EFS ファイルシステムを作成した場所) のステップ 7 の出力に置き換えてください。sg-xxx は、(セキュリティグループを作成した) 前述のステップ 5 の出力に置き換えてください。SubnetID は、ワーカーノードが使用するサブネットに置き換えてください。複数のサブネットにマウントターゲットを作成するには、サブネット ID ごとにステップ 8 のコマンドを個別に実行する必要があります。ワーカーノードが稼働している各アベイラビリティーゾーンにマウントターゲットを作成するのがベストプラクティスです。

    **注:**ワーカーノードが起動すべてのアベイラビリティーゾーンに対してマウントターゲットを作成できます。それによって、マウントターゲットが作成されたアベイラビリティーゾーン内のすべての Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで、ファイルシステムを使用できます。

Amazon EFS ファイルシステムとそのマウントターゲットが実行され、クラスター内のポッドで使用できる状態になりました。

Amazon EFS CSI ドライバーをテストする

同じファイルに書き込む 2 つのポッドをデプロイすることで、Amazon EFS CSI ドライバーをテストできます。

  1. AWS GitHub から aws-efs-csi-driver リポジトリのクローンを作成します。

    git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
  2. 作業ディレクトリを、Amazon EFS CSI ドライバーテストファイルがあるフォルダーに変更します。

    cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
  3. 以前に作成した Amazon EFS ファイルシステム ID を取得します。

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

    注: ステップ 3 のコマンドで複数の結果が返る場合は、以前に保存した Amazon EFS ファイルシステム ID を使用できます。

  4. specs/pv.yaml ファイルで、spec.csi.volumeHandle の値を前のステップで使った Amazon EFS FileSystemId に置き換えます。

  5. テストに必要な Kubernetes リソースを作成します。

    kubectl apply -f specs/

    注: 前述のステップ 5 の kubectl コマンドで、Amazon EFS ストレージクラス、PVC、永続ボリューム、および 2 つのポッド (app1app2) が作成されます。

  6. デフォルト名前空間の永続ボリュームを一覧表示し、default/efs-claim クレームの付いた永続ボリュームを探します。

    kubectl get pv efs-pv
  7. 永続ボリュームについて記述します。

    kubectl describe pv efs-pv
  8. 2 つのポッドでファイルにデータが書き込まれているかどうかをテストします。

    kubectl exec -it app1 -- tail /data/out1.txt  
    kubectl exec -it app2 -- tail /data/out1.txt

    1 分ほど待ちます。出力には、両方のポッドによって /data/out1.txt に書き込まれた現在の日付が表示されます。

    関連情報

    Amazon EFS のトラブルシューティング

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ