View a markdown version of this page

Amazon EBS で Kubernetes ボリュームストレージを使用する - Amazon EKS

このページの改善にご協力ください

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「GitHub でこのページを編集する」リンクを選択してください。

Amazon EBS で Kubernetes ボリュームストレージを使用する

注記

新規: Amazon EKS 自動モードは、ブロックストレージのルーチンタスクを自動化します。ステートフルワークロードのサンプルを EKS Auto Mode にデプロイする では、その方法を説明しています。

Amazon Elastic Block Store (Amazon EBS) コンテナストレージインターフェイス (CSI) ドライバーは、Amazon EBS ボリュームのライフサイクルを、作成した Kubernetes ボリュームのストレージとして管理します。Amazon EBS CSI ドライバーは、ジェネリック「エフェメラルボリューム」と「永続ボリューム」という種類の Kubernetes ボリューム用の Amazon EBS ボリュームを作成します。

考慮事項

  • EKS 自動モードクラスターに Amazon EBS CSI コントローラーをインストールする必要はありません。

  • Amazon EBS ボリュームを Fargate Pod にマウントすることはできません。

  • Amazon EBS CSI コントローラーは Fargate ノードで実行できますが、Amazon EBS CSI ノード DaemonSet は Amazon EC2 インスタンスでのみ実行できます。

  • Amazon EBS ボリュームと Amazon EBS CSI ドライバーは Amazon EKS Hybrid Nodes と互換性がありません。

  • 最新のアドオンバージョンと 1 つの以前のバージョンがサポートされます。最新バージョンで見つかったバグや脆弱性の修正は、新しいマイナーバージョンの以前のリリースにバックポートされます。

  • EKS 自動モードでは、プロビジョナーとして ebs.csi.eks.amazonaws.com を使用するストレージクラスが必要です。標準の Amazon EBS CSI ドライバー (ebs.csi.aws.com) は、独自のボリュームを個別に管理します。EKS 自動モードで既存のボリュームを使用するには、ボリュームスナップショットを使用して、自動モードプロビジョナーを使用するストレージクラスに移行します。

重要

Amazon EBS CSI ドライバーのスナップショット機能を使用するには、まず CSI スナップショットコントローラーをインストールする必要があります。詳細については、CSI ボリュームのためにスナップショット機能を有効にする を参照してください。

前提条件

  • 既存のクラスター。必要なプラットフォームバージョンを確認するには、次のコマンドを実行します。

    aws eks describe-addon-versions --addon-name aws-ebs-csi-driver
  • EBS CSI ドライバーには AWS IAM アクセス許可が必要です。

ステップ 1: IAM ロールを作成する

Amazon EBS CSI プラグインでは、ユーザーに代わって AWS API の呼び出しを行うための IAM アクセス許可が必要です。これらのステップを実行しない場合、アドオンをインストールして kubectl describe pvc を実行しようとすると、could not create volume in EC2: UnauthorizedOperation エラーとともに failed to provision volume with StorageClass が表示されます。詳細については、GitHub 上の Set up driver permission を参照してください。

注記

Pod は、IMDS へのアクセスをブロックする場合を除き、IAM ロールに割り当てられたアクセス許可にアクセスできます。詳細については、ベストプラクティスによる Amazon EKS クラスターの保護 を参照してください。

以下の手順は、IAM ロールを作成し、それに AWS マネージドポリシーをアタッチする方法を示しています。この手順を実装するには、次のいずれかのツールを使用できます。

注記

スコープダウンされたアクセス許可を持つセルフマネージドポリシーを作成できます。AmazonEBSCSIDriverPolicyV2 を確認し、アクセス許可を減らしたカスタム IAM ポリシーを作成します。AmazonEBSCSIDriverPolicy から移行する場合は、EBS CSI ドライバーポリシーの移行 を参照してください。

注記

この手順には、ドライバーを Amazon EKS アドオンとして使用するための特定のステップが書かれています。ドライバーをセルフマネージドのアドオンとして使用するには、さまざまなステップが必要です。詳細については、GitHub の「Set up driver permissions」を参照してください。

