スキップしてコンテンツを表示

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

所要時間4分
0

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

簡単な説明

Amazon EKS で永続ストレージを使用するには、以下のいずれかのオプションのステップを実行します。

注: セキュリティと効率の観点から、Amazon EKS アドオンを使用してCSI ドライバーをインストールすることをおすすめします。また、最新バージョンのドライバーのインストールが推奨されます。インストール手順と最新のドライバーバージョンについては、GitHub のウェブサイトで aws-ebs-csi-driver または aws-efs-csi-driver を参照してください。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

前提条件:

  • 使用する Kubernetes のバージョンに合った kubectl バージョンを設定すること。バージョンスキューの要件については、Kubernetes のウェブサイトで kubectl を参照してください。

  • eksctl をインストールするか、更新します。手順については、eksctl のウェブサイトで「インストール」を参照してください。

  • AWS Identity and Access Management (IAM) の Create 権限を設定します。次に、ポリシーを CSI ドライバーまたは Amazon EKS ワーカーノードのロールにアタッチします。

  • Amazon EKS クラスターを作成し、ワーカーノードをクラスターに結合します。ワーカーノードがクラスターにアタッチされたかどうかを確認するには、次のコマンドを実行します。

    kubectl get nodes
  • クラスターに IAM OpenID Connect (OIDC) プロバイダーが存在することを確認するには、次の AWS CLI コマンド describe-cluster を実行します。

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

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

  • IAM OIDC プロバイダーが設定済みかどうかを確認するには、次の list-open-id-connect-providers コマンドを実行します。

    aws iam list-open-id-connect-providers | grep OIDC-ID

    注: OIDC-ID を実際の OIDC プロバイダー ID に置き換えてください。エラーメッセージ が表示される場合は、IAM OIDC プロバイダーを作成"No OpenIDConnect provider found in your account"します。

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/OIDC-ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:aud": "sts.amazonaws.com",
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    注: YOUR_AWS_ACCOUNT_ID を AWS アカウント ID に、YOUR_AWS_REGION を使用する AWS リージョンに、OIDC-ID を OIDC プロバイダー ID に置き換えてください。

  2. 次の create-role コマンドを実行し、AmazonEKS_EBS_CSI_DriverRole という IAM ロールを作成します。

    aws iam create-role
     --role-name AmazonEKS_EBS_CSI_DriverRole
     --assume-role-policy-document file://"trust-policy.json"
  3. CSI ドライバーの AWS マネージド IAM ポリシーを IAM ロールにアタッチするには、次の attach-role-policy コマンドを実行します。

    aws iam attach-role-policy
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy
    --role-name AmazonEKS_EBS_CSI_DriverRole
  4. Amazon EBS CSI ドライバーをデプロイするには、Kustomize、Helm、または Amazon EKS マネージドアドオンを使用します。デプロイ手順については、GitHub のウェブサイトで「インストール」を参照してください。

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

Amazon EFS CSI ドライバー

CSI ドライバーの IAM ロールを作成する

ワーカーノードを含むクラスターにおいて、次の手順を実行します。

  1. AmazonEFSCSIDriverPolicy の使用方法については、「サービスアカウントで IAM ロールを使用する場合」を参照してください。次に、ステップ 7 に進みます。
    または、次のコマンドを実行し、GitHub から IAM ポリシードキュメントをダウンロードします。

    curl -o iam-policy-example.json https://raw.githubusercontent.com/kubernetes-sigs/aws-efs-csi-driver/master/docs/iam-policy-example.json
  2. IAM ポリシーを作成するには、次の create-policy コマンドを実行します。

    aws iam create-policy
        --policy-name AmazonEKS_EFS_CSI_Driver_Policy
        --policy-document file://iam-policy-example.json
  3. OIDC プロバイダーの URL を確認するには、次の describe-cluster コマンドを実行します。

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

    注: 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/OIDC-ID"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.YOUR_AWS_REGION.amazonaws.com/id/OIDC-ID:sub": "system:serviceaccount:kube-system:efs-csi-controller-sa"
            }
          }
        }
      ]
    }
    EOF

    注: YOUR_AWS_ACCOUNT_ID をアカウント ID に、YOUR_AWS_REGION を使用するリージョンに、OIDC-ID をクラスターの OIDC プロバイダー ID に置き換えてください。

  5. IAM ロールを作成するには、次の create-role コマンドを実行します。

    aws iam create-role
      --role-name AmazonEKS_EFS_CSI_DriverRole
      --assume-role-policy-document file://"trust-policy.json"
  6. 新しい IAM ポリシーをロールにアタッチするには、次の attach-role-policy コマンドを実行します。

    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

    注: YOUR_AWS_ACCOUNT_ID を実際のアカウント ID に置き換えてください。

  7. マネージドアドオンを使用する場合は、「Amazon EFS CSI ドライバーのデプロイ」に進んでください。セルフマネージドドライバーをインストールするには、手順 7 ~ 10 を実行します。YAML ファイルに 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

    注: YOUR_AWS_ACCOUNT_ID を実際のアカウント ID に置き換えてください。

  8. クラスターに Kubernetes サービスアカウントを作成するには、次のコマンドを実行します。

    kubectl apply -f efs-service-account.yaml

    注: Kubernetes サービスアカウント efs-csi-controller-sa には、作成した IAM ロールのアノテーションが含まれます。

  9. パブリック Amazon Elastic Container Registry (Amazon ECR) レジストリからマニフェストをダウンロードするには、次のコマンドを実行します。

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

    注: VERSION をリリースバージョンの番号に置き換えてください。最新のリリースバージョンを使用することをおすすめします。アクティブなブランチのリストについては、GitHub のウェブサイトで「ブランチ」を参照してください。Kustomize の代わりに Helm を使用してもドライバをインストールできます。手順については、GitHub のウェブサイトで「ドライバーのデプロイ」を参照してください。

  10. ダウンロードしたファイルを編集し、次の行を削除します。

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

