Fargate 用の Amazon EKS クラスターに AWS Load Balancer Controller を設定して、2048 ゲームをデプロイする方法を教えてください。

最終更新日:2022 年 8 月 8 日

AWS Fargate 用の Amazon Elastic Kubernetes Service (Amazon EKS) クラスターに AWS Load Balancer Controller をセットアップしたいと考えています。それで、2048 ゲームをデプロイしたいと考えています。

簡単な説明

次の手順は、新しい Fargate クラスターで AWS Load Balancer Controller をセットアップする方法を示しています。AWS Load Balancer Controller は、既存の Application Load Balancer (ALB) Ingress Controller をデプロイせずにセットアップします。

開始する前に、次の点に留意してください。

  • Kubernetes の AWS ALB Ingress Controller をアンインストールします。AWS Load Balancer Controller が、AWS ALB Ingress Controller の機能に取って代わります。
  • eksctl は、バージョン 0.97.0 以降を使用します。
  • ワークステーションに Helm をインストールします。
  • AWS リージョンのデフォルト値が使用されるため、--region 変数がコマンドで常に使用されるとは限りません。デフォルト値を確認するには、aws configure コマンドを実行します。AWS リージョンを変更するには、--region フラグを使用します。
  • Amazon EKS on Fargate は、中国 (北京)、中国 (寧夏)、AWS GovCloud (米国東部)、および AWS GovCloud (米国西部) を除くすべての AWS リージョンでご利用いただけます。
  • コードスニペットのプレースホルダー値をご自身の値に置き換えます。

解決方法

Amazon EKS クラスター、サービスアカウントポリシー、RBAC ポリシーの作成

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

eksctl create cluster --name YOUR_CLUSTER_NAME --version 1.21 --fargate

注意: Fargate ポッド (--fargate) のみを使用するクラスターには、Fargate ポッド実行ロールを作成する必要はありません。

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

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

注:FargateExecutionRole は、kubeletkube-proxy が Fargate ポッドを実行するためのロールです。ただし、Fargate ポッド (つまり、aws-load-balancer-controller) に対するロールではありません。Fargate ポッドに対しては、サービスアカウントの IAM ロールを使用する必要があります。詳細については、「サービスアカウントの IAM ロール」を参照してください。

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

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

4.    ステップ 3 でダウンロードしたポリシーを使用して IAM ポリシーを作成するには、次のコマンドを実行します。

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

5.    AWS Load Balancer Controller の kube-system 名前空間に 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

6.    次のコマンドを実行し、新しいサービスロールが作成されたことを確認します。

eksctl get iamserviceaccount --cluster YOUR_CLUSTER_NAME --name aws-load-balancer-controller --namespace kube-system

- または -

kubectl get serviceaccount aws-load-balancer-controller --namespace kube-system

Helm を使用して AWS Load Balancer Controller をインストール

重要: 詳細については、Jetstack GitHub サイトの「cert-manager」および Kubernetes GitHub サイトの「Cert-manager issues with Fargate」というディスカッショントピックを参照してください。

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

helm repo add eks https://aws.github.io/eks-charts

2.    TargetGroupBinding カスタムリソース定義 (CRD) をインストールするには、次のコマンドを実行します。

kubectl apply -k "github.com/aws/eks-charts/stable/aws-load-balancer-controller//crds?ref=master"

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=<VPC_ID> \
    --set serviceAccount.name=aws-load-balancer-controller \
    -n kube-system

AWS Load Balancer Controller のテスト

AWS Load Balancer Controller を使用して、Ingress 用のALB または k8s サービスを作成するための Network Load Balancer を作成できます。以下の手順は、ALB Ingress で 2048 というサンプルアプリをデプロイする方法を示しています。

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

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

2.    サンプルゲームをデプロイし、AWS Load Balancer Controller が ALB Ingress リソースを作成することを確認するには、次のコマンドを実行します。

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

3.    数分後、次のコマンドを実行して Ingress リソースが作成されたことを確認します。

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

出力:

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

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

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

注意: このログには、デプロイに関する問題の診断に役立つエラーメッセージが含まれている可能性があります。

4.    ブラウザを開き、前のコマンド出力から ADDRESS URL に移動して、サンプルアプリケーションを表示します。

注意:数分待ってから、ブラウザを更新する必要がある場合があります。

NLB IP モードサービスを使用してサンプルアプリケーションをデプロイ

Network Load Balancer (NLB) IP モードを使用するには、少なくとも Kubernetes v1.16 以降を実行しているクラスターが必要です。

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

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

2.    2048 ゲームをデプロイするためのマニフェストを取得するには、次のコマンドを実行します。

curl -o 2048-game.yaml https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.1/docs/examples/2048/2048_full.yaml

3.    ステップ 2 のマニフェストで、次の Ingress セクションを削除します。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: game-2048
  name: ingress-2048
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: service-2048
              servicePort: 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:30159/TCP   23m

7.    Load Balancer がアクティブになるまで数分待ちます。次に、デプロイに到達できることを確認するには、ウェブブラウザで EXTERNAL-IP セクションで参照されている Network Load Balancer の完全修飾ドメイン名 (FQDN) を開きます。

AWS Load Balancer Controller のトラブルシューティング

Controller のセットアップに問題がある場合は、次のコマンドを実行します。

$ kubectl logs -n kube-system deployment.apps/aws-load-balancer-controller
$ kubectl get endpoints -n game-2048
$ kubectl get ingress/2048-ingress -n 2048-game

logs コマンドでは、一般的なエラーのトラブルシューティングを (Kubernetes GitHub ウェブサイトから) 行う際に役立つ、エラーメッセージ (タグやサブネットなど) が出力されます。get endpoints コマンドでは、バックアップされたデプロイポッドが正しく登録されているかどうかが表示されます。get ingress コマンドは、Ingress リソースがデプロイされているかどうかを表示します。


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


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