eksctl

  1. IAM ロールを作成して、ポリシーをアタッチします。AWS が AWS マネージドポリシーを維持しますが、ユーザーが独自のカスタムポリシーを作成することもできます。次のコマンドを使用して、IAM ロールを作成し、それに AWS マネージドポリシーをアタッチできます。マイクラスター の部分は自分のクラスター名に置き換えます。このコマンドは IAM ロールを作成して IAM ポリシーをアタッチする AWS CloudFormation スタックをデプロイします。

    eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --role-only \ --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicyV2 \ --approve
  2. カスタム KMS キーを使用しない場合は、このステップをスキップできます。このキーを Amazon EBS ボリュームでの暗号化に使用する場合、必要に応じて IAM ロールをカスタマイズします。例えば、以下を実行してください。

    1. 次のコードをコピーし、新しい kms-key-for-encryption-on-ebs.json ファイルに貼り付けます。custom-key-arn をカスタム KMS key ARN に置き換えます。

      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"] } ] }
    2. ポリシーを作成します。KMS_Key_For_Encryption_On_EBS_Policy を別の名前に変更できます。ただし、変更する場合は、必ず後の手順で変更してください。

      aws iam create-policy \ --policy-name KMS_Key_For_Encryption_On_EBS_Policy \ --policy-document file://kms-key-for-encryption-on-ebs.json
    3. 次のコマンドを使用して、IAM ポリシーをロールに添付します。111122223333 は、ご自分のアカウント ID に置き換えます。

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

AWS マネジメントコンソール

  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. 左のナビゲーションペインで、[ロール] を選択してください。

  3. [ロール] ページで、[ロールの作成] を選択してください。

  4. [信頼されたエンティティを選択] ページで、以下の操作を実行します。

    1. [信頼されたエンティティの種類] セクションで、[ウェブ アイデンティティ] を選択します。

    2. [Identity provider] (ID プロバイダー) で、(Amazon EKS の [Overview] (概要) に示されているように) クラスターに [OpenID Connect provider URL] (OpenID Connect プロバイダーの URL) を選択します。

    3. [対象者] で [sts.amazonaws.com] を選択します。

    4. [次へ] を選択します。

  5. [アクセス許可を追加] ページで、以下を実行します。

    1. [フィルタポリシー] ボックスに AmazonEBSCSIDriverPolicyV2 と入力します。

    2. 検索で返された AmazonEBSCSIDriverPolicyV2 の左にあるチェックボックスを選択します。

    3. [次へ] を選択します。

  6. [名前を付けて、レビューし、作成する] ページで、以下の操作を実行します。

    1. [ロール名] に、AmazonEKS_EBS_CSI_DriverRole などのロールの一意の名前を入力します。

    2. [タグの追加 (オプション)] で、タグをキーバリューのペアとして添付して、メタデータをロールに追加します。IAM でのタグの使用に関する詳細については『IAM ユーザーガイド』の「IAM リソースにタグを付ける」を参照してください。

    3. [ロールの作成] を選択してください。

  7. ロールが作成されたら、コンソールでロールを選択して編集用に開きます。

  8. [信頼関係] タブを選択し、続いて [信頼ポリシーの編集] を選択します。

  9. 次の行と似ている行を探してます。

    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com"

    前の行の末尾にカンマを追加し、前の行の後に次の行を追加します。region-code を、クラスターのある AWS リージョンに置き換えます。EXAMPLED539D4633E53DE1B71EXAMPLE をクラスターの OIDC プロバイダー ID に置き換えます。

    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa"
  10. [ポリシーの更新] を選択して終了します。

  11. Amazon EBS ボリュームでの暗号化にカスタム「KMS キー」を使用する場合、必要に応じて IAM ロールをカスタマイズします。例えば、以下を実行してください。

    1. 左のナビゲーションペインの [ポリシー] を選択します。

    2. [ポリシー] ページで、[ポリシーの作成] を選択します。

    3. [ポリシーの作成] ページで、[JSON] タブを選択します。

    4. 次のコードをコピーしてエディタに貼り付け、custom-key-arn をカスタム KMS key ARN に置き換えます。

      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"] } ] }
    5. [Next: Tags] (次へ: タグ) を選択します。

    6. [タグの追加 (オプション)] ページで、[次へ: 確認] を選択します。

    7. 名前 には、ポリシーの一意の名前を入力します (例: KMS_Key_For_Encryption_On_EBS_Policy)。

    8. [Create policy] (ポリシーの作成) を選択します。

    9. 左のナビゲーションペインで、[ロール] を選択してください。

    10. コンソールで [AmazonEKS_EBS_CSI_DriverRole] を選択し、編集用に開きます。

    11. [アクセス許可を追加] ドロップダウンリストから [ポリシーをアタッチ] を選択します。

    12. [フィルターポリシー] ボックスに、KMS_Key_For_Encryption_On_EBS_Policy と入力します。

    13. 検索で返された KMS_Key_For_Encryption_On_EBS_Policy の左側にあるチェックボックスをオンにします。

    14. ポリシーのアタッチ を選択します。

