サービスアカウントの IAM ロールを使用する Amazon VPC CNI プラグインの設定 - Amazon EKS

サービスアカウントの IAM ロールを使用する Amazon VPC CNI プラグインの設定

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

  • IAM アクセス許可が必要。クラスターに IPv4 を使用する場合は、AWS マネージドのポリシー AmazonEKS_CNI_Policy がアクセスを許可します。クラスターに IPv6 を使用する場合は、以下の手順に則ってカスタム IAM ポリシーを作成します。このポリシーは、Amazon EKS ノードの IAM ロール や、別の IAM ロールにアタッチすることができます。このトピックで詳細に説明するように、別のロールに割り当てることをお勧めします。

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

注記

サービスアカウントの IAM ロールを使用するように Amazon VPC CNI プラグインを構成するかどうかにかかわらず、IMDS へのアクセスをブロックしない限り、ポッドにも Amazon EKS ノードの IAM ロール に割り当てられたアクセス許可が付与されます。詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。

前提条件

ステップ 1: (オプション) IPv6 用の IAM ポリシーを作成する

IPv6 ファミリーを使用する 1.21 以降のクラスターを作成し、そのクラスターでバージョン 1.10.1 以降の VPC CNI アドオンが設定されている場合は、後のステップで IAM ロールに割り当てために IAM ポリシーを作成する必要があります。作成時に IPv6 ファミリーの使用を設定していない、1.21 以降の既存のクラスターにおいて、IPv6 を使用する場合には、新しいクラスタを作成する必要があります。クラスターでの IPv6 の使用については、「ポッドとサービスへの 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

ステップ 2: Amazon VPC CNI プラグインの IAM ロールを作成する

クラスターで IPv4 を使用している場合は、ロールに対し、AmazonEKS_CNI_Policy 管理のIAM ポリシーをアタッチします。IPv6 を使用しているクラスターの場合は、AmazonEKS_CNI_IPv6_Policy をアタッチします。

eksctl または AWS Management Console を使用して、CNI プラグイン IAM ロールを作成できます。

eksctl
  1. 次のコマンドを使用して IAM ロールを作成し、そのロールに IAM ポリシーをアタッチします。my-cluster を独自の値に置き換えます。このコマンドでは、IAM ロールを作成する AWS CloudFormation スタックを作成およびデプロイし、そのロール用に指定したポリシーをアタッチします。さらに、既存の aws-node サービスアカウントに対し、作成された IAM ロールの ARN を注釈として付加します。

    eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster my-cluster \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --approve \ --override-existing-serviceaccounts
  2. (オプション) グローバルエンドポイントではなく、AWS Security Token Service AWS リージョンのエンドポイントを使用するように、サービスアカウントに注釈を追加します。詳細については、IAM ロールをサービスアカウントに関連付けるを参照してください。

  3. 実行中の Amazon VPC CNI ポッドを表示します。

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

    kubectl exec -n kube-system aws-node-9rgzw -c aws-node -- env | grep AWS

    出力:

    ... AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token ... AWS_ROLE_ARN=arn:arn:aws::111122223333:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-V66K5I6JLDGK ...

    グローバルエンドポイントではなく AWS Security Token Service AWS リージョンのエンドポイントを使用するように、アノテーションをサービスアカウントに追加した場合、前の出力に次の行も返されたことを確認します。

    AWS_STS_REGIONAL_ENDPOINTS=regional
AWS Management Console

前提条件

クラスターの既存 AWS Identity and Access Management (IAM) OpenID Connect (OIDC) プロバイダー。既に存在しているかどうかを確認する、または作成するには「クラスターの IAM OIDC プロバイダーを作成するには」を参照してください。