注: サービスアカウントをステップ 7 で作成したため、上記の行は不要です。

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

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

次の手順を実行します。

  1. Amazon EKS クラスターの仮想プライベートクラウド (VPC) ID を取得するには、次の describe-cluster コマンドを実行します。
    aws eks describe-cluster
     --name your_cluster_name
     --query "cluster.resourcesVpcConfig.vpcId"
     --output text
    注: your_cluster_name を実際のクラスター名に置き換えてください。
  2. VPC クラスターの CIDR 範囲を取得するには、次の describe-vpcs コマンドを実行します。
    aws ec2 describe-vpcs
     --vpc-ids YOUR_VPC_ID
     --query "Vpcs[].CidrBlock"
     --output text
    注: YOUR_VPC_ID を VPC ID に置き換えてください。
  3. Amazon EFS マウントポイントへの、内向きネットワークファイルシステム (NFS) トラフィックを許可するセキュリティグループを作成するには、次の create-security-group コマンドを実行します。
    aws ec2 create-security-group
     --description efs-test-sg
     --group-name efs-sg
     --vpc-id YOUR_VPC_ID
    注: YOUR_VPC_ID を VPC ID に置き換えてください。出力の GroupId 値を書き留めておきます。
  4. VPC 内のリソースを EFS ファイルシステムと通信できるようにするには、次の authorize-security-group-ingress コマンドを実行して NFS のインバウンドルールを追加します。
    aws ec2 authorize-security-group-ingress --group-id sg-abc --protocol tcp --port 2049 --cidr YOUR_VPC_CIDR
    注: YOUR_VPC_CIDR を VPC の CIDR に、sg-abc をセキュリティグループ ID に置き換えてください。
  5. Amazon EKS クラスター用の EFS ファイルシステムを作成するには、次の create-file-system コマンドを実行します。
    aws efs create-file-system --creation-token eks-efs
    注: FileSystemId を書き留めてください。
  6. Amazon EFS のマウントターゲットを作成するには、次の create-mount-target コマンドを実行します。
    aws efs create-mount-target --file-system-id FileSystemId --subnet-id SubnetID --security-group sg-abc
    注: FileSystemId を EFS ファイルシステム ID に、sg-abc をセキュリティグループ ID に、SubnetID をワーカーノードのサブネット ID に置き換えてください。ワーカーノードを実行するすべてのアベイラビリティーゾーンで上記のコマンドを実行することが推奨されます。そうすることで、アベイラビリティーゾーン内のすべての Amazon Elastic Compute Cloud (Amazon EC2) インスタンスでファイルシステムを使用できます。複数のサブネットにマウントターゲットを作成するには、各サブネット ID に対してコマンドを実行します。

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

同じファイルに書き込む 2 つのポッドをデプロイする方法については、GitHub のウェブサイトで「Multiple Pods Read Write Many」を参照してください。

関連情報

クォータに関連するファイル操作エラーのトラブルシューティング

Amazon EFS CSI ドライバー (GitHub のウェブサイト)

Amazon EKS における、EBS ボリュームのマウントに関する問題をトラブルシューティングする方法を教えてください

Amazon EKS における、Amazon EFS ボリュームのマウントに関する問題をトラブルシューティングする方法を教えてください

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

関連するコンテンツ