Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Fargate 用の Amazon EKS クラスターで AWS Load Balancer Controller を設定する方法を教えてください。
AWS Load Balancer Controller を Amazon Elastic Kubernetes Service (Amazon EKS) Cluster for AWS Fargate で設定したいです。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
AWS Load Balancer Controller は、既存の Application Load Balancer Ingress Controller のデプロイを使用せずに設定できます。
前提条件
- 既存の AWS ALB Ingress Controller for Kubernetes がアンインストール済みである。AWS Load Balancer Controller がその機能の代替となります。
- eksctl バージョン 0.109.0 以降を使用している。詳細については、eksctl のウェブサイトで「インストール」を参照してください。
- ワークステーションに Helm をインストールします。
Amazon EKS クラスター、サービス AWS アカウントポリシー、ロールベースのアクセスコントロールポリシーを作成する
次の手順を実行します。
-
eksctl を使用して Amazon EKS クラスターを作成するには、次のコマンドを実行します。
eksctl create cluster \ --name YOUR_CLUSTER_NAME \ --version 1.28 \ --fargate注: your-cluster-name は、実際のクラスター名に置き換えます。Fargate ポッド (--fargate) のみを使用するクラスターでは、Fargate ポッドの実行ロールを作成する必要はありません。
-
次のコマンドを実行し、クラスターがサービスアカウントに AWS Identity and Access Management (IAM) を使用できるようにします。
eksctl utils associate-iam-oidc-provider \ --cluster YOUR_CLUSTER_NAME \ --approve注: your-cluster-name は、実際のクラスター名に置き換えます。kubelet と kube-proxy は、FargateExecutionRole を使用して Fargate ポッドを実行します。ただし、FargateExecutionRole は Fargate ポッドの IAM ロールとは異なります。Fargate ポッドでは、サービスアカウントの IAM ロールを使用する必要があります。
-
AWS Load Balancer Controller がユーザーに代わって AWS API を呼び出すことを許可する IAM ポリシーをダウンロードするには、次のコマンドを実行します。
-
curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json -
ダウンロードしたポリシーを使用して IAM ポリシーを作成するには、次の AWS CLI コマンド create-policy を実行します。
aws iam create-policy \ --policy-name AWSLoadBalancerControllerIAMPolicy \ --policy-document file://iam_policy.json -
AWS Load Balancer Controller 用のサービスアカウントを作成するには、次のコマンドを実行します。
eksctl create iamserviceaccount \ --cluster=YOUR_CLUSTER_NAME \ --namespace=kube-system \ --name=aws-load-balancer-controller \ --attach-policy-arn=arn:aws:iam::AWS_ACCOUNT_ID:policy/AWSLoadBalancerControllerIAMPolicy \ --override-existing-serviceaccounts \ --approve注: 実際のものでそれぞれ、YOUR_CLUSTER_NAME をクラスター名に、AWS_ACCOUNT_ID をアカウント ID に置き換えます。上記のコマンドは、kube-system 名前空間に aws-load-balancer-controller というサービスアカウントを作成します。
-
新しいサービスロールが作成済みであることを確認するには、次のいずれかのコマンドを実行します。
eksctl get iamserviceaccount \ --cluster=YOUR_CLUSTER_NAME \ --name=aws-load-balancer-controller \ --namespace=kube-system注: your-cluster-name は、実際のクラスター名に置き換えます。
または、kubectl get serviceaccount aws-load-balancer-controller \ --namespace kube-system \ -o yaml
Helm を使用して AWS Load Balancer Controller をインストールする
次の手順を実行します。
-
Helm に Amazon EKS チャートを追加するには、次のコマンドを実行します。
helm repo add eks https://aws.github.io/eks-charts -
リポジトリを更新して最新のチャートを取得するには、次のコマンドを実行します。
helm repo update eks -
Helm チャートをインストールするには、次のコマンドを実行します。
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \ --set clusterName=YOUR_CLUSTER_NAME \ --set serviceAccount.create=false \ --set region=YOUR_REGION_CODE \ --set vpcId=EKS_CLUSTER_VPC_ID \ --set serviceAccount.name=aws-load-balancer-controller \ --version 1.11.0 \ -n kube-system注: 実際のものでそれぞれ、YOUR_CLUSTER_NAME をクラスター名に、YOUR_REGION_CODE をクラスターの AWS リージョンに置き換えます。さらに、EKS_CLUSTER_VPC_ID をクラスターの仮想プライベートクラウド (VPC) ID に置き換えます。
-
コントローラーが正しくインストールされていることを確認するには、次のコマンドを実行します。
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
AWS Load Balancer Controller をテストする
実装をテストするには、AWS Load Balancer Controller を使用して次のいずれかのリソースを作成します。
- Ingress 用の Application Load Balancer
- Service の Type が LoadBalancer である Network Load Balancer
入力リソースは、URI、ホスト名、パスなどのウェブ概念に基づいてトラフィックを別々のサービスにルーティングします。ロードバランサーを複数のサービスと共有したり、サービスのルーティングを制御したりするには、Ingress リソースを使用することをおすすめします。Service LoadBalancer を使用すると、サービスに専用のロードバランサーを割り当てられます。
注: 次のテストステップでは、2048 というゲームアプリケーションのサンプルをデプロイします。
Application Load Balancer を作成する
イングレス用の Application Load Balancer を作成するには、次の手順を実行します。
-
ゲームのデプロイに必要な Fargate プロファイルを作成するには、次のコマンドを実行します。
eksctl create fargateprofile \ --cluster YOUR_CLUSTER_NAME \ --region YOUR_REGION_CODE \ --name your-alb-sample-app \ --namespace game-2048注: 実際のものでそれぞれ、YOUR_CLUSTER_NAME をクラスター名に、YOUR_REGION_CODE をリージョンに置き換えます。
-
アプリケーションをデプロイするには、次のコマンドを実行します。
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml -
数分待機します。次に、以下のコマンドを実行し、AWS Load Balancer Controller が Ingress リソースを作成したことを確認します。
kubectl get ingress/ingress-2048 -n game-2048出力例
NAME CLASS HOSTS ADDRESS PORTS AGE ingress-2048 alb * k8s-game2048-ingress2-xxxxxxxxxx-yyyyyyyyyy.region.elb.amazonaws.com 80 3d4h数分経っても Ingress が作成されない場合は、次のコマンドを実行し、AWS Load Balancer Controller のログを確認します。
kubectl logs -n kube-system deployment.apps/aws-load-balancer-controllerログに、デプロイの問題を診断するのに参考となるエラーメッセージがないか確認します。
-
アプリケーションを見つけるには、ブラウザを開き、ingress リソースのコマンド出力に表示された URL に移動します。
注: アプリケーションが表示されない場合は、数分待ってからブラウザを更新します。
Network Load Balancer を作成する
Network Load Balancer の IP アドレスモードサービスを使用してアプリケーションをデプロイするには、次の手順を実行します。
-
Fargate プロファイルを作成するには、次のコマンドを実行します。
eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048注: 実際のものでそれぞれ、your-cluster をクラスター名に、your-region-code クラスターのリージョンに置き換えます。
-
2048 というゲームをデプロイするためのマニフェストを取得するには、次のコマンドを実行します。
curl -o 2048-game.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml -
マニフェストから、次の Ingress セクションを削除します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: game-2048 name: ingress-2048 annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip spec: ingressClassName: alb rules: - http: paths: - path: / pathType: Prefix backend: service: name: service-2048 port: number: 80 -
Service オブジェクトを変更し、次の値を使用します。
apiVersion: v1 kind: Service metadata: namespace: game-2048 name: service-2048 annotations: service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip" service.beta.kubernetes.io/aws-load-balancer-type: external service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing spec: ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer selector: app.kubernetes.io/name: app-2048 -
サービスとデプロイマニフェストを作成するには、次のコマンドを実行します。
kubectl apply -f 2048-game.yaml -
サービスの作成と Network Load Balancer の DNS 名を確認するには、次のコマンドを実行します。
kubectl get svc -n game-2048出力例
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service-2048 LoadBalancer 10.100.114.197 k8s-game2048-service2-xxxxxxxxxx-yyyyyyyyyy.us-east-2.elb.amazonaws.com 80:xxxxx/TCP 23m -
ロードバランサーがアクティブになるまで数分待ちます。デプロイにアクセスできることを確認するには、ウェブブラウザを開きます。次に、コマンド出力の EXTERNAL-IP に表示される完全修飾ドメイン名 (FQDN) を開きます。
AWS Load Balancer Controller のトラブルシューティング
AWS Load Balancer Controller の設定時に問題が発生した場合は、次のコマンドを実行します。
kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller kubectl get endpoints -n game-2048 kubectl get ingress/ingress-2048 -n game-2048
logs コマンドの出力を参照し、タグやサブネットの問題などのエラーメッセージがないか確認します。一般的なエラーのトラブルシューティング手順については、GitHub の ウェブサイトで「Issues」を参照してください。「AWS Load Balancer Controller を使用してロードバランサーを作成する際に発生する問題のトラブルシューティング方法を教えてください」も参照してください。
get endpoints コマンドは、バックアップされたデプロイポッドが正しく登録されているかどうかを示します。get ingress コマンドは、Igress リソースがデプロイ済みかどうかを示します。
詳細については、Kubernetes のウェブサイトで「AWS Load Balancer Controller」を参照してください。
- トピック
- Containers
- 言語
- 日本語