AWS CLI

  1. クラスターの OIDC プロバイダーの URL を表示します。マイクラスター の部分は自分のクラスター名に置き換えます。コマンドの出力が None の場合は、「前提条件」を確認してください。

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

    出力例は次のとおりです。

    https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
  2. IAM ロールを作成して AssumeRoleWithWebIdentity アクションを付与します。

    1. 次の内容を aws-ebs-csi-driver-trust-policy.json という名前のファイルにコピーします。111122223333 は、ご自分のアカウント ID に置き換えます。EXAMPLED539D4633E53DE1B71EXAMPLE および region-code を、前のステップで返された値にそれぞれ置き換えます。

      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:ebs-csi-controller-sa" } } } ] }
    2. ロールを作成します。AmazonEKS_EBS_CSI_DriverRole を別の名前に変更できます。変更する場合は、必ず後の手順で変更してください。

      aws iam create-role \ --role-name AmazonEKS_EBS_CSI_DriverRole \ --assume-role-policy-document file://"aws-ebs-csi-driver-trust-policy.json"
  3. ポリシーをアタッチします。AWS が AWS マネージドポリシーを維持しますが、ユーザーが独自のカスタムポリシーを作成することもできます。次のコマンドを使用して、AWS マネージドポリシーをロールにアタッチします。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicyV2 \ --role-name AmazonEKS_EBS_CSI_DriverRole
  4. Amazon EBS ボリュームでの暗号化にカスタム「KMS キー」を使用する場合、必要に応じて IAM ロールをカスタマイズします。例えば、以下を実行してください。

    1. 次のコードをコピーし、新しい kms-key-for-encryption-on-ebs.json ファイルに貼り付けます。custom-key-arn をカスタム KMS key ARN に置き換えます。

      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"], "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } }, { "Effect": "Allow", "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": ["arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab"] } ] }
    2. ポリシーを作成します。KMS_Key_For_Encryption_On_EBS_Policy を別の名前に変更できます。ただし、変更する場合は、必ず後の手順で変更してください。

      aws iam create-policy \ --policy-name KMS_Key_For_Encryption_On_EBS_Policy \ --policy-document file://kms-key-for-encryption-on-ebs.json
    3. 次のコマンドを使用して、IAM ポリシーをロールに添付します。111122223333 は、ご自分のアカウント ID に置き換えます。

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

Amazon EBS CSI ドライバーの IAM ロールを作成したので、次のセクションに進むことができます。この IAM ロールを使用してアドオンをデプロイすると、ebs-csi-controller-sa という名前のサービスアカウントが作成され、それを使用されるように設定されます。サービスアカウントは Kubernetes clusterrole にバインドされます。これには、必要な Kubernetes アクセス許可が割り当てられています。

ステップ 2: Amazon EBS CSI ドライバーを入手する

セキュリティを強化し、作業量を削減するために、Amazon EKS アドオンを通じて Amazon EBS CSI ドライバーをインストールすることをお勧めします。Amazon EKS アドオンをクラスターに追加するには、Amazon EKS アドオンを作成する を参照してください。アドオンの詳細については、Amazon EKS アドオン を参照してください。

重要

Amazon EBS ドライバーを Amazon EKS アドオンとして追加する前に、クラスターにセルフマネージドバージョンのドライバーがインストールされていないことを確認してください。インストールされている場合は、GitHub の「Uninstalling a self-managed Amazon EBS CSI driver」を参照してください。

注記

デフォルトでは、EBS CSI が使用する RBAC ロールには、テイント削除機能をサポートするためにノードを変更するアクセス許可があります。Kubernetes RBAC の制限により、このアクセス許可によってクラスター内の他の任意のノードも変更できます。Helm チャートには、ebs-csi-node サービスアカウントのノード RBAC 変更アクセス許可を無効にするパラメータ (node.serviceAccount.disableMutation) があります。有効にすると、テイント削除などのドライバー機能は動作しません。

または、Amazon EBS CSI ドライバーのセルフマネージドインストールが必要な場合は、GitHub の「Installation」を参照してください。

ステップ 3: サンプルアプリケーションをデプロイする

さまざまなサンプルアプリケーションをデプロイし、必要に応じて変更できます。詳細については、GitHub の「Kubernetes Examples」を参照してください。