AWS Management Console で CNI プラグイン IAM ロールを作成するには

  1. 左のナビゲーションペインで、[Roles (ロール)] を選択します。次に、[Create role] (ロールの作成) を選択します。

  2. [Trusted entity type] (信頼されたエンティティの種類) セクションで、[Web identity] (ウェブ アイデンティティ) を選択します。

  3. [Web identity] (ウェブ アイデンティティ) セクションで、以下の操作を実行します。

    1. [Identity provider (ID プロバイダー)] で、クラスターの URL を選択します。

    2. [Audience (対象者)] で [sts.amazonaws.com] を選択します。

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

  5. [Filter policies] (フィルターポリシー) ボックスで AmazonEKS_CNI_Policy または AmazonEKS_CNI_IPv6_Policy を入力し、検索で返されたポリシー名の左側にあるチェックボックスを選択します。

  6. [Next (次へ)] を選択します。

  7. [ロール名] にロールの一意の名前 (AmazonEKSCNIRole など) を入力します。

  8. [Description] (説明) には、Amazon EKS - CNI role のような説明文を入力します。

  9. [ロールの作成] を選択します。

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

  11. [Trust relationships] (信頼関係) タブを選択し、続いて [Edit trust policy] (信頼ポリシーの編集) を選択します。

  12. 次のように表示されます。

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

    これを次の行のように変更します。次の文字列で、EXAMPLED539D4633E53DE1B716D3041E をクラスターの OIDC プロバイダー ID に、また region-code をクラスターが存在する AWS リージョン コードに置き換えます。さらに、(前の出力の) aud を以下の文字列の sub に変更する必要もあります。

    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:kube-system:aws-node"
  13. [Update policy] (ポリシーの更新) を選択して終了します。

aws-node Kubernetes サービスアカウントにIAM ロールをアノテーションするには

  1. 1.18 以降の Amazon EKS クラスター で Amazon EKS アドオンを使用している場合は、この手順を最後まで進めずに、「Amazon VPC CNI Amazon EKS アドオンの更新」を参照してください。Amazon VPC CNI Amazon EKS アドオンを使用していない場合は、次のコマンドを使用して、前に作成した IAM ロールの ARN を aws-node サービスアカウントにアノテーションします。example values を自分の値に置き換えてください。

    kubectl annotate serviceaccount \ -n kube-system aws-node \ eks.amazonaws.com/role-arn=arn:aws:iam::AWS_ACCOUNT_ID:role/AmazonEKSCNIRole
  2. (オプション) グローバルエンドポイントではなく、AWS Security Token Service AWS リージョン のエンドポイントを使用するように、サービスアカウントにさらに注釈を追加します。詳細については、IAM ロールをサービスアカウントに関連付けるを参照してください。

  3. 認証情報環境変数を適用するために、サービスアカウントに関連付けられている既存のポッドを削除して再作成します。変更ウェブフックは、すでに実行されているポッドには適用されません。次のコマンドは、既存の aws-node DaemonSet ポッドを削除し、サービスアカウントの注釈を使用してデプロイします。

    kubectl delete pods -n kube-system -l k8s-app=aws-node
  4. ポッドがすべて再起動したことを確認します。

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

    kubectl exec -n kube-system aws-node-9rgzw -c aws-node -- env | grep AWS

    出力:

    ... AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token ... AWS_ROLE_ARN=arn:arn:aws::111122223333:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-V66K5I6JLDGK ...

    グローバルエンドポイントではなく AWS Security Token Service AWS リージョン のエンドポイントを使用するように、アノテーションをサービスアカウントに追加した場合、前の出力に次の行も返されたことを確認します。

    AWS_STS_REGIONAL_ENDPOINTS=regional

ノード IAM ロールから CNI ポリシーを削除する

現在、Amazon EKS ノードの IAM ロールAmazonEKS_CNI_Policy IAM ポリシーもしくは IPv6 ポリシーがアタッチされており、さらに、このポリシーを、作成した別の IAM ロールに対しアタッチして、そのロールを aws-node Kubernetes サービスアカウントに割り当てている場合、ノードロールからはポリシーを削除することをお勧めします。

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

  2. 左のナビゲーションペインで、[Roles] (ロール) を選択し、ノードインスタンスロールを検索します。

  3. ノードインスタンスロールの [アクセス許可] タブを開き、AmazonEKS_CNI_Policy もしくは AmazonEKS_CNI_IPv6_Policy の右側に表示されている [X] を選択します。

  4. [デタッチ] を選択して終了します。