バックエンド サービスベースの外部ロードバランサを作成する


このページでは、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを構築する外部 LoadBalancer Service をデプロイする方法について説明します。このページを読む前に、次のことをよく理解しておいてください。

外部パススルー ネットワーク ロードバランサの一般的な詳細については、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサをご覧ください。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

要件

  • 外部 LoadBalancer Service を作成するには、GKE クラスタでバージョン 1.25.5 以降を使用する必要があります。重み付けされたロード バランシングを使用するには、クラスタでバージョン 1.31.0-gke.1506000 以降を使用する必要があります。

  • クラスタで HttpLoadBalancing アドオンが有効になっている必要があります。このアドオンはデフォルトで有効になっています。これにより、クラスタは、バックエンド サービスを使用するロードバランサを管理できます。

クラスタを選択する

新しいクラスタを作成することも、要件を満たす既存のクラスタを選択することもできます。

新しいクラスタを作成する

Autopilot

新しい Autopilot クラスタを作成するには:

gcloud container clusters create-auto CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

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

Standard

新しい Standard クラスタを作成するには:

gcloud container clusters create CLUSTER_NAME \
    --release-channel=RELEASE_CHANNEL \
    --cluster-version=VERSION \
    --location=COMPUTE_LOCATION

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

既存のクラスタをアップグレードする

gcloud CLI を使用して既存のクラスタを更新します。

gcloud container clusters upgrade CLUSTER_NAME \
    --cluster-version=VERSION \
    --master \
    --location=COMPUTE_LOCATION

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

サンプル ワークロードをデプロイする

外部 LoadBalancer Service のサービング Pod を提供する次のサンプル ワークロードをデプロイします。

  1. 次のサンプル Deployment を store-deployment.yaml として保存します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store
    spec:
      replicas: 20
      selector:
        matchLabels:
          app: store
      template:
        metadata:
          labels:
            app: store
        spec:
          containers:
          - image: gcr.io/google_containers/echoserver:1.10
            imagePullPolicy: Always
            name: echoserver
            ports:
              - name: http
                containerPort: 8080
            readinessProbe:
              httpGet:
                path: /healthz
                port: 8080
                scheme: HTTP
    
  2. マニフェストをクラスタに適用します。

    kubectl apply -f store-deployment.yaml
    
  3. Deployment に 20 のサービング Pod があることを確認します。

    kubectl get pods
    

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

    NAME                     READY   STATUS    RESTARTS   AGE
    store-cdb9bb4d6-s25vw      1/1     Running   0          10s
    store-cdb9bb4d6-vck6s      1/1     Running   0          10s
    ....
    

外部 LoadBalancer Service を作成する

外部 LoadBalancer Service を作成して、サンプル ワークロードを公開します。

  1. 次の Service マニフェストを store-v1-lb-svc.yaml として保存します。

    apiVersion: v1
    kind: Service
    metadata:
      name: store-v1-lb-svc
      annotations:
        cloud.google.com/l4-rbs: "enabled"
    spec:
      type: LoadBalancer
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    
  2. マニフェストをクラスタに適用します。

    kubectl apply -f store-v1-lb-svc.yaml
    

このサンプル マニフェストについては、次の点に注意してください。

  • マニフェストがクラスタに初めて適用されるときに、Service マニフェストに cloud.google.com/l4-rbs: "enabled" アノテーションを含める必要があります。バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成するように GKE に指示します。IPv6 や重み付けロード バランシングなどの機能をサポートするには、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサが必要です。

  • cloud.google.com/l4-rbs: "enabled" アノテーションを既存の外部 LoadBalancer Service のマニフェストに追加した場合(つまり、ロードバランサの作成後)、GKE はアノテーションを無視します。マニフェストにこのアノテーションがない状態で作成された外部 LoadBalancer Service は、ターゲット プールベースの外部パススルー ネットワーク ロードバランサを使用します。ターゲット プールベースの外部パススルー ネットワーク ロードバランサの使用はおすすめしません。

重み付きロード バランシングを有効にする

