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

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

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

  • ユーザーに代わって AWS API を呼び出すために、AWS 管理ポリシー AmazonEKS_CNI_Policy によって提供される IAM アクセス許可が必要です。

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

注記

サービスアカウントの IAM ロールを使用するように VPC CNI プラグインを設定するかどうかにかかわらず、ポッドは、IMDS へのアクセスをブロックされない限り、Amazon EKS ノードの IAM ロール に割り当てられたアクセス許可を持ちます。詳細については、「IMDS および Amazon EC2 インスタンスプロファイルの認証情報に対するアクセスの制限」を参照してください。

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

eksctl
  1. IAM ロールを作成して、次のコマンドで AmazonEKS_CNI_Policy マネージド IAM ポリシーをアタッチします。<cluster_name> を (<> を含めて) 独自の値に置き換えます。このコマンドは、クラスターの IAM OIDC プロバイダーが存在しない場合に、これを作成します。次に、IAM ロールを作成する AWS CloudFormation スタックをデプロイし、AWS マネージドポリシー AmazonEKS_CNI_Policy をアタッチし、既存の aws-node サービスアカウントを IAM ロールの ARN にアノテーションします。

    eksctl create iamserviceaccount \ --name aws-node \ --namespace kube-system \ --cluster <cluster_name> \ --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --approve \ --override-existing-serviceaccounts
  2. ポッドの 1 つについて説明し、AWS_WEB_IDENTITY_TOKEN_FILE および AWS_ROLE_ARN 環境変数が存在することを確認します。

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

    出力:

    AWS_VPC_K8S_CNI_LOGLEVEL=DEBUG AWS_ROLE_ARN=arn:aws:iam::<111122223333>:role/eksctl-prod-addon-iamserviceaccount-kube-sys-Role1-<V66K5I6JLDGK> AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
AWS Management Console

Prerequisite

クラスターの既存の IAM OIDC プロバイダーが必要です。既に作成しているか、または作成しようとしているかを確認するには、「クラスターの IAM OIDC プロバイダーを作成するには」を参照してください。

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

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

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

  3. [Choose a web identity provider (ウェブ ID プロバイダーを選択)] セクションで、次の操作を行います。

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

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

  4. [Next: Permissions (次へ: アクセス許可)] を選択します。

  5. [ポリシーのアタッチ] セクションで、サービスアカウントに使用する AmazonEKS_CNI_Policy ポリシーを選択します。

  6. [次へ: タグ] を選択します。

  7. [Add tags (optional) (タグの追加 (オプション))] 画面で、アカウントのタグを追加できます。[Next: Review] を選択します。

  8. [Role Name (ロール名)] に、ロールの名前 (AmazonEKSCNIRole など) を入力し、[Create Role (ロールを作成)] を選択します。

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

  10. [Trust relationships] タブを選択し、続いて [Edit trust relationship] を選択します。

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

    "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    これを次の行のように変更します。<EXAMPLED539D4633E53DE1B716D3041E> (<> を含む) をクラスターの OIDC プロバイダー ID に置き換えます。また、<region-code> は、クラスターが置かれているリージョンのコードに置き換えます。

    "oidc.eks.<region-code>.amazonaws.com/id/<EXAMPLED539D4633E53DE1B716D3041E>:sub": "system:serviceaccount:kube-system:aws-node"
  12. [Update Trust 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-node DaemonSet ポッドを削除し、サービスアカウントの注釈を使用してデプロイします。

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

    kubectl get pods -n kube-system -l k8s-app=aws-node
  4. ポッドの 1 つについて説明し、AWS_WEB_IDENTITY_TOKEN_FILE および AWS_ROLE_ARN 環境変数が存在することを確認します。

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

    出力:

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

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

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

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

  3. ノードインスタンスロールの [アクセス許可] タブを選択し、AmazonEKS_CNI_Policy の右側にある [X] をクリックします。

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