Amazon EKS の Amazon EC2 ノードグループで、AWS Load Balancer Controller を使用して Application Load Balancer を設定するにはどうすればよいですか?

最終更新日: 2022 年 4 月 11 日

Amazon Elastic Kubernetes Service (Amazon EKS) の Amazon Elastic Compute Cloud (Amazon EC2) ノードグループで、AWS Load Balancer Controller を使用して Application Load Balancer をセットアップしたいと考えています。

簡単な説明

次の手順は、Amazon EKS で Amazon EC2 ノードグループに AWS Load Balancer Controller を使用して Application Load Balancer をデプロイする方法を示しています。Network Load Balancer を作成するには、「AWS Load Balancer Controller」を参照してください。

AWS Load Balancer Controller は、AWS Identity and Access Management (IAM)、EC2、AWS Certificate Manager (ACM)、Elastic Load Balancing、Amazon Cognito、AWS WAF、AWS Shield などの AWS サービスエンドポイントに接続する必要があります。つまり、AWS Load Balancer Controller を動作させるには、アウトバウンドインターネット接続が必要です。詳細については、「Amazon EKS クラスターのサブネットを設定するにはどうすればよいですか?」を参照してください。

AWS Fargate に AWS Load Balancer Controller をデプロイするには、「Fargate 用の Amazon EKS クラスターに AWS Load Balancer Controller をセットアップする方法を教えてください。」を参照してください。

解決方法

サブネットにタグを付けて自動検出を可能にする

Amazon EKS クラスターの Amazon VPC サブネットにタグを付けて、Application Load Balancer リソースの作成時に AWS Load Balancer Controller がサブネットを自動検出できるようにします。

パブリック Application Load Balancer の場合、クラスターの VPC には、以下のタグが付いたパブリックサブネットが少なくとも 2 つ必要です。

kubernetes.io/role/elb

内部 Application Load Balancer の場合、クラスターの VPC には、以下のタグが付いたプライベートサブネットが少なくとも 2 つ必要です。

kubernetes.io/role/internal-elb

注意: AWS Command Line Interface (AWS CLI) のコマンド実行時にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください

クラスターの OIDC ID プロバイダーの作成

クラスターの OpenID Connect (OIDC) ID プロバイダーを作成して、 サービスアカウントの AWS Identity and Access Management (IAM) ロールで使用するには、eksctl または AWS マネジメントコンソールのいすれかを使用します。

AWSL CLI を使用して、クラスターの OIDC ID プロバイダーを作成することもできます。例:

ISSUER_URL=$(aws eks describe-cluster --name cluster-name \
  --query "cluster.identity.oidc.issuer" --region region-name --output text)
aws iam create-open-id-connect-provider \
  --url ${ISSUER_URL} \
  --thumbprint-list ca-thumbprint \
  --client-id-list sts.amazonaws.com \
  --region region-name

注意: cluster-name をクラスター名、 region-name を AWS リージョン、ca-thumbprint をルート CA 証明書のサムプリントに置き換えます。クラスターが oidc.eks.region-name.amazonaws.com で使用するルート CA 証明書のサムプリントを取得できます。

AWS Load Balancer Controller の IAM ポリシーを作成する

Amazon EKS ポリシーを作成して、AWS Load Balancer Controller がユーザーに代わって AWS API を呼び出すことを許可します。AWS API へのアクセスを付与するときは、サービスアカウントに AWS IAM ロールを使用することをお勧めします。

1.    AWS Load Balancer Controller の IAM ポリシードキュメントを AWS GitHub からダウンロードするには、リージョンに応じて、次のいずれかのコマンドを実行します。

中国リージョン以外のすべてのリージョン:

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

- または -

中国 (北京と寧夏) リージョン:

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_cn.json

2.    ワーカーノードインスタンスプロファイル用に AWSLoadBalancerControllerIAMPolicy という名前の IAM ポリシーを作成するには、次のコマンドを実行します。

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

3.    ステップ 2 の出力で返されるポリシーの Amazon リソースネーム (ARN) を書き留めます。

