ネットワーク ロードバランサを作成する

このページでは、AWS Elastic Load Balancer(ELB)またはネットワーク ロードバランサ(NLB)エンドポイントを使用して L4 ロードバランサを設定する方法について説明します。

GKE on AWS で使用できる他のタイプのロードバランサの詳細については、ロードバランサの概要をご覧ください。

準備

ロードバランサ タイプを選択する

GKE on AWS は、AWS Classic Elastic Load Balancer(Classic ELB)または NLB として Service ロードバランサを作成します。デフォルトでは、GKE on AWS は Classic ELB を作成します。NLB を作成するには、service.beta.kubernetes.io/aws-load-balancer-type アノテーションを nlb に設定します。ロードバランサのタイプの違いについては、AWS ドキュメントのロードバランサの種類をご覧ください。

インターネット接続ロードバランサまたは内部ロードバランサを選択する

サービス ロードバランサは、インターネット接続(一般公開された解決可能な DNS 名を持つ)または内部(VPC 内でのみアクセス可能)のいずれかです。

デフォルトでは、新しいロードバランサはインターネットに接続します。内部ロードバランサを作成するには、マニフェストで service.beta.kubernetes.io/aws-load-balancer-internal アノテーションを "true" に設定します。

aws-load-balancer-internal アノテーションを既存のサービスに適用することはできません。インターネット接続と内部構成を変更するには、既存の LoadBalancer を削除して再作成する必要があります。

サブネットを選択する

ロードバランサを作成するとき、AWS はロードバランサを配置するサブネットを認識する必要があります。デフォルトでは、これらのサブネットは VPC 内のサブネットから自動的に検出されます。そのためには、サブネットに特定のタグが必要です。サブネットの自動検出とタグ付けの詳細については、ロードバランサのサブネットをご覧ください。

また、service.beta.kubernetes.io/aws-load-balancer-subnets アノテーションをサービスに追加することで、アノテーションを使用してロードバランサのサブネットを指定することもできます。このアノテーションの値は、subnet-012345678abcdef,subnet-abcdef123456789,subnet-123456789abcdef のように、サブネット ID またはサブネット名のカンマ区切りのリストです。

ロードバランサの例を作成する

LoadBalancer タイプの Service を作成するには、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 を作成します。

    kubectl apply -f my-deployment-50001.yaml
    
  3. 次のようにして、3 つの Pod が実行中であることを確認します。

    kubectl get pods --selector=app=products
    
  4. Deployment に LoadBalancer タイプの Service を作成します。

  5. 必要なロードバランサの種類を決定します。

    • インターネットに接続する Classic ELB
    • インターネットに接続する NLB
    • 内部 Classic ELB
    • 内部 NLB

    要件を満たすタブを選択し、その中のマニフェストを my-lb-service.yaml という名前のファイルにコピーします。

    インターネット接続 Classic

    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

    アノテーション 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
    
  6. kubectl apply を使用して Service を作成します。

    kubectl apply -f my-lb-service.yaml
    
  7. kubectl get service で Service のアドレスを表示します。

    kubectl get service my-lb-service
    

    出力には、ロードバランサのアドレス(ロードバランサの作成方法に応じて、パブリックまたはプライベートのいずれか)が表示される列 EXTERNAL-IP が含まれます。

  8. インターネット接続ロードバランサを作成した場合は、次のコマンドを使用して curl でロードバランサに接続できます。

    curl http://EXTERNAL_IP:60000
    

    EXTERNAL_IP は、前の手順の EXTERNAL-IP 列のアドレスに置き換えます。

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

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

クリーンアップ

サービスとデプロイを削除するには、kubectl delete コマンドを使用します。

kubectl delete -f my-lb-service.yaml
kubectl delete -f my-deployment-50001.yaml

次のステップ