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


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

バックエンド サービスベースの外部パススルー ネットワーク ロードバランサ

クラスタ管理者は、外部 LoadBalancer Service を作成して、クラスタ外のクライアントが Service の Pod にパケットを送信できるようにします。次の図は、2 つの外部 LoadBalancer Service(store-v1-lb-svcstore-v2-lb-svc)用に作成された 2 つのバックエンド サービスベースの外部パススルー ネットワーク ロードバランサを示しています。両方のロードバランサがクラスタ内のノードにパケットを配信し、ノードはサービスを提供する Pod にパケットを転送します。

リージョン バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを利用する外部 LoadBalancer Service

このガイドでは、次の手順に沿って store-v1-lb-svc という名前の外部 LoadBalancer Service を設定する方法について説明します。

  1. HttpLoadBalancing アドオンを有効にしてクラスタを作成します。
  2. cloud.google.com/l4-rbs アノテーションを含む Service を作成します。このアノテーションは、リージョン バックエンド サービスを使用するバックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成するように GKE に指示します。
  3. ロードバランサが store-v1-lb-svc Service の Pod にパケットを正常に配信していることを確認します。また、GKE がバックエンド サービスベースの外部パススルー ネットワーク ロードバランサのコンポーネントを作成したことを確認します。

    • 転送ルール
    • リージョン バックエンド サービス
    • インスタンス グループ
    • ヘルスチェック
    • VPC ファイアウォール ルール
  4. store-v1-lb-svc 外部 LoadBalancer Service を削除します。

始める前に

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

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

クラスタを設定する

クラスタの作成

gcloud CLI を使用して、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサの作成をサポートする新しいクラスタを作成します。

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

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

新しいクラスタでは、HttpLoadBalancing アドオンがデフォルトで有効になっています。このアドオンは、コントロール プレーンがバックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成および管理するために必要です。

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

gcloud CLI を使用して既存のクラスタを更新し、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサの作成をサポートできるようにします。

  1. コントロール プレーンを GKE バージョン 1.24.9 以降にアップグレードします。

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

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

