Amazon EKS の ALB Ingress Controller - Amazon EKS

Amazon EKS の ALB Ingress Controller

AWS ALB Ingress Controller for Kubernetes は、kubernetes.io/ingress.class: alb 注釈を付けて Ingress リソースがクラスターで作成されるたびに、Application Load Balancer (ALB) および必要な AWS サポートリソースの作成をトリガーするコントローラーです。Ingress リソースは ALB を設定して、HTTP または HTTPS トラフィックをクラスター内の別のポッドにルーティングします。ALB Ingress Controller は、Amazon EKS クラスターで実行される本稼働用ワークロードに対応しています。

Ingress オブジェクトが ALB Ingress Controller を使用するためには、Ingress 仕様に次の注釈を追加します。詳細については、ドキュメントの「Ingress specification」を参照してください。

annotations: kubernetes.io/ingress.class: alb

ALB Ingress Controller は、次のトラフィックモードをサポートします。

  • インスタンス – クラスター内のノードを ALB のターゲットとして登録します。ALB に到達するトラフィックは、サービスの NodePort にルーティングされてから、ポッドにプロキシされます。これがデフォルトのトラフィックモードです。alb.ingress.kubernetes.io/target-type: instance の注釈を使用して明示的に指定することもできます。

    注記

    Kubernetes サービスでは、このトラフィックモードを使用する NodePort タイプを指定する必要があります。

  • IP – ポッドを ALB のターゲットとして登録します。ALB に到達するトラフィックは、サービスのポッドに直接ルーティングされます。このトラフィックモードを使用するには、 alb.ingress.kubernetes.io/target-type: ip の注釈を指定する必要があります。

ALB Ingress Controller でサポートされている他の使用可能な注釈については、「Ingress annotations」を参照してください。

このトピックでは、Amazon EKS クラスターで操作できるよう ALB Ingress Controller を設定する方法について説明します。

重要

プライベートクラスター で ALB Ingress Controller を使用することはできません。

ALB Ingress Controller を Amazon EKS クラスターにデプロイするには

  1. ロードバランサーに使用する VPC のサブネットにタグを付け、そのサブネットを使用できることを ALB Ingress Controller に伝えます。詳細については、「サブネットのタグ付け要件」を参照してください。eksctl を使用してクラスターをデプロイした場合は、タグがすでに適用されています。

    • VPC 内のすべてのサブネットは、Kubernetes が検出できるように、個別にタグ付けする必要があります。

      キー

      kubernetes.io/cluster/<cluster-name>

      shared

    • VPC のパブリックサブネットにタグを付け、外部ロードバランサー用のサブネットのみを使用できることを ALB Ingress Controller に伝えます。

      キー

      kubernetes.io/role/elb

      1

    • プライベートサブネットは、Kubernetes が内部ロードバランサーにサブネットを使用できることを認識できるように、次のようにタグ付けする必要があります。03/26/2020 以降に Amazon EKS AWS CloudFormation テンプレートを使用して VPC を作成する場合、テンプレートによって作成されたサブネットは、作成時にタグ付けされます。Amazon EKS AWS CloudFormation VPC テンプレートの詳細については、「Amazon EKS クラスター用の VPC の作成」を参照してください。

      キー

      kubernetes.io/role/internal-elb

      1

  2. IAM OIDC プロバイダーを作成し、クラスターに関連付けます。 eksctl バージョン 0.24.0 以降がインストールされていない場合は、「eksctl のインストールまたはアップグレード」の手順に従ってインストールまたはアップグレードします。インストールされているバージョンは、eksctl version で確認できます。

    eksctl utils associate-iam-oidc-provider \ --region region-code \ --cluster prod \ --approve
  3. ユーザーに代わって AWS API を呼び出すことを許可する、ALB Ingress Controller ポッド用の IAM ポリシーをダウンロードします。GitHub でポリシードキュメントを表示することもできます。

    curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/iam-policy.json
  4. 前のステップでダウンロードしたポリシー ALBIngressControllerIAMPolicy を使用して、IAM ポリシーを作成します。

    aws iam create-policy \ --policy-name ALBIngressControllerIAMPolicy \ --policy-document file://iam-policy.json

    返されるポリシー ARN を書き留めておきます。

  5. 次のコマンドを使用して、alb-ingress-controller という名前の Kubernetes サービスアカウントを kube-system 名前空間に作成します。さらに、クラスターロールと ALB Ingress Controller で使用するクラスターロールバインディングを作成します。kubectl をインストールしていない場合は、「kubectl のインストール」の手順に従ってインストールします。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/rbac-role.yaml
  6. ALB Ingress Controller の IAM ロールを作成し、このロールを前のステップで作成したサービスアカウントにアタッチします。eksctl でクラスターを作成していない場合は、AWS マネジメントコンソール または AWS CLI タブの手順を使用します。

    eksctl

    次のコマンドは、eksctl で作成したクラスターでのみ使用できます。

    eksctl create iamserviceaccount \ --region region-code \ --name alb-ingress-controller \ --namespace kube-system \ --cluster prod \ --attach-policy-arn arn:aws:iam::111122223333:policy/ALBIngressControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve
    AWS マネジメントコンソール
    1. AWS マネジメントコンソール タブで「IAM ロールを作成する」の手順を使用して、eks-alb-ingress-controller という名前の IAM ロールを作成し、このロールに前のステップで作成した ALBIngressControllerIAMPolicy IAM ポリシーをアタッチします。ロールを作成したら、ロールの Amazon リソースネーム (ARN) をメモします。

    2. 次のコマンドを使用して、作成したロールの ARN で Kubernetes サービスアカウントに注釈を付けます。

      kubectl annotate serviceaccount -n kube-system alb-ingress-controller \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/eks-alb-ingress-controller
    AWS CLI
    1. AWS CLI タブで「IAM ロールを作成する」の手順を使用して、eks-alb-ingress-controller という名前の IAM ロールを作成し、このロールに前のステップで作成した ALBIngressControllerIAMPolicy IAM ポリシーをアタッチします。ロールを作成したら、ロールの Amazon リソースネーム (ARN) をメモします。

    2. 次のコマンドを使用して、作成したロールの ARN で Kubernetes サービスアカウントに注釈を付けます。

      kubectl annotate serviceaccount -n kube-system alb-ingress-controller \ eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/eks-alb-ingress-controller
  7. 次のコマンドを使用して、ALB Ingress Controller をデプロイします。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/alb-ingress-controller.yaml
  8. 次のコマンドを使用して、ALB Ingress Controller のデプロイマニフェストを編集のために開きます。

    kubectl edit deployment.apps/alb-ingress-controller -n kube-system
  9. --ingress-class=alb 行の後にクラスター名の行を追加します。Fargate で ALB Ingress Controller を実行している場合は、VPC ID の行と、クラスターの AWS リージョン名も追加する必要があります。適切な行を追加したら、ファイルを保存して閉じます。

    spec: containers: - args: - --ingress-class=alb - --cluster-name=prod - --aws-vpc-id=vpc-03468a8157edca5bd - --aws-region=region-code
  10. 次のコマンドを使用して、ALB Ingress Controller が実行されていることを確認します。

    kubectl get pods -n kube-system

    正常な出力:

    NAME READY STATUS RESTARTS AGE alb-ingress-controller-55b5bbcb5b-bc8q9 1/1 Running 0 56s

