Amazon EKS で永続的ストレージを使用するにはどうすればよいですか?

最終更新日: 2022 年 5 月 10 日

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 driver」および「Amazon EFS CSI driver」を参照してください。

解決方法

注: AWS Command Line Interface (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

いずれかのセクションのステップを完了する前に、次の操作を実行する必要があります。

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

2.    Amazon EKS ワーカーノードロール CSI Driver Role へのポリシーを添付するための AWS Identity and Access Management (IAM) アクセス許可を設定します。

3.    Amazon EKS クラスターを作成し、ワーカーノードをクラスターに参加させます

4.    クラスター用に既存の IAM OpenID Connect (OIDC) プロバイダーを用意します。クラスターが既に存在しているかどうかを確認し、またはクラスターを作成するには、「クラスターの IAM OIDC プロバイダーを作成するには」を参照してください。

注: ワーカーノードがクラスターにアタッチされていることを確認するには、kubectl get nodes コマンドを実行します。

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

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

1.    ワーカーノードが Amazon EBS ボリュームを作成および変更できるようにするアクセス許可を持つ IAM ポリシーの例をダウンロードします。

curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v0.9.0/docs/example-iam-policy.json

2.    Amazon_EBS_CSI_Driver という IAM ポリシーを作成します。

aws iam create-policy --policy-name AmazonEKS_EBS_CSI_Driver_Policy --policy-document file://example-iam-policy.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 信頼ポリシーファイルを作成します。

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:ebs-csi-controller-sa"
        }
      }
    }
  ]
}
EOF

注: ステップ 4 で、YOUR_AWS_ACCOUNT_ID を、使用しているアカウント ID に置き換えます。YOUR_AWS_REGION の部分は、ご利用の AWS リージョンで置き換えます。XXXXXXXXXX45D83924220DC4815XXXXX を、ステップ 3 で返された値に置き換えます。

5.    以下のように、IAM ロールを作成します。

aws iam create-role \
  --role-name AmazonEKS_EBS_CSI_DriverRole \
  --assume-role-policy-document file://"trust-policy.json"

6.    新しい IAM ポリシーをロールにアタッチします。

aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_EBS_CSI_Driver_Policy \
--role-name AmazonEKS_EBS_CSI_DriverRole

7.    Amazon EBS CSI ドライバーをデプロイするには、ご利用のリージョンに基づいて次のいずれかのコマンドを実行します。

中国リージョン以外のすべてのリージョン:

kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable/?ref=master"

中国 (北京と寧夏) リージョン:

kubectl apply -k "github.com/kubernetes-sigs/aws-ebs-csi-driver/deploy/kubernetes/overlays/stable-cn/?ref=master"

8.    ebs-csi-controller-sa Kubernetes サービスアカウントに、前に作成した IAM ロールの Amazon リソースネーム (ARN) の注釈を付けます。

kubectl annotate serviceaccount ebs-csi-controller-sa \
  -n kube-system \
  eks.amazonaws.com/role-arn=arn:aws:iam::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EBS_CSI_DriverRole

注: YOUR_AWS_ACCOUNT_ID を、使用しているアカウント ID に置き換えます。

9.    ドライバーポッドを削除します。

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

: ドライバーポッドは、ロールに割り当てられた IAM ポリシーの IAM アクセス許可で自動的に再デプロイされます。詳細については、Amazon EBS CSI ドライバーを参照してください。

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 (Kubernetes ウェブサイトから)、PersistentVolumeClaim (PVC) (Kubernetes ウェブサイトから)、およびポッドを作成します。ポッドは PVC を参照します。Amazon EBS ボリュームは、ポッドの作成時にのみプロビジョニングされます。

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.    GitHub から IAM ポリシードキュメントをダウンロードします。

curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/v1.2.0/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.    Kubernetes サービスアカウントに IAM ロール ARN、IAM ロールに Kubernetes サービスアカウント名の注釈を付けます。例:

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.    作成した IAM ロールの ARN の注釈付きの Kubernetes サービスアカウントを作成します。例:

cat << EOF > 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::YOUR_AWS_ACCOUNT_ID:role/AmazonEKS_EFS_CSI_DriverRole
EOF

注: YOUR_AWS_ACCOUNT_ID を、使用しているアカウント ID に置き換えます。

8.    マニフェストを適用します。

kubectl apply -f efs-service-account.yaml

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

Amazon EFS CSI ドライバーにより、ReadWriteMany モードで複数のポッドが 1 つのボリュームに同時に書き込むことができます。

1.    Amazon EFS CSI ドライバーをデプロイするには、リージョンまたはクラスターの種類に基づいて次のいずれかのコマンドを実行します。

中国リージョン以外のすべてのリージョン:

kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/ecr/?ref=release-1.1"

中国 (北京と寧夏) リージョン:

kubectl apply -k "github.com/kubernetes-sigs/aws-efs-csi-driver/deploy/kubernetes/overlays/stable/?ref=release-1.1"

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

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

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

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

注: ステップ 2 で、your_cluster_name を、使用しているクラスター名に置き換えます。

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

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

注意: 手順 3 で、YOUR_VPC_ID を、前の手順 2 の VPC ID に置き換えます。

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

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

注意: YOUR_VPC_ID を前の手順 2 の出力に置き換えます。後で使用できるように、GroupId を保存します。

5.    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 を、前のステップ 3 の出力に置き換えます。sg-xxx を、前のステップ 4 のセキュリティグループ ID に置き換えます。

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

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

注意: 後で使用できるように、FileSystemId を保存します。

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

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

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

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

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

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

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

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 つのポッド (app1 および app2) を作成します。

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

kubectl get pv -w

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 に書き込まれた現在の日付が表示されます。


この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?