外部 LoadBalancer Service を作成する

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

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: store
    spec:
      replicas: 2
      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 に 2 つのサービスを提供する 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
    
  4. 次の 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
      externalTrafficPolicy: Cluster
      selector:
        app: store
      ports:
      - name: tcp-port
        protocol: TCP
        port: 8080
        targetPort: 8080
    

    この外部 LoadBalancer Service は、Cluster のデフォルトの externalTrafficPolicy を使用します。externalTrafficPolicy がノードグループを定義する方法、どのノードがロードバランサのヘルスチェックに合格するか、パケット処理の詳細については、LoadBalancer Service のコンセプトをご覧ください。

    IPv4 / IPv6 デュアルスタック クラスタを使用している場合は、spec.ipFamilyPolicyipFamilies を追加して、GKE が Service に IP アドレスを割り振る方法を定義します。ipFamilyPolicyipFamilies の仕様を使用する場合は、次の条件を考慮してください。

    • バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成すると、GKE は IPv4 / IPv6 デュアルスタック クラスタで作成された新しいサービスに cloud.google.com/l4-rbs アノテーションを自動的に追加します。ただし、cloud.google.com/l4-rbs: "enabled" アノテーションを既存の Service マニフェストに追加すると、クラスタ内にすでに存在する LoadBalancer Service は、ターゲット プールベースの外部パススルー ネットワーク ロードバランサを引き続き使用します(IPv4 のみ)。詳細については、ノードグループをご覧ください。
    • GKE は、シングルスタック(IPv4 のみ、または IPv6 のみ)またはデュアルスタックの LoadBalancer Service を割り当てることができます。デュアルスタック LoadBalancer Service は、2 つの異なる外部パススルー ネットワーク ロードバランサ転送ルール(IPv4 経由の TCP トラフィックを処理するルールと IPv6 の TCP トラフィックを処理するルール)を使用して実装されます。詳細については、Serviceをご覧ください。
  5. マニフェストをクラスタに適用します。

    kubectl apply -f store-v1-lb-svc.yaml
    
  6. 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 を割り当てました。

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

    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-
    
    

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

  1. LoadBalancer Service と、Google Cloud リソースを記述する一連のアノテーションを確認します。

    kubectl describe svc store-v1-lb-svc
    

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

    Name:                     store-v1-lb-svc
    Namespace:                default
    Labels:                   <none>
    Annotations:              cloud.google.com/l4-rbs: enabled
                              service.kubernetes.io/backend-service: k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
                              service.kubernetes.io/firewall-rule: k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
                              service.kubernetes.io/firewall-rule-for-hc: k8s2-c086604n-l4-shared-hc-fw
                              service.kubernetes.io/healthcheck: k8s2-c086604n-l4-shared-hc
                              service.kubernetes.io/tcp-forwarding-rule: a683373f85bfe433ba929a50ca8d72e2
    Selector:                 app=store
    Type:                     LoadBalancer
    IP Family Policy:         SingleStack
    IP Families:              IPv4
    IP:                       10.44.196.160
    IPs:                      10.44.196.160
    LoadBalancer Ingress:     35.193.28.231
    Port:                     tcp-port  8080/TCP
    TargetPort:               8080/TCP
    NodePort:                 tcp-port  32466/TCP
    Endpoints:                10.48.0.5:8080,10.48.2.8:8080
    Session Affinity:         None
    External Traffic Policy:  Cluster
    Events:
      Type    Reason                Age                   From                     Message
      ----    ------                ----                  ----                     -------
      Normal  ADD                   2m42s                 loadbalancer-controller  default/store-v1-lb-svc
      Normal  EnsuringLoadBalancer  102s (x2 over 2m42s)  service-controller       Ensuring load balancer
      Normal  Annotations           102s                  loadbalancer-controller  map[cloud.google.com/l4-rbs:enabled kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":"Service","metadata":{"annotations":
    {"cloud.google.com/l4-rbs":"enabled"},"name":"store-v1-lb-svc","namespace":"default"}
    ,"spec":{"externalTrafficPolicy":"Cluster","ports":
    [{"name":"tcp-port","port":8080,"protocol":"TCP","targetPort":8080}],
    "selector":{"app":"store"},"type":"LoadBalancer"}}
    ] -> map[cloud.google.com/l4-rbs:enabled
    kubectl.kubernetes.io/last-applied-configuration:{"apiVersion":"v1","kind":
    "Service","metadata":{"annotations":{"cloud.google.com/l4-rbs":"enabled"},
    "name":"store-v1-lb-svc","namespace":"default"},"spec":{"externalTrafficPolicy"
    :"Cluster","ports":[{"name":"tcp-port","port":8080,"protocol":"TCP","targetPort"
    :8080}],"selector":{"app":"store"},"type":"LoadBalancer"}}
    service.kubernetes.io/backend-service:k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
    service.kubernetes.io/firewall-rule:k8s2-c086604n-default-store-v1-lb-svc-aip4ty1x
    service.kubernetes.io/firewall-rule-for-hc:k8s2-c086604n-l4-shared-hc-fw
    service.kubernetes.io/healthcheck:k8s2-c086604n-l4-shared-hc
    service.kubernetes.io/tcp-forwarding-rule:a683373f85bfe433ba929a50ca8d72e2]
    Normal  SyncLoadBalancerSuccessful  16s (x3 over 102s)  loadbalancer-controller  Successfully ensured L4 External LoadBalancer resources
    

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

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

    • 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 アノテーションは、ロードバランサのヘルスチェックに必要なファイアウォール ルールの名前を示します。

  2. 外部 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 は、次のリソースを削除します。

  • ロードバランサの転送ルール。
  • ロードバランサのバックエンド サービス。
  • ロードバランサのヘルスチェック。
  • ロードバランサとそのヘルスチェック トラフィックに必要な VPC ファイアウォール ルール。
  • ゾーンの非マネージド インスタンス グループのバックエンド。クラスタによって作成された他のロードバランサ用のバックエンドとして GKE がそれらを使用する必要がない場合のみ。

次のステップ