Kubernetes サービスアカウントを使用するように Pods を設定するには - Amazon EKS

Kubernetes サービスアカウントを使用するように Pods を設定するには

Pod が AWS サービスにアクセスする必要がある場合、Kubernetes サービスアカウントを使用するように設定する必要があります。サービスアカウントは、AWS サービスにアクセスする権限がある AWS Identity and Access Management (IAM) ロールに関連付ける必要があります。

  • 既存のクラスター。まだ所有していない場合は、Amazon EKS の使用を開始する でのガイドのいずれかを参照しながら作成できます。

  • クラスター用の既存 IAM OpenID Connect (OIDC) プロバイダー。既に所有中かどうかの確認、または作成方法については「クラスターの IAM OIDC プロバイダーを作成する」を参照してください。

  • IAM ロールに関連付けられている既存の Kubernetes サービスアカウント。サービスアカウントには、IAM ロールの Amazon リソースネーム (ARN) の注釈を付ける必要があります。ロールには、Pods が AWS サービスを使用するアクセス許可を含む IAM ポリシーが関連付けられている必要があります。サービスアカウントとロールの作成および設定方法については、「Kubernetes サービスアカウントへの IAM ロールの割り当て」を参照してください。

  • ご使用のデバイスまたは AWS CloudShell で、バージョン 2.12.3 以降、または AWS コマンドラインインターフェイス (AWS CLI) のバージョン 1.27.160 以降がインストールおよび設定されていること。現在のバージョンを確認するには、「aws --version | cut -d / -f2 | cut -d ' ' -f1」を参照してください。macOS の yumapt-get、または Homebrew などのパッケージマネージャーは、AWS CLI の最新バージョンより数バージョン遅れることがあります。最新バージョンをインストールするには、「AWS コマンドラインインターフェイスユーザーガイド」の「インストール」および「aws configure を使用したクイック設定」を参照してください。AWS CloudShell にインストールされている AWS CLI バージョンも最新バージョンより数バージョン遅れることがあります。更新するには、「AWS CloudShell ユーザーガイド」の「ホームディレクトリへの AWS CLI のインストール」を参照してください。

  • デバイスまたは AWS CloudShell に、kubectl コマンドラインツールがインストールされていること。バージョンは、ご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが 1.29 である場合、kubectl のバージョン 1.281.29、または 1.30 が使用できます。kubectl をインストールまたはアップグレードする方法については、「kubectl と eksctl のセットアップ」を参照してください。

  • クラスター構成を含む既存の kubectl config ファイル。kubectl config ファイルの作成については、「kubeconfig ファイルを作成して kubectl を EKS クラスターに接続する」を参照してください。

    1. 次のコマンドを使用し、Pod をデプロイして設定を確認できるデプロイマニフェストを作成します。example の値は独自の値に置き換えます。

      cat >my-deployment.yaml <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: serviceAccountName: my-service-account containers: - name: my-app image: public.ecr.aws/nginx/nginx:X.XX EOF
    2. マニフェストをクラスターにデプロイします。

      kubectl apply -f my-deployment.yaml
    3. Pod に必要な環境変数が存在することを確認してください。

      1. 前の手順のデプロイ時にデプロイされた Pods を確認します。

        kubectl get pods | grep my-app

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

        my-app-6f4dfff6cb-76cv9 1/1 Running 0 3m28s
      2. Pod が使用している IAM ロールの ARN を確認します。

        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_ROLE_ARN:

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

        AWS_ROLE_ARN: arn:aws:iam::111122223333:role/my-role

        ロール ARN は、既存のサービスアカウントに注釈を付けたロール ARN と一致する必要があります。サービスアカウントへの注釈付けの詳細については、「Kubernetes サービスアカウントへの IAM ロールの割り当て」を参照してください。

      3. Pod にウェブ ID トークンファイルのマウントがあることを確認します。

        kubectl describe pod my-app-6f4dfff6cb-76cv9 | grep AWS_WEB_IDENTITY_TOKEN_FILE:

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

        AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/eks.amazonaws.com/serviceaccount/token

        kubelet が、Pod に代わってトークンをリクエストし、格納します。デフォルトで kubelet は、トークンが合計有効期限の 80% を超えている場合、またはトークンが 24 時間を超えている場合、そのトークンを更新します。Pod 仕様の設定を使用して、デフォルトのサービスアカウントを除くすべてのアカウントの有効期限を変更できます。詳細については、「Kubernetes ドキュメント」の「Service Account Token Volume Projection」(サービスアカウントトークンボリュームのプロジェクション) を参照してください。

        クラスターの Amazon EKS Pod Identity ウェブフックは、次の注釈が付いたサービスアカウントを使用している Pods をモニタリングします。

        eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/my-role

        ウェブフックは、これらの Pods に以前の環境変数を適用します。クラスターでは、環境変数とトークンファイルのマウントを設定するために、ウェブフックを使用する必要はありません。これらの環境変数を指定するため、Pods を手動で設定できます。AWS SDK のAWS SDK で IRSA を使用するサポートされているバージョンは、最初に認証情報チェーンプロバイダーでこれらの環境変数を探します。ロールの認証情報は、この条件を満たす Pods に使用されます。

    4. ロールにアタッチされた IAM ポリシーで割り当てた権限を使用して、Pods が AWS サービスと対話できることを確認します。

      注記

      Pod がサービスアカウントに関連付けられた IAM ロールの AWS 認証情報を使用する場合、AWS CLI またはその Pod のコンテナ内の他の SDK は、そのロールによって提供される認証情報を使用します。Amazon EKS ノードの IAM ロールAmazon EKS ノード IAM ロール に提供された認証情報へのアクセスを制限しない場合、Pod は引き続きこれらの認証情報にアクセスできます。詳細については、「ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する」を参照してください。

      Pods が期待どおりにサービスとやり取りできない場合は、次の手順を実行して、すべてが正しく設定されていることを確認してください。

      1. Pods が、OpenID Connect ウェブアイデンティティトークンファイルを介した IAM ロールの引き受けをサポートする AWS SDK バージョンを使用していることを確認します。詳細については、「AWS SDK で IRSA を使用する」を参照してください。

      2. デプロイがサービスアカウントを使用していることを確認します。

        kubectl describe deployment my-app | grep "Service Account"

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

        Service Account: my-service-account
      3. それでも Pods がサービスにアクセスできない場合は、「Kubernetes サービスアカウントへの IAM ロールの割り当てKubernetes サービスアカウントに IAM ロールを割り当てる」で説明されているステップ 3: 設定を確認する手順を参照して、ロールとサービスアカウントが正しく設定されていることを確認します。