4.    AWS Load Balancer Controller 用に既存の IAM ロールを使用するか、新しい IAM ロールを作成します。

ヒント: eksctl を使用して IAM ロールを作成するには、--attach-policy-arn パラメータを IAM ポリシー AWSLoadBalancerControllerIAMPolicy の ARN とともに使用します。

5.    前に特定した IAM ロールに AWSLoadBalancerControllerIAMPolicy をアタッチするには、次のコマンドを実行します。

aws iam attach-role-policy \
--policy-arn arn:aws:iam::111122223333:policy/AWSLoadBalancerControllerIAMPolicy \
--role-name role-name

注意: 111122223333 を AWS アカウント ID に role-name を IAM ロール名に置き換えます。

AWS Load Balancer Controller のデプロイ

1.    サブネットに関連付けられているロードバランサーに、必要なタグがあることを確認します。

2.    証明書の設定を Webhook に挿入できるように、 cert-manager をインストールします。

Kubernetes 1.16 以降の場合:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/$VERSION/cert-manager.yaml

Kubernetes 1.15 以前の場合:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/$VERSION/cert-manager-legacy.yaml

注: $VERSION は、デプロイする cert-manager のバージョン (Jetstack GitHub サイトから取得、例えば 'v1.6.0') に置き換えます。

3.    AWS GitHub から AWS Load Balancer Controller 用にダウンロードされたマニフェストファイルで、次のコマンドを実行します。

curl -Lo ingress-controller.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/$VERSION/v2_4_1_full.yaml

注: $VERSION は、デプロイする AWS Load Balancer Controller の バージョン (Kubernetes SIGs GitHub サイトから取得、例えば「v2.4.1」) に置き換えます。

4.    クラスターの cluster-name を編集します。以下に例を示します。

spec:
    containers:
    - args:
        - --cluster-name=your-cluster-name # edit the cluster name
        - --ingress-class=alb

5.    ファイルの ServiceAccount セクションだけを更新します。以下に例を示します。

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/name: aws-load-balancer-controller
  annotations:                                                                        # Add the annotations line
    eks.amazonaws.com/role-arn: arn:aws:iam::111122223333:role/role-name              # Add the IAM role
  name: aws-load-balancer-controller
  namespace: kube-system

注意: 111122223333 を AWS アカウント ID に role-name を IAM ロール名に置き換えます。

6.    AWS Load Balancer Controller をデプロイするには、以下のコマンドを実行します。

kubectl apply -f ingress-controller.yaml

AWS Load Balancer Controller をテストするサンプルアプリケーションをデプロイする

サンプルアプリケーションをデプロイして、Ingress オブジェクトであるため、AWS Load Balancer Controller がパブリック Application Load Balancer を作成することを検証します。

1.    2048 というゲームをサンプルアプリケーションとしてデプロイするには、次のコマンドを実行します。

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml

注: $VERSION は、デプロイする AWS Load Balancer Controller の バージョン (Kubernetes SIGs GitHub サイトから取得、例えば 'v2.3.0') に置き換えます。

2.    Ingress リソースが作成されたことを確認するには、数分待ってから、次のコマンドを実行します。

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

次のような出力が表示されます。

NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
ingress-2048   <none>   *       k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-west-2.elb.amazonaws.com   80      2m32s

数分経過しても Ingress が作成されない場合は、次のコマンドを実行して AWS Load Balancer Controller のログを表示します。

kubectl logs -n kube-system   deployment.apps/aws-load-balancer-controller

注意: AWS Load Balancer Controller ログには、デプロイに関する問題のトラブルシューティングに役立つエラーメッセージが含まれていることがあります。

3.    サンプルアプリケーションを表示するには、ウェブブラウザを開き、手順 2 の出力から URL アドレスに移動します。

4.    サンプルアプリケーションをクリーンアップするには、次のコマンドを実行します。

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml

注: $VERSION は、デプロイする AWS Load Balancer Controller の バージョン (Kubernetes SIGs GitHub サイトから取得、例えば 'v2.3.0') に置き換えます。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?