Amazon EKS で永続ストレージを使用する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) で永続ストレージを使用したいと考えています。
簡単な説明
次のいずれかのオプションを使用して、Amazon EKS に永続ストレージをセットアップします。
- Amazon Elastic Block Store (Amazon EBS) コンテナストレージインターフェイス (CSI) ドライバー
- Amazon Elastic File System (Amazon EFS) コンテナストレージインターフェイス (CSI) ドライバー
これらのオプションのどれかを使用するには、次のいずれかのセクションのステップを実行します。
- オプション 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 が、最新バージョンであることを確認してください。
どちらのセクションであっても、手順を完了する前に次のことを行う必要があります。
-
AWS CLI をインストールします。
-
ポリシーを作成して、Amazon EKS ワーカーノードロール CSI ドライバーロールにアタッチするために、AWS Identity and Access Management (IAM) 権限を設定します。
注: 以下のセクションのコマンドでは、常に --region 変数を使用するとは限りません。--region を使用しない場合、コマンドは AWS リージョンのデフォルト値を使用します。AWS CLI configure コマンドを実行すると、デフォルト値を確認することができます。 -
Amazon EKS クラスターを作成し、ワーカーノードをクラスターに組み入れます。
注: kubectl get nodes コマンドを実行して、ワーカーノードがクラスターにアタッチされていることを確認してください。 -
次のコマンドを実行して、クラスターに AWS IAM OpenID Connect (OIDC) プロバイダーが存在することを確認します。
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
注: your_cluster_name を自分のクラスター名に置き換えてください。
-
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 プロバイダーを作成する必要があります。
-
IAM OIDC プロバイダーを作成します。
eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve
注: my-cluster を自分のクラスター名に置き換えてください。
オプション A: Amazon EBS CSI ドライバーをデプロイしてテストする
Amazon EBS CSI ドライバーをデプロイします:
-
次の例のように 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 プロバイダーを作成したときの出力に置き換えてください。
-
Amazon_EBS_CSI_Driverという名前の IAM ロールを作成します。
aws iam create-role \ --role-name AmazonEKS_EBS_CSI_Driver \ --assume-role-policy-document file://"trust-policy.json"
-
作成した 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
-
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 インストールガイド」を参照してください。
-
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 ボリュームはオンデマンドでプロビジョニングされます。
-
AWS GitHub から aws-ebs-csi-driver リポジトリのクローンを作成します。
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
-
作業ディレクトリを、Amazon EBS ドライバーテストファイルがあるフォルダーに変更します。
cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/
-
テストに必要な Kubernetes リソースを作成します。
kubectl apply -f manifests/
注: kubectl コマンドで、StorageClass、PersistentVolumeClaim(PVC)、およびポッドが作成されます。このポッドは PVC を参照します。Amazon EBS ボリュームは、ポッドが作成されたときにのみプロビジョニングされます。詳細については、Kubernetes ウェブサイトの「ストレージクラス」と「PersistentVolumeClaims」を参照してください。
-
ebs-sc ストレージクラスを記述します。
kubectl describe storageclass ebs-sc
-
デフォルトの名前空間でポッドを監視し、アプリポッドのステータスが Running に変わるのを待ちます。例:
kubectl get pods --watch
-
PVC を参照するポッドのために作成された永続ボリュームを表示します。
kubectl get pv
-
永続ボリュームに関する情報を表示します。
kubectl describe pv your_pv_name
注: your_pv_name を、前のセクションのステップ 6 で返された永続ボリュームの名前に置き換えます。出力の Source.VolumeHandle プロパティの値は、アカウントで作成された物理的な Amazon EBS ボリュームの ID です。
-
ポッドでボリュームにデータが書き込まれていることを確認します。
kubectl exec -it app -- cat /data/out.txt
注: コマンド出力には、/data/out.txt ファイルに保存されている現在の日付と時刻が表示されます。このファイルに保存されるのは、曜日、月、日付、時刻です。
オプション B: Amazon EFS CSI ドライバーをデプロイしてテストする
CSI ドライバーをデプロイする前に、CSI ドライバーのサービスアカウントに、ユーザーに代わって AWS API を呼び出すことを許可する IAM ロールを作成します。
-
IAM ポリシードキュメントを GitHub からダウンロードします。
curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
-
IAM ポリシーを作成します。
aws iam create-policy \ --policy-name AmazonEKS_EFS_CSI_Driver_Policy \ --policy-document file://iam-policy-example.json
-
次のコマンドを実行して、クラスターの OIDC プロバイダー URL を確認します。
aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
**注:**ステップ 3 で、your_cluster_name を自分のクラスター名に置き換えてください。
-
次の 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 で返された値に置き換えてください。
-
IAM ロールを作成します。
aws iam create-role \ --role-name AmazonEKS_EFS_CSI_DriverRole \ --assume-role-policy-document file://"trust-policy.json"
-
新しい 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
-
以下の内容を 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
-
クラスターに Kubernetes サービスアカウントを作成します。efs-csi-controller-sa という名前の Kubernetes サービスアカウントには、作成した IAM ロールの注釈が付いています。
kubectl apply -f efs-service-account.yaml
-
マニフェストをダウンロードして、パブリック 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 モードで複数のポッドが同時にボリュームに書き込めるようになります。
-
Amazon EFS CSI ドライバーをデプロイするには、マニフェストを適用します。
kubectl apply -f public-ecr-driver.yaml
-
クラスターに AWS Fargate ポッドのみ (ノードなし) が含まれている場合は、以下のコマンド (すべてのリージョン) を使用してドライバーをデプロイします。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/deploy/kubernetes/base/csidriver.yaml
Amazon EFS ファイルシステムを作成する
-
Amazon EKS クラスターの VPC ID を取得します。
aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text
**注:**ステップ 3 で、your_cluster_name を自分のクラスター名に置き換えてください。
-
VPC クラスターの CIDR 範囲を取得します。
aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text
**注:**ステップ 4 では、YOUR_VPC_ID を前のセクションのステップ 3 の VPC ID に置き換えてください。
-
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 は後で使用できるように保存してください。
-
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 に置き換えてください。
-
Amazon EKS クラスター用の Amazon EFS ファイルシステムを作成します。
aws efs create-file-system --creation-token eks-efs
**注:**後で使用できるように、FileSystemId を保存してください。
-
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 ドライバーをテストできます。
-
AWS GitHub から aws-efs-csi-driver リポジトリのクローンを作成します。
git clone https://github.com/kubernetes-sigs/aws-efs-csi-driver.git
-
作業ディレクトリを、Amazon EFS CSI ドライバーテストファイルがあるフォルダーに変更します。
cd aws-efs-csi-driver/examples/kubernetes/multiple_pods/
-
以前に作成した Amazon EFS ファイルシステム ID を取得します。
aws efs describe-file-systems --query "FileSystems[*].FileSystemId" --output text
注: ステップ 3 のコマンドで複数の結果が返る場合は、以前に保存した Amazon EFS ファイルシステム ID を使用できます。
-
specs/pv.yaml ファイルで、spec.csi.volumeHandle の値を前のステップで使った Amazon EFS FileSystemId に置き換えます。
-
テストに必要な Kubernetes リソースを作成します。
kubectl apply -f specs/
注: 前述のステップ 5 の kubectl コマンドで、Amazon EFS ストレージクラス、PVC、永続ボリューム、および 2 つのポッド (app1 と app2) が作成されます。
-
デフォルト名前空間の永続ボリュームを一覧表示し、default/efs-claim クレームの付いた永続ボリュームを探します。
kubectl get pv efs-pv
-
永続ボリュームについて記述します。
kubectl describe pv efs-pv
-
2 つのポッドでファイルにデータが書き込まれているかどうかをテストします。
kubectl exec -it app1 -- tail /data/out1.txt kubectl exec -it app2 -- tail /data/out1.txt
1 分ほど待ちます。出力には、両方のポッドによって /data/out1.txt に書き込まれた現在の日付が表示されます。
関連情報
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 4年前lg...
- 質問済み 8ヶ月前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 2ヶ月前