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

最終更新日: 2020 年 2 月 3 日

Amazon Elastic Kubernetes Service (Amazon EKS) で永続的ストレージを使用したいです。

簡単な説明

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

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

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

注: この記事のコマンドには、kubectl バージョン 1.14 以降が必要です。使用している kubectl のバージョンを確認するには、kubectl version --client --short コマンドを実行します。

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

  1. AWS コマンドラインインターフェイス (AWS CLI) をインストールします
  2. ポリシーを作成して Amazon EKS ワーカーノードロール NodeInstanceRole にアタッチするための AWS Identity and Access Management (IAM) アクセス許可を設定します。
  3. Amazon EKS クラスターを作成し、ワーカーノードをクラスターに結合します。
    注: ワーカーノードがクラスターにアタッチされていることを確認するには、kubectl get nodes コマンドを実行します。

解決方法

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

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

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

2.    Amazon_EBS_CSI_Driver という IAM ポリシーを作成するには、次のコマンドを実行します。

aws iam create-policy --policy-name Amazon_EBS_CSI_Driver \--policy-document file://example-iam-policy.json

3.    新しい IAM ポリシーを NodeInstanceRole にアタッチするには、次のコマンドを実行します。

aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/Amazon_EBS_CSI_Driver \
--role-name eksctl-alb-nodegroup-ng-xxxxxx-NodeInstanceRole-xxxxxxxxxx

注: ポリシーの Amazon リソースネーム (ARN) を前のステップ 2 で作成したポリシーの ARN に置き換えます。ロール名を NodeInstanceRole に置き換えます。

4.    Amazon EBS CSI ドライバーをデプロイするには、次のコマンドを実行します。

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

次に、オプション A: Amazon EBS CSI ドライバーをテストするセクション のステップを実行します。

オプション A: 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 specs/

注: kubectl コマンドにより、StorageClassPersistentVolumeClaim (PVC)、およびポッドが作成されます。ポッドは PVC を参照します。Amazon EBS ボリュームは、ポッドの作成時にのみプロビジョニングされます。

4.    PVC を参照するポッドの結果として作成された永続ボリュームを表示するには、次のコマンドを実行します。

kubectl get persistentvolumes

5.    永続ボリュームに関する情報を表示するには、次のコマンドを実行します。

kubectl describe persistentvolumes pv_name

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

6.    ポッドが正常にボリュームにデータを書き込んでいることを確認するには、次のコマンドを実行します。

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

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

オプション B: 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/?ref=master"

2.    Amazon EKS クラスターの VPC ID を取得するには、次のコマンドを実行します。

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

3.    VPC クラスターの CIDR 範囲を取得するには、次のコマンドを実行します。

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

注: VPC 名を VPC ID に置き換えます。

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

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

注: VPC_ID を前のステップ 2 の出力に置き換えます。後で使用できるように、GroupId を保存します。

5.    NFS インバウンドルールを追加して、VPC のリソースが EFS と通信できるようにするには、次のコマンドを実行します。

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

注: VPC_CIDR を前のステップ 3 の出力に置き換えます。

6.    Amazon EKS クラスターの Amazon EFS ファイルシステムを作成するには、次のコマンドを実行します。

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

注: 後で使用できるように、FileSystemId をメモします。

7.    EFS のマウントターゲットを作成するには、ワーカーノードが実行されているすべてのアベイラビリティーゾーンで次のコマンドを実行します。

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

注: FileSystemIdSubnetIDGroupId を前のステップ 6 と 7 で作成した FileSystemId に置き換えます。

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

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

次に、オプション B: EFS CSI Driver をテストするセクションのステップを完了します。

オプション B: 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

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

4.    specs/pv.yaml ファイルを編集し、spec.sci.volumeHandle の値を前のステップの Amazon EFS FileSystemId に置き換えます。

5.    テストに必要な Kubernetes リソースを作成するには、次のコマンドを実行します。

kubectl apply -f specs/

注: 前のステップ 5 の kubectl コマンドは、Amazon EFS ストレージクラス、PVC、永続ボリューム、および 2 つのポッド (app1 および app2) を作成します。

6.    2 つのポッドがファイルにデータを書き込んでいるかどうかをテストするには、約 1 分間待ってから、次のコマンドを実行します。

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

出力には、2 つのポッドによって /data/out1.txt に書き込まれた現在の日付が表示されます。


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

改善できることはありますか?


さらにサポートが必要な場合