AWS Load Balancer Controller - Amazon EKS

AWS Load Balancer Controller

AWS Load Balancer Controller により、Kubernetes クラスター向けの AWS Elastic Load Balancer を管理できます。コントローラは、次のリソースをプロビジョニングします。

  • Kubernetes Ingress を作成する場合の AWS Application Load Balancer (ALB)。

  • タイプ LoadBalancer の Kubernetes Service を作成する場合の、AWS Network Load Balancer (NLB)。以前は、インスタンスターゲットには Kubernetes のツリー内ロードバランサーを使用していましたが、IP ターゲットには AWS Load Balancer Controller を使用していました。AWS Load Balancer Controller バージョン 2.3.0 以降では、いずれかのターゲットタイプを使用して Network Load Balancer を作成できます。NLB ターゲットタイプの詳細については、Network Load Balancer のユーザーガイドの 「ターゲットタイプ」を参照してください。

このコントローラは、以前、AWS ALB Ingress Controller と呼ばれていたものです。これは、GitHub で管理されるオープンソースのプロジェクトです。このトピックでは、デフォルトのオプションを使用してコントローラをインストールする方法について説明します。コントローラについての完全な ドキュメントは、GitHub でご覧になれます。コントローラをデプロイする前に、Amazon EKS でのアプリケーション負荷分散 および Amazon EKS でのネットワーク負荷分散 についての前提条件と考慮事項を、確認しておくことをお勧めします。これらのトピックには、(AWS リソースのプロビジョニングのために、この Controller を使用する) サンプルアプリケーションのデプロイ手順も解説されています。

Prerequisites

AWS Load Balancer Controller を Amazon EKS クラスターにデプロイするには