各ノードに存在するサービング Pod、準備完了 Pod、終了していない Pod の数に基づいて、新しい接続をノードに比例して分散するには、Service マニフェストに networking.gke.io/weighted-load-balancing: "pods-per-node" アノテーションを追加して、重み付けロード バランシングを有効にします。

  1. networking.gke.io/weighted-load-balancing: "pods-per-node" アノテーションを store-v1-lb-svc.yaml Service マニフェストに追加し、次のように externalTrafficPolicy: Local も設定します。

    apiVersion: v1
    kind: Service
    metadata:
      name: store-v1-lb-svc
      annotations:
        cloud.google.com/l4-rbs: "enabled"
        networking.gke.io/weighted-load-balancing: "pods-per-node"
    spec:
      type: LoadBalancer
      externalTrafficPolicy: Local
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    
  2. マニフェストをクラスタに適用します。

    kubectl apply -f store-v1-lb-svc.yaml
    

重み付きロード バランシングに関するこの例については、次の点に注意してください。

  • Service マニフェストは externalTrafficPolicy: Local を使用します。重み付きロード バランシングを有効にする必要がない場合は、externalTrafficPolicy: Cluster を使用することもできます。externalTrafficPolicy がノードグループを定義する方法、どのノードがロードバランサのヘルスチェックに合格するのか、パケットの処理方法の詳細については、LoadBalancer Service のコンセプトをご覧ください。

  • 重み付けロード バランシングを有効にしても、GKE で externalTrafficPolicy: Cluster を使用できないわけではありませんが、externalTrafficPolicy: Cluster ではロードバランサの後にパケットが別のノードに転送される可能性があるため、重み付けロード バランシングが事実上無効になります。

kubectl edit svc service-name を使用して、既存の外部 LoadBalancer Service で重み付けされたロード バランシングを有効にすることもできます。kubectl edit コマンドを使用すると、構成したテキスト エディタで既存のロードバランサの Service マニフェストが開きます。ここで、マニフェストを変更して保存できます。既存の外部 LoadBalancer Service を編集する場合は、次の点に注意してください。

  • 既存の外部 LoadBalancer Service によって、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサが作成されている必要があります。つまり、マニフェストがクラスタに最初に適用されたときに、既存の外部 LoadBalancer Service に cloud.google.com/l4-rbs: "enabled" アノテーションが含まれている必要があります。

    ターゲット プールベースの外部パススルー ネットワーク ロードバランサを使用する既存の外部 LoadBalancer Service に networking.gke.io/weighted-load-balancing: "pods-per-node" アノテーションを追加しても効果はありません。

  • 既存の外部 LoadBalancer Service マニフェストを更新する場合は、externalTrafficPolicy: Local を設定してください。externalTrafficPolicy: Cluster を使用すると、パケットがロードバランサの後に別のノードに転送される可能性があるため、重み付けロード バランシングが無効になります。

重み付きロード バランシングを無効にする

各ノードに存在するサービング Pod の数に関係なく、新しい接続をノードに分散するには、Service マニフェストから networking.gke.io/weighted-load-balancing: "pods-per-node" アノテーションを削除して、重み付けロード バランシングを無効にします。

