Amazon EKS の Amazon EC2 ノードグループにある AWS Load Balancer Controller を使用して、Application Load Balancer を設定する方法を教えてください。
Amazon Elastic Kubernetes サービス (Amazon EKS) の Amazon Elastic Compute Cloud (Amazon EC2) ノードグループにある AWS Load Balancer Controller を使用して、Application Load Balancer をセットアップしたいと考えています。
簡単な説明
AWS Load Balancer Controller を次の AWS サービスエンドポイントのいずれかに接続します。
- AWS Identity and Access Management (IAM)
- Amazon EC2
- AWS Certificate Manager (ACM)
- Elastic Load Balancing (ELB)
- Amazon Cognito
- AWS WAF
- AWS シールド
AWS Load Balancer Controller を機能させるには、インターネットのアウトバウンド接続が必要です。詳細については、「Amazon EKS クラスターのサブネットを設定するにはどうすればよいですか?」を参照してください。
AWS Fargate で AWS Load Balancer Controller をデプロイするには、「Fargate 用の Amazon EKS クラスターで AWS Load Balancer Controller をセットアップして、2048 ゲームをデプロイする方法を教えてください」を参照してください。
解決策
サブネットにタグを付けて自動検出を可能にする
Amazon EKS クラスター内の Amazon Virtual Private Cloud (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
クラスターの OIDC ID プロバイダーを作成する
eksctl または AWS マネジメントコンソールのいずれかを使用して、サービスアカウントの IAM ロールで使用する OpenID Connect (OIDC) ID プロバイダーを作成します。
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、必ず AWS CLI の最新バージョンを使用してください。
または、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 証明書のサムプリントに置き換えてください。クラスターが使用するルート CA 証明書のサムプリントは、oidc.eks.region-name.amazonaws.com で取得できます。
AWS Load Balancer Controller の IAM ポリシーを作成する
作成した Amazon EKS ポリシーにより、AWS Load Balancer Controller で AWS API を呼び出すことができます。AWS API へのアクセスを許可する場合は、サービスアカウントに AWS IAM ロールを使用するのがベストプラクティスです。
-
AWS Load Balancer Controller の IAM ポリシーを GitHub からダウンロードします。設定に応じて、次のコマンドのいずれかを実行します。
中国リージョンを除くすべてのリージョン: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
中国リージョン (北京および寧夏回族自治区):
curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy_cn.json
-
ワーカーノードインスタンスプロファイル用に AWSLoadBalancerControllerIAMPolicy という名前の IAM ポリシーを作成するには、次のコマンドを実行します。
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam-policy.json
-
出力で返されるポリシーの ARN を書き留めておきます。
-
既存の IAM ロールを使用するか、AWS Load Balancer Controller 用の]( IAM ロールを作成[します。
注:eksctl を使用して IAM ロールを作成するには、—attach-policy-arn パラメーターを AWSLoadBalancerControllerIAMPolicy IAM ポリシーの ARN とともに使用します。 -
AWSLoadBalancerControllerIAMPolicy を IAM ロールにアタッチするには、次のコマンドを実行します。
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 をデプロイする
-
サブネットに関連付けられているロードバランサーに必要なタグがあることを確認します。
-
証明書の設定を Webhook に挿入するために、cert-manager をインストールします。Kubernetes 1.16 以降を使用して次のコマンドを実行します。
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/$VERSION/cert-manager.yaml
-
GitHub からダウンロードしたマニフェストファイルで、次のコマンドを実行します。
curl -Lo ingress-controller.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/$VERSION/v2_6_2_full.yaml
**注:****$VERSION ** は、デプロイする AWS Load Balancer Controller のバージョンに置き換えます。また、例えば v2.6.2 の場合は v2_6_2_full.yaml など、ファイル名を変更します。詳細については、GitHub の「The Kubernetes repository 」を参照してください。
-
クラスターの cluster-nameを編集します。例:
spec: containers: - args: - --cluster-name=your-cluster-name # edit the cluster name - --ingress-class=alb
-
ファイルの 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 はご自身ののアカウントIDに、role-name はご自身の IAM ロール名に置き換えてください。
-
次のコマンドを実行して、AWS Load Balancer Controller をデプロイします。
kubectl apply -f ingress-controller.yaml
AWS Load Balancer Controller をテストするためのサンプルアプリケーションをデプロイする
サンプルアプリケーションをデプロイして、AWS Load Balancer Controller が Ingress オブジェクトによってパブリック Application Load Balancer を作成することを確認します。
- 次のコマンドを実行して、2048 という名前のゲームをサンプルアプリケーションとしてデプロイします。
注:****$VERSION は、デプロイする AWS Load Balancer Controller のバージョン (Kubernetes SIGs GitHub ウェブサイトにあります) に置き換えてください。kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml
- 数分待ってから次のコマンドを実行し、Ingress リソースが作成されたことを確認します。
次の例のような出力が表示されます。kubectl get ingress/ingress-2048 -n game-2048
NAME CLASS HOSTS ADDRESS PORTS AGEingress-2048 <none> * k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.us-west-2.elb.amazonaws.com 80 2m32s
- 数分経っても Ingress が作成されない場合は、次に示すコマンドを実行して、AWS Load Balancer Controlle のログを確認します。
**注:**AWS Load Balancer Controller のログには、デプロイに関する問題のトラブルシューティングに役立つエラーメッセージが表示されることがよくあります。kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
- サンプルアプリケーションを表示するには、ウェブブラウザを開き、手順 2 の出力にある URL アドレスに移動します。
- サンプルアプリケーションをクリーンアップするには、次のコマンドを実行します。
注:****$VERSION は、デプロイする AWS Load Balancer Controller のバージョン (Kubernetes SIGs GitHub ウェブサイトにあります) に置き換えてください。kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/$VERSION/docs/examples/2048/2048_full.yaml
関連情報
Amazon EKS の Kubernetes サービスコントローラによって作成されたロードバランサーに関する問題をトラブルシューティングする方法を教えてください。
AWS Load Balancer Controller を使用してロードバランサーを作成する際に発生する問題をトラブルシューティングするにはどうすればよいですか?
関連するコンテンツ
- 質問済み 2年前lg...
- 質問済み 3ヶ月前lg...