以下のステップでは、 example values を独自の値に置き換えます。

  1. ユーザーに代わって AWS API を呼び出すことを許可する、AWS Load Balancer Controller 用の IAM ポリシーをダウンロードします。GitHub でポリシードキュメントを表示することもできます。

    curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.0/docs/install/iam_policy.json
  2. 前のステップでダウンロードしたポリシー を使用して、IAM ポリシーを作成します。

    aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json
    注記

    AWS Management Console でポリシーを表示すると、ELB の警告が表示されることがあります。一部のアクションは ELB v2 にのみ存在するため、これらの警告は無視してもかまいません。ELB v2 の警告は表示されません。

  3. IAM ロールを作成し、AWS を使用 (もしくは AWS Management Console と kubectl を使用) して、eksctl Load Balancer Controller の kube-system 名前空間に、aws-load-balancer-controller という名前で Kubernetes サービスアカウントをアノテーションします。

    eksctl

    my-cluster をクラスター名に、111122223333 をアカウント ID に置き換え、コマンドを実行します。

    eksctl create iamserviceaccount \ --cluster=my_cluster \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
    AWS Management Console and kubectl

    AWS Management Console および kubectl の使用

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

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

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

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

      1. [Identity provider (ID プロバイダー)] で、クラスターの URL を選択します。URL が表示されない場合は、このトピックの前提条件を満たしていることを確認します。

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

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

    6. [ポリシーのアタッチ] セクションで、前のステップで作成した AWSLoadBalancerControllerIAMPolicy ポリシーを選択し、サービスアカウントで使用します。

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

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

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

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

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

    12. 次の行と似ている行を探してます。

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

      これを次の行のように変更します。EXAMPLED539D4633E53DE1B716D3041E をクラスターの OIDC プロバイダー ID に置き換え、必要に応じて region-code をクラスターがあるリージョンコードに置き換えます。audsub に変更し、sts.amazonaws.com を次のテキストの値に置き換えます。

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

    14. 後のステップで使用するために、ロールの ARN を書き留めます。

    15. 以下の内容を aws-load-balancer-controller-service-account.yaml という名前のファイルに保存します。その際、111122223333 をアカウント ID に置き換えます。

      apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: controller app.kubernetes.io/name: aws-load-balancer-controller name: aws-load-balancer-controller namespace: kube-system annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/AmazonEKSLoadBalancerControllerRole
    16. クラスター上でサービスアカウントを作成します。

      kubectl apply -f aws-load-balancer-controller-service-account.yaml
  4. インストール済みの AWS ALB Ingress Controller for Kubernetes がある場合は、それをアンインストールします。AWS Load Balancer Controller は、AWS ALB Ingress Controller for Kubernetes の機能を置き換えます。

    1. Ingress Controller がインストール済みであるかどうかを確認します。

      kubectl get deployment -n kube-system alb-ingress-controller

      これは、コントローラが取り付けられていない場合の出力です。「コントローラーをインストールする」のステップに進みます。

      Error from server (NotFound): deployments.apps "alb-ingress-controller" not found

      これは、コントローラが取り付けられている場合の出力です。

      NAME READY UP-TO-DATE AVAILABLE AGE alb-ingress-controller 1/1 1 1 122d
    2. 次のコマンドを入力してコントローラを削除します。

      kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
    3. 次の IAM ポリシーを、前のステップで作成した IAM ロールに追加します。このポリシーは、ALB Ingress Controller for Kubernetes によって作成されたリソースへの AWS Load Balancer Controller アクセスを許可します。

      1. IAM ポリシーをダウンロードします。ポリシーを表示することもできます。

        curl -o iam_policy_v1_to_v2_additional.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.3.0/docs/install/iam_policy_v1_to_v2_additional.json
      2. IAM ポリシーを作成し、返された ARN を書き留めます。

        aws iam create-policy \ --policy-name AWSLoadBalancerControllerAdditionalIAMPolicy \ --policy-document file://iam_policy_v1_to_v2_additional.json
      3. 作成した IAM ポリシーを、前のステップで作成した IAM ロールにアタッチします。your-role-name はロールの名前に置き換えます。If you created the role using eksctl, then to find the role name that was created, open the AWS CloudFormation console and select the eksctl-your-cluster-name-addon-iamserviceaccount-kube-system-aws-load-balancer-controller stack. [Resources (リソース)] タブを選択します。ロール名は、[Physical ID (物理 ID)] 列で見つかります。AWS Management Consoleを使用してロールを作成した場合、ロール名は作成時に付けたもの (例えば、AmazonEKSLoadBalancerControllerRole など) になります。

        aws iam attach-role-policy \ --role-name your-role name \ --policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerAdditionalIAMPolicy
  5. Helm V3 以降を使用して、または Kubernetes マニフェストを適用して、AWS Load Balancer Controller をインストールします。Fargate でコントローラーをデプロイする場合は、Helm チャートを使用します。これは cert-manager に依存しません。

    Helm V3 or later
    1. eks-charts リポジトリを追加します。

      helm repo add eks https://aws.github.io/eks-charts
    2. ローカルリポジトリを更新して、最新のグラフがあることを確認します。

      helm repo update
    3. AWS Load Balancer コントローラをインストールします。Amazon EC2 インスタンスメタデータサービス (IMDS) に対するアクセスが制限されている Amazon EC2 ノードにコントローラーをデプロイする場合、または Fargate にデプロイする場合には、次のコマンドに次のフラグを追加します。

      • --set region=region-code

      • --set vpcId=vpc-xxxxxxxx

      us-west-2 以外のリージョンにデプロイする場合は、次のコマンドに次のフラグを追加し、accountregion-codeAmazon EKS アドオンコンテナイメージのアドレス にリストされているリージョン用の値に置き換えます。

      --set image.repository=account.dkr.ecr.region-code.amazonaws.com/amazon/aws-load-balancer-controller

      helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ -n kube-system \ --set clusterName=cluster-name \ --set serviceAccount.create=false \ --set serviceAccount.name=aws-load-balancer-controller
      重要

      デプロイされたグラフは、セキュリティに関する更新を自動的に受信しません。この更新が利用可能になったら、手動で新しいグラフにアップグレードする必要があります。アップグレードする場合は、前のコマンドの installupgrade に変更します。ただし、前のコマンドを実行する前に次のコマンドを実行し、TargetGroupBinding のカスタムリソース定義をインストールします。

      kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller/crds?ref=master"
    Kubernetes manifest
    1. cert-manager をインストールして、Webhook に証明書設定を導入します。

      kubectl apply \ --validate=false \ -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
    2. Load Balancer Controller をインストールします。

      1. Controller の詳細をダウンロードします。Controller の詳細については、GitHub のドキュメントを参照してください。

        curl -Lo v2_3_0_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.3.0/v2_3_0_full.yaml
      2. v2_3_0_full.yaml ファイルで以下を編集します。

        • ファイルの ServiceAccount セクションを削除します。このセクションを削除すると、コントローラーがデプロイされる際に IAM ロールを持つアノテーションが上書きされるのを防ぎ、コントローラーを削除した場合でも、ステップ 3 で作成したサービスアカウントは保持されます。

        • your-cluster-name を、クラスター名が付けられたファイルの Deployment spec セクションに置き換えます。

          ... spec: containers: - args: - --cluster-name=your-cluster-name ...
        • Amazon EC2 インスタンスメタデータサービス (IMDS) に対するアクセスが制限されている Amazon EC2 ノードにコントローラをデプロイする場合、または Fargate にデプロイする場合には、following parameters の下に - args: を追加します。

          ... spec: containers: - args: - --cluster-name=your-cluster-name - --ingress-class=alb - --aws-vpc-id=vpc-xxxxxxxx - --aws-region=region-code ...
      3. ファイルを適用します。

        kubectl apply -f v2_3_0_full.yaml
  6. コントローラがインストールされていることを確認します。

    kubectl get deployment -n kube-system aws-load-balancer-controller

    出力

    NAME READY UP-TO-DATE AVAILABLE AGE aws-load-balancer-controller 2/2 2 2 84s

    Helm を使用してデプロイした場合は、前の出力を受け取ります。Kubernetes マニフェストを使用してデプロイした場合、レプリカは 1 つしかありません。

  7. コントローラーを使用して AWS リソースをプロビジョニングする場合には、クラスターは特定の要件を満たしている必要があります。詳細については、「Amazon EKS でのアプリケーション負荷分散」および「Amazon EKS でのネットワーク負荷分散」を参照してください。