このページでは、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを構築する外部 LoadBalancer Service をデプロイする方法について説明します。このページを読む前に、次のコンセプトをよく理解しておいてください。
バックエンド サービスベースの外部パススルー ネットワーク ロードバランサ
クラスタ管理者は、外部 LoadBalancer Service を作成して、クラスタ外のクライアントが Service の Pod にパケットを送信できるようにします。次の図は、2 つの外部 LoadBalancer Service(store-v1-lb-svc
と store-v2-lb-svc
)用に作成された 2 つのバックエンド サービスベースの外部パススルー ネットワーク ロードバランサを示しています。両方のロードバランサがクラスタ内のノードにパケットを配信し、ノードはサービスを提供する Pod にパケットを転送します。
このガイドでは、次の手順に沿って store-v1-lb-svc
という名前の外部 LoadBalancer Service を設定する方法について説明します。
HttpLoadBalancing
アドオンを有効にしてクラスタを作成します。cloud.google.com/l4-rbs
アノテーションを含む Service を作成します。このアノテーションは、リージョン バックエンド サービスを使用するバックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成するように GKE に指示します。ロードバランサが
store-v1-lb-svc
Service の Pod にパケットを正常に配信していることを確認します。また、GKE がバックエンド サービスベースの外部パススルー ネットワーク ロードバランサのコンポーネントを作成したことを確認します。- 転送ルール
- リージョン バックエンド サービス
- インスタンス グループ
- ヘルスチェック
- VPC ファイアウォール ルール
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
次のように置き換えます。
CLUSTER_NAME
: 新しいクラスタの名前。RELEASE_CHANNEL
: クラスタの GKE リリース チャンネルの名前。VERSION
: クラスタ用の GKE バージョン。1.24.9 以降にする必要があります。COMPUTE_LOCATION
: クラスタの Compute Engine のリージョン。
新しいクラスタでは、HttpLoadBalancing
アドオンがデフォルトで有効になっています。このアドオンは、コントロール プレーンがバックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成および管理するために必要です。
既存のクラスタをアップグレードする
gcloud CLI を使用して既存のクラスタを更新し、バックエンド サービスベースの外部パススルー ネットワーク ロードバランサの作成をサポートできるようにします。
コントロール プレーンを GKE バージョン 1.24.9 以降にアップグレードします。
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=VERSION \ --master \ --location=COMPUTE_LOCATION
次のように置き換えます。
CLUSTER_NAME
: クラスタの名前。VERSION
: GKE のバージョン。1.24.9 以降にする必要があります。バージョンは、クラスタのリリース チャンネルで有効なマイナー バージョンである必要があります。詳細については、コントロール プレーンの手動アップグレードをご覧ください。COMPUTE_LOCATION
: 新しいクラスタの Compute Engine のロケーション。
外部 LoadBalancer Service を作成する
次のサンプル 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
マニフェストをクラスタに適用します。
kubectl apply -f store-deployment.yaml
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
次の 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.ipFamilyPolicy
とipFamilies
を追加して、GKE が Service に IP アドレスを割り振る方法を定義します。ipFamilyPolicy
とipFamilies
の仕様を使用する場合は、次の条件を考慮してください。- バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成すると、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をご覧ください。
- バックエンド サービスベースの外部パススルー ネットワーク ロードバランサを作成すると、GKE は IPv4 / IPv6 デュアルスタック クラスタで作成された新しいサービスに
マニフェストをクラスタに適用します。
kubectl apply -f store-v1-lb-svc.yaml
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
を割り当てました。ロードバランサへの接続をテストします。
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 とそのコンポーネントを確認する
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
アノテーションは、ロードバランサのヘルスチェックに必要なファイアウォール ルールの名前を示します。
外部 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 がそれらを使用する必要がない場合のみ。
次のステップ
- ロードバランサ Service の概要については、LoadBalancer Service をご覧ください。
- ロードバランサ Service のパラメータの詳細については、LoadBalancer Service のパラメータをご覧ください。
- GKE でのロード バランシングのトラブルシューティング。