IRSA を使用するように Amazon VPC CNI プラグインを設定する - アマゾン EKS

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

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

IRSA を使用するように Amazon VPC CNI プラグインを設定する

Amazon VPC CNI plugin for Kubernetes は、Amazon EKS クラスター内の Pod ネットワーキング用のネットワークプラグインです。プラグインは Kubernetes ポッドに VPC IP アドレスを割り当て、各ノードのポッドに必要なネットワークを設定する役割を果たしています。

注記

Amazon VPC CNI プラグインは、Amazon EKS Pod Identity もサポートしています。詳細については、「IAM ロールを Kubernetes サービスアカウントに割り当てる」を参照してください。

プラグイン:

  • AWS アイデンティティとアクセス管理 (IAM のアクセス許可が必要です。クラスターが IPv4 ファミリーを使用する場合、このアクセス許可は、AmazonEKS_CNI_Policy AWS 管理ポリシーで指定されます。クラスターが IPv6 ファミリーを使用する場合には、作成した IAM ポリシーにアクセス許可を追加する必要があります。手順については、「IPv6 ファミリーを使用するクラスター用に IAM ポリシーを作成します。」を参照してください。このポリシーはAmazon EKS ノード IAM ロール または 個別の IAM ロールにアタッチすることができます。Amazon EKS ノード IAM ロールにポリシーをアタッチする手順については「Amazon EKS ノードの IAM ロール」を参照してください。このトピックで詳細に説明するように、別のロールに割り当てることをお勧めします。

  • デプロイ時に作成すると、aws-node という名前の Kubernetes サービスアカウントを使用するように設定されます。サービスアカウントは aws-node という名前の Kubernetes clusterrole にバインドされます。これには、必要な Kubernetes アクセス許可が割り当てられています。

注記

IMDS へのアクセスをブロックする場合を除き、Amazon VPC CNI plugin for Kubernetes 用の Pod には、Amazon EKS ノード IAM ロールに割り当てられたパーミッションへのアクセス権があります。詳細については「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。

ステップ 1: Amazon VPC CNI plugin for Kubernetes の IAM ロールを作成する

  1. クラスターで使用する IP ファミリを決定します。

    aws eks describe-cluster --name my-cluster | grep ipFamily

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

    "ipFamily": "ipv4"

    この出力では代わりに ipv6 が返されることがあります。

  2. IAM ロールを作成します。IAM ロールを作成するにはeksctl または kubectl および AWS CLI を使用してます。

    eksctl
    • クラスターの IP ファミリーに適合するコマンドを使用して IAM ロールを作成し、そのロールに IAM ポリシーをアタッチします。このコマンドでは、IAM ロールを作成する AWS CloudFormation スタックを作成およびデプロイし、そのために指定したポリシーをアタッチします。さらに、既存の aws-node Kubernetes サービスアカウントに対し、作成された IAM ロールの ARN をアノテーションします。

      • IPv4

        マイクラスター を独自の値に置き換えます。

        eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --override-existing-serviceaccounts \ --approve
      • IPv6

        マイクラスター を独自の値に置き換えます。111122223333 を、ご自身のアカウント ID に置き換えます。また、AmazonEKS_CNI_IPv6_Policy を、IPv6 ポリシー名に置き換えます。IPv6 ポリシーがない場合はIPv6 ファミリーを使用するクラスター用に IAM ポリシーを作成します。 を参照して作成します。クラスターで IPv6 を使用するにはいくつかの要件を満たす必要があります。詳細については「クラスター、Pod、サービスに対する IPv6 アドレスの説明」を参照してください。

        eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --role-name AmazonEKSVPCCNIRole \ --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --override-existing-serviceaccounts \ --approve
    kubectl と AWS CLI
    1. クラスターの OIDC プロバイダーの URL を表示します。

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

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

      https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE

      出力が返されない場合はクラスター用の IAM OIDC プロバイダーを作成する必要があります。

    2. 次の内容を vpc-cni-trust-policy.json という名前のファイルにコピーします。111122223333 を、ご自身のアカウント ID および前のステップで返された出力 EXAMPLED539D4633E53DE1B71EXAMPLE に置き換えます。地域コード を、クラスターのある AWS リージョンに置き換えます。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com", "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node" } } } ] }
    3. ロールを作成します。AmazonEKSVPCCNIRole は任意の名前に置き換えることができます。

      aws iam create-role \ --role-name AmazonEKSVPCCNIRole \ --assume-role-policy-document file://"vpc-cni-trust-policy.json"
    4. 必要な IAM ポリシーをロールにアタッチします。クラスターの IP ファミリに適合したコマンドを実行してください。

    5. 次のコマンドを実行し、先に作成した IAM ロールの ARN で aws-node サービスアカウントをアノテーションします。example の値は独自の値に置き換えます。

      kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
  3. (オプション) Kubernetes サービスアカウントで使用されている AWS Security Token Service エンドポイントタイプを設定します。詳細については、「サービスアカウントの AWS Security Token Service エンドポイントを設定する」を参照してください。

ステップ 2: Amazon VPC CNI plugin for Kubernetes の Pod を再デプロイする

  1. 認証情報環境変数を適用するために、サービスアカウントに関連付けられている既存の Pod を削除して再作成します。現在アノテーションなしで実行されている Pod には、アノテーションは適用されません。次のコマンドは、既存の aws-node DaemonSet Pod を削除し、サービスアカウントのアノテーションを使用してデプロイします。

    kubectl delete Pods -n kube-system -l k8s-app=aws-node
  2. Pod がすべて再起動したことを確認します。

    kubectl get pods -n kube-system -l k8s-app=aws-node
  3. Pod の 1 つについて説明し、AWS_WEB_IDENTITY_TOKEN_FILE および AWS_ROLE_ARN 環境変数が存在することを確認します。cpjw7 を、前のステップの出力で返された、いずれかの Pod の名前に置き換えます。

    kubectl describe pod -n kube-system aws-node-cpjw7 | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'

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

    AWS_ROLE_ARN: arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token AWS_ROLE_ARN: arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    Pod には 2 つのコンテナが含まれているため、重複した結果の 2 つのセットが返されます。両方のコンテナの値は同じです。

    Pod で AWS リージョンエンドポイントを使用している場合、前の出力では下記の行も返されています。

    AWS_STS_REGIONAL_ENDPOINTS=regional

ステップ 3: ノードの IAM ロールから CNI ポリシーを削除する

現在、Amazon EKS ノード IAM ロールAmazonEKS_CNI_Policy IAM (IPv4) ポリシーまたは IPv6 ポリシーがアタッチされており、さらに、別の IAM ロールを作成し、このロールに対し前出のポリシーをアタッチし、そのロールを aws-node Kubernetes サービスアカウントに割り当てている場合、クラスターの IP ファミリーに適合する AWS CLI コマンドを使用して、ノードのロールからポリシーを削除することをお勧めします。AmazonEKSNodeRole を、ノードのロールの名前に置き換えます。

  • IPv4

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  • IPv6

    111122223333 はご自身のアカウント ID に置き換え、AmazonEKS_CNI_IPv6_Policy はご使用の IPv6 ポリシーの名前に置き換えます。

    aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy

IPv6 ファミリーを使用するクラスター用に IAM ポリシーを作成します。

IPv6 ファミリーを使用するクラスターを作成し、そのクラスターでバージョン 1.10.1 以降の Amazon VPC CNI plugin for Kubernetes アドオンが設定されている場合は、IAM ロールに割り当てることができる IAM ポリシーを作成する必要があります。作成時に IPv6 ファミリーの使用を設定していない、既存のクラスターにおいて、IPv6 を使用する場合には新しいクラスターを作成する必要があります。クラスターでの IPv6 使用の詳細については「クラスター、Pod、サービスに対する IPv6 アドレスの説明」を参照してください。

  1. 次のテキストをコピーし、vpc-cni-ipv6-policy.json という名前のファイルに保存します。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:AssignIpv6Addresses", "ec2:DescribeInstances", "ec2:DescribeTags", "ec2:DescribeNetworkInterfaces", "ec2:DescribeInstanceTypes" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "ec2:CreateTags" ], "Resource": [ "arn:aws:ec2:*:*:network-interface/*" ] } ] }
  2. IAM ポリシーを作成する

    aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json