ロードバランサの作成

このトピックでは、GKE on AWS で AWS Elastic Load Balancer(ELB)を設定する方法について説明します。

LoadBalancer タイプの Service を作成すると、GKE on AWS コントローラは AWS に Classic または Network ELB を構成します。

クイックスタートに沿って、Google Cloud コンソールから外部に公開する Classic ELB を作成することや、AWS Application Load Balancer(ALB)を作成することもできます。

始める前に

GKE on AWS の使用を始める前に、次のことを確認してください。

  • 管理サービスをインストールしている。
  • ユーザー クラスタを作成している。
  • anthos-aws ディレクトリから anthos-gke を使用して、コンテキストをユーザー クラスタに切り替えている。
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME は、ユーザー クラスタ名に置き換えます。
  • curl コマンドライン ツールまたは同様のツールがインストールされている。

外部または内部ロードバランサの選択

GKE on AWS は、LoadBalancer リソースへのアノテーションに基づいて、外部(パブリック サブネット内)または内部(プライベート サブネット内)のロードバランサを作成します。

外部ロードバランサを選択すると、ノードプールのセキュリティ グループと、サブネットのネットワーク アクセス制御リスト(ACL)で許可されている IP アドレスからアクセスできます。

ロードバランサのタイプの選択

Classic Load Balancer(Classic ELB)と Network Load Balancer(NLB)のどちらを作成するかを選択します。ロードバランサのタイプの違いについては、AWS ドキュメントのロードバランサの種類をご覧ください。

LoadBalancer の作成

ロードバランサを作成するには、Deployment を作成して Service で公開します。

  1. Deployment を作成します。この Deployment のコンテナは、ポート 50001 でリッスンします。次の YAML を my-deployment-50001.yaml という名前のファイルに保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment-50001
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: "gcr.io/google-samples/hello-app:2.0"
            env:
            - name: "PORT"
              value: "50001"
    
  2. kubectl apply を使用して Deployment を作成します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-deployment-50001.yaml
    
  3. 次のようにして、3 つの Pod が実行中であることを確認します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get pods --selector=app=products
    
  4. Deployment に LoadBalancer タイプの Service を作成します。パブリック サブネットまたはプライベート サブネットのいずれかに、Classic ELB または Network ELB を作成できます。次のいずれかを選択します。

    • パブリック サブネット上の Classic ELB
    • パブリック サブネット上の NLB
    • プライベート サブネット上の Classic ELB
    • プライベート サブネット上の NLB

    次に、以下のマニフェストを my-lb-service.yaml という名前のファイルにコピーします。

    パブリック サブネット上の Classic ELB

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    パブリック サブネット上の NLB

    アノテーション service.beta.kubernetes.io/aws-load-balancer-typenlb に設定して、NLB を作成します。次の YAML にはこのアノテーションが含まれています。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    プライベート サブネット上の Classic ELB

    アノテーション service.beta.kubernetes.io/aws-load-balancer-internal"true" に設定して、プライベート LoadBalancer を作成します。次の YAML にはこのアノテーションが含まれています。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    

    プライベート サブネット上の NLB

    次のようにアノテーションを設定して、プライベート サブネットに NLB を作成します。

    • service.beta.kubernetes.io/aws-load-balancer-internal"true"
    • service.beta.kubernetes.io/aws-load-balancer-typenlb

    次の YAML には、この両方のアノテーションが含まれています。

    apiVersion: v1
    kind: Service
    metadata:
      name: my-lb-service
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-internal: "true"
        service.beta.kubernetes.io/aws-load-balancer-type: nlb
    spec:
      type: LoadBalancer
      selector:
        app: products
        department: sales
      ports:
      - protocol: TCP
        port: 60000
        targetPort: 50001
    
  5. kubectl apply を使用して Service を作成します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl apply -f my-lb-service.yaml
    
  6. kubectl get service で Service のホスト名を表示します。

    env HTTPS_PROXY=http://localhost:8118 \
      kubectl get service my-lb-service \
      --output jsonpath="{.status.loadBalancer.ingress..hostname}{'\n'}"
    

    出力は elb-id.elb.aws-region.amazonaws.com のようになります。

  7. 外部に公開されているロードバランサを作成済みで、パブリック VPC サブネットにアクセスできる場合は、curl を使用してロードバランサに接続できます。external-ip は、前の手順の kubectl get service の出力にある IP に置き換えます。

    curl external-ip:60000
    

    出力は次のようになります。

    Hello, world!
    Version: 2.0.0
    Hostname: my-deployment-50001-84b6dc5555-zmk7q
    

クリーンアップ

Service と Deployment を削除するには、kubectl delete を使用します。

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f my-lb-service.yaml

env HTTPS_PROXY=http://localhost:8118 \
  kubectl delete -f my-deployment-50001.yaml

トラブルシューティング

ロードバランサのエンドポイントにアクセスできない場合は、サブネットのタグ付けを試してください。

次のステップ