サンプルアプリケーションをデプロイするには

  1. サンプルアプリケーションとしてゲーム 2048 をデプロイし、ALB Ingress Controller が Ingress オブジェクトの結果として Application Load Balancer を作成することを確認します。Amazon EC2 ワーカーノードのみ、1 つ以上の Fargate プロファイル、または両方の組み合わせを持つクラスターにおいて、サンプルアプリケーションを実行できます。クラスターに Amazon EC2 ワーカーノードがあり、Fargate ポッドがない場合は、[Amazon EC2 worker nodes only (EC2 ワーカーノードのみ)] タブを選択します。クラスターに既存の Fargate ポッドがある場合、またはアプリケーションを新しい Fargate ポッドにデプロイする場合は、[Fargate] タブを選択します。Fargate ポッドの詳細については、「Amazon EKS を使用した AWS Fargate の開始方法」を参照してください。

    Amazon EC2 worker nodes only

    次のコマンドを使用して、アプリケーションをデプロイします。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-namespace.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-deployment.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-service.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-ingress.yaml
    Fargate

    Fargate で使用するクラスターが、サポートされているリージョンのリストに含まれていることを確認します。

    1. 次のコマンドを使用して、サンプルアプリケーションの名前空間を含む Fargate プロファイルを作成します。example-values の値は独自の値に置き換えます。

      注記

      次のコマンドは、eksctl で作成したクラスターでのみ使用できます。eksctl でクラスターを作成していない場合は、AWS マネジメントコンソール でプロファイルを作成できます。namenamespace には、次のコマンドと同じ値を使用します。

      eksctl create fargateprofile --cluster prod --region region-code --name alb-sample-app --namespace 2048-game
    2. 次のコマンドを使用して、マニフェストファイルをダウンロードして適用し、Kubernetes の名前空間、デプロイ、およびサービスを作成します。

      kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-namespace.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-deployment.yaml kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-service.yaml
    3. 次のコマンドを使用して、入力マニフェストファイルをダウンロードします。

      curl -o 2048-ingress.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-ingress.yaml
    4. 2048-ingress.yaml ファイルを編集します。既存の alb.ingress.kubernetes.io/scheme: internet-facing 行の下に、行 alb.ingress.kubernetes.io/target-type: ip を追加します。

    5. 次のコマンドを使用して、入力マニフェストファイルを適用します。

      kubectl apply -f 2048-ingress.yaml
  2. 数分後、次のコマンドを使用して、Ingress リソースが作成されたことを確認します。

    kubectl get ingress/2048-ingress -n 2048-game

    出力:

    NAME HOSTS ADDRESS PORTS AGE 2048-ingress * example-2048game-2048ingr-6fa0-352729433.region-code.elb.amazonaws.com 80 24h
    注記

    Ingress が数分後に作成されていない場合は、次のコマンドを実行して Ingress コントローラーのログを表示します。これらのログには、デプロイに関する問題の診断に役立つエラーメッセージが含まれている場合があります。

    kubectl logs -n kube-system deployment.apps/alb-ingress-controller
  3. ブラウザを開き、前のコマンドの出力から ADDRESS URL に移動して、サンプルアプリケーションを表示します。

    
                    2048 サンプルアプリケーション
  4. サンプルアプリケーションの試用が終了したら、次のコマンドで削除します。

    kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-ingress.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-service.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-deployment.yaml kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.8/docs/examples/2048/2048-namespace.yaml