Amazon EKS で永続ストレージを使用する方法を教えてください。
Amazon Elastic Kubernetes Service (Amazon EKS) で永続ストレージを使用したいと考えています。
簡単な説明
Amazon EKS で永続ストレージを使用するには、以下のいずれかのオプションのステップを実行します。
- Amazon Elastic Block Store (Amazon EBS) コンテナストレージインターフェイス (CSI) ドライバー。
- Amazon Elastic File System (Amazon EFS) コンテナストレージインターフェイス (CSI) ドライバー。
**注:**ベストプラクティスとして、必ず最新バージョンのドライバーをインストールしてください。最新のドライバーをインストールする方法の手順については、GitHub ウェブサイトの「aws-ebs-csi-driver」と「aws-efs-csi-driver」を参照してください。
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。
前提条件:
- AWS CLI をインストールします。
- コマンドには kubectl バージョン 1.14 以降を使用してください。詳細については、「kubectl のインストールまたは更新」を参照してください。
- AWS Identity and Access Management (IAM) 権限を [作成] に設定します。次に、Amazon EKS ワーカーノードロール [CSI ドライバーロール] にポリシーをアタッチします。
- Amazon EKS クラスターを作成し、ワーカーノードをクラスターに組み入れます。
注: kubectl get nodes コマンドを実行して、ワーカーノードがクラスターにアタッチされていることを確認してください。 - 次のコマンドを実行して、クラスターに AWS IAM OpenID Connect (OIDC) プロバイダーが存在することを確認します。
注: your_cluster_name を自分のクラスター名に置き換えてください。aws eks describe-cluster --name your_cluster_name --query "cluster.identity.oidc.issuer" --output text
- IAM OIDC プロバイダーが設定されていることを確認するには、次のコマンドを実行します。
注: OIDC プロバイダーの ID を自分の OIDC ID に置き換えてください。「No OpenIDConnect provider found in your account」というエラーが表示された場合は、IAM OIDC プロバイダーを作成します。aws iam list-open-id-connect-providers | grep <ID of the oidc provider>
- eksctl をインストールするか、更新します。手順については、eksctl Webサイトの「インストール」を参照してください。
- IAM OIDC プロバイダーを作成するには、次のコマンドを実行します。
注: my-cluster を自分のクラスター名に置き換えてください。eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve
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 をご利用の AWS アカウント ID、YOUR_AWS_REGION をご利用の AWS リージョン、およびご利用の OIDC ID を OIDC ID に置き換えます。
-
AmazonEKS_EBS_CSI_DriverRole という名前の IAM ロールを作成します。
aws iam create-role --role-name AmazonEKS_EBS_CSI_DriverRole --assume-role-policy-document file://"trust-policy.json"
-
ドライバーの AWS マネージド IAM ポリシーを IAM ロールにアタッチします。
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --role-name AmazonEKS_EBS_CSI_DriverRole
-
Amazon EBS CSI ドライバーをデプロイします。
**注:**EBS CSI ドライバーをデプロイするには、Kustomize、Helm、または Amazon EKS マネージドアドオンを使用します。EBS CSI ドライバをデプロイする方法については、GitHub Web サイトへの「インストール」を参照してください。
Amazon EBS CSI ドライバーをテストする
Amazon EBS CSI ドライバーを、ポッドの動的プロビジョニングを使用するサンプルアプリケーションでテストします。Amazon EBS ボリュームはオンデマンドでプロビジョニングされます。
アマゾン EFS CSI ドライバー
**CSI ドライバーの 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
注: 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
注: YOUR_AWS_ACCOUNT_ID をご利用のアカウント ID に、YOUR_AWS_REGION をご利用の AWS リージョンに、XXXXXXXXXX45D83924220DC4815XXXXX をご利用のクラスターの OIDC プロバイダー ID に置き換えます。
-
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 サービスアカウントを作成します。
kubectl apply -f efs-service-account.yaml
**注:**efs-csi-controller-sa という名前の Kubernetes サービスアカウントには、作成した IAM ロールの注釈が付いています。
-
パブリック 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 プライベートまたはパブリックレジストリでインストールできます。EFS CSI ドライバーをインストールする方法については、GitHub ウェブサイトの「 AWS EFS CSI ドライバー」を参照してください。
-
ファイル public-ecr-driver.yaml を編集し、efs-csi-controller-sa の Kubernetes サービスアカウントセクションに作成した IAM ロールの ARN で注釈を付けます。
apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/name: aws-efs-csi-driver annotations: eks.amazonaws.com/role-arn: arn:aws:iam::<accountid>:role/AmazonEKS\_EFS\_CSI\_DriverRole name: efs-csi-controller-sa namespace: kube-system
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 を取得するには、次のコマンドを実行します。
注: your_cluster_name を自分のクラスター名に置き換えてください。aws eks describe-cluster --name your_cluster_name --query "cluster.resourcesVpcConfig.vpcId" --output text
- VPC クラスターの CIDR 範囲を取得するには、次のコマンドを実行します。
注: YOUR_VPC_ID をご使用の VPC ID に置き換えます。aws ec2 describe-vpcs --vpc-ids YOUR_VPC_ID --query "Vpcs[].CidrBlock" --output text
- Amazon EFS マウントポイントのインバウンドネットワークファイルシステム (NFS) トラフィックを許可するセキュリティグループを作成します。
注: YOUR_VPC_ID をご使用の VPC ID に置き換えます。後で使用するために、GroupId をメモしておきます。aws ec2 create-security-group --description efs-test-sg --group-name efs-sg --vpc-id YOUR_VPC_ID
- VPC 内のリソースが Amazon EFS ファイルシステムと通信できるように、NFS インバウンドルールを追加します。
注: YOUR_VPC_CIDR をご使用の VPC CIDR に、sg-xxx をご使用のセキュリティグループ ID に置き換えます。aws ec2 authorize-security-group-ingress --group-id sg-xxx --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR
- Amazon EKS クラスター用の Amazon EFS ファイルシステムを作成します。
**注:**後で使用できるように、FileSystemId をメモしておきます。aws efs create-file-system --creation-token eks-efs
- Amazon EFS のマウントターゲットを作成するには、次のコマンドを実行します。
**重要:**ワーカーノードが稼働しているアベイラビリティーゾーンの SubnetID を持つすべてのアベイラビリティーゾーンに対して前述のコマンドを実行します。FileSystemId をご使用の EFS ファイルシステムの ID に、sg-xxx をご使用のセキュリティグループの ID に、SubnetID をご使用のワーカーノードサブネットの ID に置き換えます。複数のサブネットにマウントターゲットを作成するには、各サブネット ID に対してコマンドを実行します。ワーカーノードが稼働している各アベイラビリティーゾーンにマウントターゲットを作成するのがベストプラクティスです。ワーカーノードが起動すべてのアベイラビリティーゾーンに対してマウントターゲットを作成できます。それによって、アベイラビリティーゾーン内のすべての Amazon Elastic Compute Cloud (Amazon EC2) インスタンスで、ファイルシステムを使用できます。aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-xxx
Amazon EFS CSI ドライバーをテストする
同じファイルに書き込む 2 つのポッドをデプロイするには、GitHub ウェブサイトの「Multiple Pods Read Write Many」を参照してください。
関連情報
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 2ヶ月前lg...
- AWS公式更新しました 10ヶ月前