サービスアカウントの IAM ロールを使用する Amazon VPC CNI plugin for Kubernetes の設定 - Amazon EKS

サービスアカウントの IAM ロールを使用する Amazon VPC CNI plugin for Kubernetes の設定

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

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

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

注記

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

前提条件

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

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

      my-cluster を独自の値に置き換えます。

      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

      my-cluster を独自の値に置き換えます。111122223333 をアカウント ID に置き換え、AmazonEKS_CNI_IPv6_PolicyIPv6 ポリシーの名前に置き換えます。IPv6 ポリシーがない場合は、IPv6 ファミリーを使用するクラスター用に IAM ポリシーを作成します。 を参照して作成します。クラスターで IPv6 を使用するには、いくつかの要件を満たす必要があります。詳細については、「クラスター、Pods、services 用の 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 and the 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 を前のステップで返された値に置き換えます。region-code をクラスターのある 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 ファミリに適合したコマンドを実行します。

      • IPv4

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \ --role-name AmazonEKSVPCCNIRole
      • IPv6

        111122223333 をアカウント名に置き換え、AmazonEKS_CNI_IPv6_PolicyIPv6 ポリシー名に置き換えます。IPv6 ポリシーがない場合は、IPv6 ファミリーを使用するクラスター用に IAM ポリシーを作成します。 を参照して作成します。クラスターで IPv6 を使用するには、いくつかの要件を満たす必要があります。詳細については、「クラスター、Pods、services 用の IPv6 アドレス」を参照してください。

        aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \ --role-name AmazonEKSVPCCNIRole
    5. 次のコマンドを実行し、先に作成した IAM ロールの ARN で aws-node サービスアカウントをアノテーションします。example values を自分の値に置き換えてください。

      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 KubernetesPods 再デプロイする

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

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

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

    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 をアカウント名に置き換え、AmazonEKS_CNI_IPv6_PolicyIPv6 ポリシー名に置き換えます。

    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 使用の詳細については、「クラスター、Pods、services 用の 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