外部 LoadBalancer Service とそのコンポーネントを確認する

  1. Service が実行されていることを確認します。

    kubectl get svc store-v1-lb-svc
    

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

    NAME               TYPE           CLUSTER-IP        EXTERNAL-IP     PORT(S)          AGE
    store-v1-lb-svc   LoadBalancer   10.44.196.160     35.193.28.231   8080:32466/TCP   11m
    

    GKE は、外部パススルー ネットワーク ロードバランサの EXTERNAL_IP を割り当てました。

  2. ロードバランサへの接続をテストします。

    curl EXTERNAL_IP:PORT
    

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

    • EXTERNAL_IP: 外部パススルー ネットワーク ロードバランサに割り振られた IP アドレス。
    • PORT: 外部パススルー ネットワーク ロードバランサに割り当てられたポート番号。

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

    Hostname: store-v1-lb-svc-cdb9bb4d6-hflxd
    
    Pod Information:
      -no pod information available-
    
    Server values:
      server_version=nginx: 1.13.3 - lua: 10008
    
    Request Information:
      client_address=10.128.0.50
      method=GET
      real path=/
      query=
      request_version=1.1
      request_scheme=http
      request_uri=EXTERNAL_IP
    
    Request Headers:
      accept=*/*
      host=EXTERNAL_IP
      user-agent=curl/7.81.0
    
    Request Body:
      -no body in request-
    
    
  3. LoadBalancer Service と、Google Cloud リソースを記述する一連のアノテーションを確認します。

    kubectl describe svc store-v1-lb-svc
    

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

    Name:                     my-service-external
    Namespace:                default
    Labels:                   <none>
    Annotations:              cloud.google.com/l4-rbs: enabled
                              networking.gke.io/weighted-load-balancing: pods-per-node #This annotation appears in the output only if weighted load balancing is enabled.
                              service.kubernetes.io/backend-service: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/firewall-rule-for-hc: k8s2-qvveq1d8-default-my-service-ext-5s55db85-fw
                              service.kubernetes.io/healthcheck: k8s2-qvveq1d8-default-my-service-ext-5s55db85
                              service.kubernetes.io/tcp-forwarding-rule: a808124abf8ce406ca51ab3d4e7d0b7d
    Selector:                 app=my-app
    Type:                     LoadBalancer
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.18.102.23
    IPs:                      10.18.102.23
    LoadBalancer Ingress:     35.184.160.229
    Port:                     tcp-port  8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 tcp-port  31864/TCP
    Endpoints:                10.20.1.28:8080,10.20.1.29:8080
    Session Affinity:         None
    External Traffic Policy:  Local
    HealthCheck NodePort:     30394
    
    Events:
      Type    Reason                Age                    From                     Message
      ----    ------                ----                   ----                     -------
      Normal  ADD                   4m55s                  loadbalancer-controller  default/my-service-ext
    

    バックエンド サービスベースの外部パススルー ネットワーク ロードバランサとその Google Cloud リソースが正常に作成されたことを示すフィールドがいくつかあります。

    • Events フィールド。LoadBalancer Service とそのリソースが正常に作成された場合、このフィールドは空になります。エラーが発生した場合は、ここに表示されます。
    • Annotations のリストが有効: GKE は、読み取り専用アノテーションの次のリストを Service マニフェストに追加します。名前が service.kubernetes.io/ で始まる各アノテーションは、ロードバランサの一部として作成された、またはロードバランサをサポートする Google Cloud リソースの名前を示すために使用されます。

      • networking.gke.io/weighted-load-balancing: pods-per-node アノテーションは、重み付きロード バランシングが適用され、ロードバランサが各ノードで実行されている Pod の数に基づいてバックエンド Pod にトラフィックを分散することを示します。
      • service.kubernetes.io/backend-service アノテーションは、ロードバランサのバックエンド サービスの名前を示します。
      • service.kubernetes.io/healthcheck アノテーションは、バックエンド サービスによって使用されるロードバランサのヘルスチェックの名前を示します。
      • service.kubernetes.io/tcp-forwarding-rule アノテーションまたは service.kubernetes.io/udp-forwarding-rule アノテーションは、ロードバランサの転送ルールの名前を示します。
      • service.kubernetes.io/firewall-rule アノテーションは、クラスタノードへのトラフィックを許可するために作成されたファイアウォール ルールの名前を示します。このファイアウォール ルールのソース範囲は、spec.loadBalancerSourceRanges[] を使用してカスタマイズできます。LoadBalancer Service のファイアウォール ルールの詳細については、ファイアウォール ルールと送信元 IP アドレスの許可リストをご覧ください。
      • service.kubernetes.io/firewall-rule-for-hc アノテーションは、ロードバランサのヘルスチェックに必要なファイアウォール ルールの名前を示します。
  4. 外部 LoadBalancer Service のロードバランサ リソースとファイアウォール ルールが作成されていることを確認します。

    • 転送ルールを表示するには、次のコマンドを実行します。

        gcloud compute forwarding-rules describe FWD_RULE_NAME \
          --region=REGION_NAME
      

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

      • FWD_RULE_NAME: 読み取り専用アノテーション service.kubernetes.io/tcp-forwarding-rule または service.kubernetes.io/udp-forwarding-rule によって提供される転送ルール名。これらのアノテーションを確認するには、kubectl describe svc SERVICE_NAME を実行します。
      • REGION_NAME: クラスタを含む Google Cloud リージョン。ゾーンクラスタの場合、リージョンにはクラスタが使用するゾーンが含まれています。
    • バックエンド サービスを表示するには、次のコマンドを実行します。

      gcloud compute backend-services describe BACKEND_SERVICE_NAME \
        --region=REGION_NAME
      

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

      • BACKEND_SERVICE_NAME: service.kubernetes.io/backend-service 読み取り専用アノテーションによって提供されるバックエンド サービスの名前。この読み取り専用アノテーションを確認するには、kubectl describe svc SERVICE_NAME を実行します。
      • REGION_NAME: クラスタを含む Google Cloud リージョン。ゾーンクラスタの場合、リージョンにはクラスタが使用するゾーンが含まれています。
    • ロードバランサのヘルスチェックを表示するには、次のコマンドを実行します。

      gcloud compute health-checks describe HEALTH_CHECK_NAME \
        --region=REGION_NAME
      

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

      • HEALTH_CHECK_NAME: ロードバランサのヘルスチェック名。ヘルスチェックの名前は、service.kubernetes.io/healthcheck 読み取り専用アノテーションによって提供されます。この読み取り専用アノテーションを確認するには、kubectl describe svc SERVICE_NAME を実行します。
      • REGION_NAME: クラスタを含む Google Cloud リージョン。ゾーンクラスタの場合、リージョンにはクラスタが使用するゾーンが含まれています。
    • ファイアウォール ルールを表示するには、次のコマンドを実行します。

      gcloud compute firewall-rules describe FIREWALL_RULE_NAME \
      gcloud compute firewall-rules describe HEALTH_CHECK_FIREWALL_RULE_NAME
      

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

      • FIREWALL_RULE_NAME: ロードバランサへのトラフィックを許可するファイアウォール ルールの名前。このファイアウォール ルールの名前は、service.kubernetes.io/firewall-rule 読み取り専用アノテーションによって提供されます。この読み取り専用アノテーションを確認するには、kubectl describe svc SERVICE_NAME を実行します。
      • HEALTH_CHECK_FIREWALL_RULE_NAME: ロードバランサのバックエンド(クラスタのノード)のヘルスチェックを許可するファイアウォール ルールの名前。このファイアウォール ルールの名前は、service.kubernetes.io/firewall-rule-for-hc 読み取り専用アノテーションによって提供されます。この読み取り専用アノテーションを確認するには、kubectl describe svc SERVICE_NAME を実行します。

外部 LoadBalancer Service を削除する

サンプルの store-v1-lb-svc 外部 LoadBalancer Service を削除するには、次のコマンドを使用します。

kubectl delete service store-v1-lb-svc

GKE は、外部 LoadBalancer Service 用に作成したすべてのロードバランサ リソースを自動的に削除します。

外部 LoadBalancer Service のトラブルシューティング

externalTrafficPolicy: Local を設定しないと、次のコマンドを使用して Service の説明を取得するときに、警告イベントが発生することがあります。

kubectl describe svc store-v1-lb-svc`
Events:
  Type     Reason                   Age      From                     Message
  ----     ------                   ----     ----                     -------
  Warning  UnsupportedConfiguration 4m55s    loadbalancer-controller  Weighted load balancing by pods-per-node has no effect with External Traffic Policy: Cluster.

重み付きロード バランシングを有効にするには、externalTrafficPolicy: Local を設定する必要があります。

次のステップ