Fargate 用の Amazon EKS クラスターで AWS Load Balancer Controller を設定する方法を教えてください。

所要時間4分
0

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 アカウントポリシー、ロールベースのアクセスコントロールポリシーを作成する

次の手順を実行します。

  1. eksctl を使用して Amazon EKS クラスターを作成するには、次のコマンドを実行します。

    eksctl create cluster \
      --name YOUR_CLUSTER_NAME \
      --version 1.28 \
      --fargate

    注: your-cluster-name は、実際のクラスター名に置き換えます。Fargate ポッド (--fargate) のみを使用するクラスターでは、Fargate ポッドの実行ロールを作成する必要はありません。

  2. 次のコマンドを実行し、クラスターがサービスアカウントに AWS Identity and Access Management (IAM) を使用できるようにします。

    eksctl utils associate-iam-oidc-provider \
      --cluster YOUR_CLUSTER_NAME \
      --approve

    注: your-cluster-name は、実際のクラスター名に置き換えます。kubeletkube-proxy は、FargateExecutionRole を使用して Fargate ポッドを実行します。ただし、FargateExecutionRole は Fargate ポッドの IAM ロールとは異なります。Fargate ポッドでは、サービスアカウントの IAM ロールを使用する必要があります。

  3. AWS Load Balancer Controller がユーザーに代わって AWS API を呼び出すことを許可する IAM ポリシーをダウンロードするには、次のコマンドを実行します。

  4.  curl -o iam_policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/install/iam_policy.json
  5. ダウンロードしたポリシーを使用して IAM ポリシーを作成するには、次の AWS CLI コマンド create-policy を実行します。

    aws iam create-policy \
      --policy-name AWSLoadBalancerControllerIAMPolicy \
      --policy-document file://iam_policy.json
  6. 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 というサービスアカウントを作成します。

  7. 新しいサービスロールが作成済みであることを確認するには、次のいずれかのコマンドを実行します。

    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 をインストールする

次の手順を実行します。

  1. Helm に Amazon EKS チャートを追加するには、次のコマンドを実行します。

    helm repo add eks https://aws.github.io/eks-charts
  2. リポジトリを更新して最新のチャートを取得するには、次のコマンドを実行します。

    helm repo update eks
  3. 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 に置き換えます。

  4. コントローラーが正しくインストールされていることを確認するには、次のコマンドを実行します。

    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
  • ServiceTypeLoadBalancer である Network Load Balancer

入力リソースは、URI、ホスト名、パスなどのウェブ概念に基づいてトラフィックを別々のサービスにルーティングします。ロードバランサーを複数のサービスと共有したり、サービスのルーティングを制御したりするには、Ingress リソースを使用することをおすすめします。Service LoadBalancer を使用すると、サービスに専用のロードバランサーを割り当てられます。

注: 次のテストステップでは、2048 というゲームアプリケーションのサンプルをデプロイします。

Application Load Balancer を作成する

イングレス用の Application Load Balancer を作成するには、次の手順を実行します。

  1. ゲームのデプロイに必要な 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 をリージョンに置き換えます。

  2. アプリケーションをデプロイするには、次のコマンドを実行します。

    kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.11.0/docs/examples/2048/2048_full.yaml
  3. 数分待機します。次に、以下のコマンドを実行し、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

    ログに、デプロイの問題を診断するのに参考となるエラーメッセージがないか確認します。

  4. アプリケーションを見つけるには、ブラウザを開き、ingress リソースのコマンド出力に表示された URL に移動します。
    注: アプリケーションが表示されない場合は、数分待ってからブラウザを更新します。

Network Load Balancer を作成する

Network Load Balancer の IP アドレスモードサービスを使用してアプリケーションをデプロイするには、次の手順を実行します。

  1. Fargate プロファイルを作成するには、次のコマンドを実行します。

    eksctl create fargateprofile --cluster your-cluster --region your-region-code --name your-alb-sample-app --namespace game-2048

    注: 実際のものでそれぞれ、your-cluster をクラスター名に、your-region-code クラスターのリージョンに置き換えます。

  2. 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
  3. マニフェストから、次の 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
  4. 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
  5. サービスとデプロイマニフェストを作成するには、次のコマンドを実行します。

    kubectl apply -f 2048-game.yaml
  6. サービスの作成と 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
  7. ロードバランサーがアクティブになるまで数分待ちます。デプロイにアクセスできることを確認するには、ウェブブラウザを開きます。次に、コマンド出力の 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」を参照してください。

コメントはありません

関連するコンテンツ