HTTP ロードバランサを設定する。

このページでは、AWS アプリケーション ロードバランサ(ALB)の設定方法について説明します。

GKE on AWS がサポートするほかのタイプのロードバランサについては、ロードバランサの概要をご覧ください。

準備

GKE on AWS で ALB を作成するには、まず次の作業を行う必要があります。

概要

クラスタで初めての ALB を作成するには、次の手順を行います。

  • ALB をプロビジョニングさせるサブネットを VPC 内で特定し、タグ付けする、またはアノテーションを付けます。
  • AWS リソースへのアクセス権を ALB コントローラに付与する AWS のロールを作成します。
  • オープンソースの aws-load-balancer-controller をインストールします。
  • ALB 構成を作成してデプロイします。

これ以降の ALB を作成するには、別の ALB 構成を作成してデプロイするだけです。

アプリケーション ロードバランサを作成する

ALB のサブネットにタグを付ける

ALB を作成する前に、どのサブネットで実行するかを AWS に伝える必要があります。通常の方法は、自動検出プロセスで使用できるようにサブネットを識別するタグを使用して、サブネットにタグ付けすることです。または、Ingress オブジェクトにアノテーションを追加して、実行するサブネットを明示的に一覧表示することもできます。

選択したサブネットを自動検出に利用できるようにタグ付けするには、サービス ロードバランサのサブネットにタグを付けるをご覧ください。

サブネットのリストで Ingress オブジェクトにアノテーションを付けるには、alb.ingress.kubernetes.io/subnets という名前のアノテーションを Kubernetes Ingress オブジェクトに追加します。アノテーションの値を、サブネット ID またはサブネット名のカンマ区切りのリストに設定します(例: subnet-012345678abcdef,subnet- abcdef123456789,subnet-123456789abcdef)。

AWS IAM 権限を作成する

AWS Load Balancer コントローラの IAM ポリシーをダウンロードします。このポリシーは、ロードバランサ コントローラが機能するために必要な権限を列挙します。ポリシーは GitHub で確認できます。 このコマンドは、ポリシーを iam_policy.json という名前のファイルに保存します。

  curl -Lo iam_policy.json \
    https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.4.4/docs/install/iam_policy.json
  1. このファイルを使用して、AWSLoadBalancerControllerIAMPolicy という名前の IAM ポリシーを作成します。

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

ロードバランサへのアクセス権を付与する

AWS IAM ロールを作成するの手順に沿って、コントローラのサービス アカウントの AWS IAM ロールを作成します。この手順では、以下の項目を置き換えます。

  • AWS_POLICY_ARN: 前の手順で作成した AWSLoadBalancerControllerIAPolicy の ARN
  • KSA_NAME: "aws-load-balancer-controller"
  • K8S_NAMESPACE: "kube-system"
  • AWS_ROLE_NAME: "AWSLBControllerRole"

ポリシーの ARN を取得するには、次のコマンドを実行します。

aws iam list-policies \
  --query 'Policies[?PolicyName==`AWSLoadBalancerControllerIAMPolicy`].Arn' \
  --output text

AWS ロードバランサ コントローラをインストールする

  1. 以下の手順を完了するには、次の値を抽出して保存します。これらは後で必要になります。

    次のコマンドを実行して、クラスタの UID を確認します。

      gcloud container aws clusters describe CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --format "value(uid)"
    

    次のコマンドを実行して、クラスタの VPC ID を確認します。

      gcloud container aws clusters describe CLUSTER_NAME \
        --location GOOGLE_CLOUD_LOCATION \
        --format "value(networking.vpcId)"
    

    次のコマンドを実行して、AWSLBControllerRole という名前のロールの ARN を確認します。

    aws iam get-role --role-name AWSLBControllerRole --query Role.Arn --output text
    

    次のコマンドを実行して、クラスタの AWS リージョンを確認します。

    gcloud container aws clusters describe CLUSTER_NAME \
      --location GOOGLE_CLOUD_LOCATION \
      --format "value(awsRegion)"
    

    次のように置き換えます。

    • GOOGLE_CLOUD_LOCATION は、クラスタに関連付けられている Google リージョンの名前に置き換えます。
    • CLUSTER_NAME は、使用するクラスタの名前に置き換えます。
  2. 次のコマンドで cert-manager をインストールします。

    kubectl apply \
      --validate=false \
      -f https://github.com/jetstack/cert-manager/releases/download/v1.10.0/cert-manager.yaml
    
  3. 次のコマンドで aws-load-balancer-controller のマニフェストをダウンロードし、ローカル ファイル v2_4_4_full.yaml に保存します。

    curl -Lo v2_4_4_full.yaml https://github.com/kubernetes-sigs/aws-load-balancer-controller/releases/download/v2.4.4/v2_4_4_full.yaml
    
  4. ファイル v2_4_4_full.yaml を編集して kind: Deployment を検索します。 Deployment オブジェクトは、この変更したバージョンに置き換えます。

    kind: Deployment
    metadata:
      labels:
        app.kubernetes.io/component: controller
        app.kubernetes.io/name: aws-load-balancer-controller
      name: aws-load-balancer-controller
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app.kubernetes.io/component: controller
          app.kubernetes.io/name: aws-load-balancer-controller
      template:
        metadata:
          labels:
            app.kubernetes.io/component: controller
            app.kubernetes.io/name: aws-load-balancer-controller
        spec:
          containers:
          - args:
            - --cluster-name=CLUSTER_UID
            - --aws-region=AWS_REGION
            - --aws-vpc-id=AWS_VPC_ID
            - --ingress-class=alb
            - --disable-restricted-sg-rules=true
            image: amazon/aws-alb-ingress-controller:v2.4.4
            env:
            - name: AWS_ROLE_ARN
              value: AWS_ROLE_ARN
            - name: AWS_WEB_IDENTITY_TOKEN_FILE
              value: /var/run/secrets/aws-load-balancer-controller/serviceaccount/token
            livenessProbe:
              failureThreshold: 2
              httpGet:
                path: /healthz
                port: 61779
                scheme: HTTP
              initialDelaySeconds: 30
              timeoutSeconds: 10
            name: controller
            ports:
            - containerPort: 9443
              name: webhook-server
              protocol: TCP
            resources:
              limits:
                cpu: 200m
                memory: 500Mi
              requests:
                cpu: 100m
                memory: 200Mi
            securityContext:
              allowPrivilegeEscalation: false
              readOnlyRootFilesystem: true
              runAsNonRoot: true
            volumeMounts:
            - mountPath: /tmp/k8s-webhook-server/serving-certs
              name: cert
              readOnly: true
            - mountPath: /var/run/secrets/aws-load-balancer-controller/serviceaccount
              name: aws-iam-token
              readOnly: true
          priorityClassName: system-cluster-critical
          securityContext:
            fsGroup: 1337
          serviceAccountName: aws-load-balancer-controller
          terminationGracePeriodSeconds: 10
          volumes:
          - name: cert
            secret:
              defaultMode: 420
              secretName: aws-load-balancer-webhook-tls
          - name: aws-iam-token
            projected:
              defaultMode: 420
              sources:
              - serviceAccountToken:
                  audience: sts.amazonaws.com
                  expirationSeconds: 86400
                  path: token
    ---
    

    次のように置き換えます。

    • CLUSTER_UID: クラスタの UID(例: bbc7d232-21f6-4bb1-90dd-4b064cf8ccf8)。
    • AWS_VPC_ID: AWS VPC の ID(例: vpc-1234567890abc)。
    • AWS_ROLE_ARN: AWSLBControllerRole という名前のロールの ARN。
    • AWS_REGION: クラスタの AWS リージョン(例: us-east-1
  5. 次のコマンドを使用して、変更したマニフェストをクラスタに適用します。

    kubectl apply -f v2_4_4_full.yaml
    
  6. 次のコマンドを使用して、ロードバランサ コントローラが実行されていることを確認します。

    kubectl get deployment -n kube-system aws-load-balancer-controller
    

    出力は次のようになり、aws-load-balancer-controller Deployment が利用可能であることが示されます。

    NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
    aws-load-balancer-controller   1/1     1            1           51s
    

サンプルの ALB を作成する

このセクションでは、ゲーム 2048 のリメイクを配信するサンプル ALB を作成する方法を説明します。

  1. 次の YAML 構成を 2048.yaml というファイルにコピーします。この構成により、Kubernetes の Namespace、Service、Deployment が作成されます。Deployment は Ingress ALB を通じて公開されます。

    apiVersion: v1
    kind: Namespace
    metadata:
      name: game-2048
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      namespace: game-2048
      name: deployment-2048
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: app-2048
      replicas: 5
      template:
        metadata:
          labels:
            app.kubernetes.io/name: app-2048
        spec:
          containers:
          - image: alexwhen/docker-2048
            imagePullPolicy: Always
            name: app-2048
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      namespace: game-2048
      name: service-2048
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      type: NodePort
      selector:
        app.kubernetes.io/name: app-2048
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      namespace: game-2048
      name: ingress-2048
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: service-2048
                    port:
                      number: 80
    
  2. 次のコマンドを使用して、クラスタに構成を適用します。

    kubectl apply -f 2048.yaml
    
  3. 次のコマンドを使用して Ingress リソースのステータスを確認します。

    kubectl get ingress -n game-2048 ingress-2048
    

    コマンドの出力は次のようになります。ADDRESS 列には Ingress リソースのエンドポイントが含まれます。

     NAME           CLASS    HOSTS   ADDRESS                                                                   PORTS   AGE
     ingress-2048   <none>   *       k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com   80      2m19s
     ```
    
  4. ブラウザで ALB エンドポイントに移動します(例: http://k8s-game2048-ingress2-e2c347319a-1195690687.us-west-2.elb.amazonaws.com)。2048 ゲームが表示され、ALB ロードバランサが正常にデプロイされて構成されていることが示されます。

クリーンアップ

前の手順で作成したサンプル ALB と Deployment を削除するには、次のコマンドを使用してマニフェストを削除します。

kubectl delete -f 2048.yaml

次のステップ