このページでは、Google Kubernetes Engine(GKE)で内部パススルー ネットワーク ロードバランサまたは内部ロードバランサを作成する方法について説明します。外部パススルー ネットワーク ロードバランサを作成する場合は、LoadBalancer タイプの Service を作成するをご確認ください。
このページを読む前に、次の内容をよく理解しておいてください。
内部パススルー ネットワーク ロードバランサの使用
内部パススルー ネットワーク ロードバランサにより、クラスタの VPC ネットワーク内に配置されたクライアントと、クラスタの VPC ネットワークに接続されたネットワーク内のクライアントが、クラスタの Service にアクセスできるようになります。クラスタの VPC ネットワーク内のクライアントは、クラスタのノードまたは Pod にすることも、クラスタ外の VM にすることもできます。接続されたネットワーク内のクライアントからの接続の詳細については、内部パススルー ネットワーク ロードバランサと接続ネットワークをご覧ください。
GKE のサブセット化の使用
GKE のサブセット化は、インスタンス グループではなく GCE_VM_IP ネットワーク エンドポイント グループ(NEG)をバックエンドとして使用するため、内部 LoadBalancer Service のスケーラビリティを向上させます。GKE のサブセット化を有効にすると、GKE は内部 LoadBalancer Service のコンピューティング ゾーンごとに 1 つの NEG を作成します。
Service の externalTrafficPolicy は、GCE_VM_IP NEG バックエンドのノード メンバーシップを制御します。詳細については、GCE_VM_IP NEG バックエンドのノード メンバーシップをご覧ください。
ゾーン アフィニティを使用する
内部パススルー ネットワーク ロードバランサでゾーン アフィニティを有効にすると、GKE はゾーンから発信されたトラフィックを同じゾーン内のノードと Pod に転送します。ゾーンに正常な Pod がない場合、GKE はトラフィックを別のゾーンに転送します。この実装では、レイテンシとコストが最適化されます。
GKE クラスタでゾーン アフィニティを有効にするには、GKE サブセット化が有効になっている必要があります。
要件と制限事項
内部ロードバランサの要件と制限事項は次のとおりです。
要件
GKE のサブセット化には次の要件と制限事項があります。
- GKE バージョン 1.18.19-gke.1400 以降では、新規および既存の Standard クラスタの GKE のサブセット化を有効にできます。GKE のサブセット化を有効にすると、無効にすることはできません。
- Autopilot クラスタでは、GKE のサブセット化がデフォルトで無効になっています。ただし、クラスタの作成後に有効にすることはできます。
- GKE のサブセット化を使用するには、
HttpLoadBalancingアドオンを有効にする必要があります。このアドオンはデフォルトで有効になっています。Autopilot クラスタでは、この必要なアドオンを無効にすることはできません。 - ネットワーク エンドポイント グループの割り当てが適用されます。 Google Cloud は、内部 LoadBalancer Service ごとに、ゾーンあたり 1 つの
GCE_VM_IPNEG を作成します。 - 転送ルール、バックエンド サービス、ヘルスチェックの割り当てが適用されます。詳細については、割り当てと上限をご覧ください。
- アノテーションとともに GKE のサブセット化を使用して、複数のロードバランサ(
alpha.cloud.google.com/load-balancer-backend-share)間でバックエンド サービスを共有することはできません。 - Google Cloud CLI のバージョン 345.0.0 以降が必要です。
ゾーン アフィニティには次の要件があります。
- GKE バージョン 1.33.3-gke.1392000 以降では、新規および既存のクラスタでゾーン アフィニティを有効にできます。
- GKE のサブセット化が有効になっている必要があります。
- クラスタで
HttpLoadBalancingアドオンが有効になっていることを確認する必要があります。このアドオンはデフォルトで有効になっており、クラスタがバックエンド サービスを使用するロードバランサを管理できるようにします。 - LoadBalancer Service マニフェストに
spec.trafficDistribution: PreferCloseを含める必要があります。
LoadBalancer Service マニフェストでは、externalTrafficPolicy: Local または externalTrafficPolicy: Cluster のいずれかを使用できます。
制限事項
内部パススルー ネットワーク ロードバランサ
- Kubernetes バージョン 1.7.4 以降を実行しているクラスタでは、自動モードのサブネットだけでなく、カスタムモードのサブネットの内部ロードバランサも使用できます。
- Kubernetes バージョン 1.7.X 以降を実行しているクラスタは、
--purposeフラグをSHARED_LOADBALANCER_VIPに設定した予約済み IP アドレスを作成した場合、内部パススルー ネットワーク ロードバランサに対する予約済み IP アドレスの使用をサポートします。詳しい手順については、共有 IP の有効化をご覧ください。GKE は、Service がその目的で内部 IP アドレスを参照する場合にのみ、内部パススルー ネットワーク ロードバランサの IP アドレスを保持します。それ以外の場合、Service が更新されるときに(ポートが変更された場合など)、GKE がロードバランサの IP アドレス(spec.loadBalancerIP)を変更することがあります。 - ロードバランサの IP アドレスが変更されても(前のポイントを参照)、
spec.clusterIPは一定に保たれます。 - 内部 UDP ロードバランサは、
sessionAffinity: ClientIPの使用をサポートしていません。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
- すでに Autopilot クラスタまたは Standard クラスタが存在していることを確認する。新しいクラスタを作成するには、Autopilot クラスタの作成をご覧ください。
クラスタで GKE のサブセット化を有効にする
既存のクラスタに対して GKE のサブセット化を有効にするには、gcloud CLI または Google Cloud コンソールを使用します。GKE のサブセット化を有効にした後、無効にすることはできません。
コンソール
Google Cloud コンソールで、[Google Kubernetes Engine] ページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[ネットワーキング] で、[L4 内部ロードバランサのサブセット化] フィールドの横にある [editL4 内部ロードバランサのサブセット化を有効にする] をクリックします。
[L4 内部ロードバランサのサブセット化を有効にする] チェックボックスをオンにします。
[変更を保存] をクリックします。
gcloud
gcloud container clusters update CLUSTER_NAME \
--enable-l4-ilb-subsetting
次のように置き換えます。
CLUSTER_NAME: クラスタの名前。
GKE のサブセット化を有効にしても、既存の内部 LoadBalancer Service は中断されません。既存の内部 LoadBalancer Service を移行し、GCE_VM_IP NEG をバックエンドとして使用するバックエンド サービスを使用する場合は、代替 Service マニフェストをデプロイする必要があります。詳細については、LoadBalancer Service のコンセプト ドキュメントのノードのグループ化をご覧ください。
ワークロードをデプロイする
以下のマニフェストは、サンプルのウェブ アプリケーション コンテナ イメージを実行する Deployment について説明しています。
マニフェストを
ilb-deployment.yamlとして保存します。apiVersion: apps/v1 kind: Deployment metadata: name: ilb-deployment spec: replicas: 3 selector: matchLabels: app: ilb-deployment template: metadata: labels: app: ilb-deployment spec: containers: - name: hello-app image: us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0マニフェストをクラスタに適用します。
kubectl apply -f ilb-deployment.yaml
内部 LoadBalancer Service を作成する
(省略可)VPC ファイアウォール ルールの自動作成を無効にします。
GKE は、内部ロードバランサへのトラフィックを許可する VPC ファイアウォール ルールを自動的に作成しますが、VPC ファイアウォール ルールの自動作成を無効にして、ファイアウォール ルールを独自に管理することもできます。VPC ファイアウォール ルールを無効にできるのは、内部 LoadBalancer Service で GKE サブセット化を有効にしている場合のみです。ただし、VPC ファイアウォール ルールの管理は省略可能であり、自動ルールを利用できます。
VPC ファイアウォール ルールの自動作成を無効にする前に、トラフィックがロードバランサとアプリケーション Pod に到達することを許可する許可ルールを定義してください。
VPC ファイアウォール ルールの管理の詳細については、ファイアウォール ルールの自動作成を管理するをご覧ください。ファイアウォール ルールの自動作成を無効にする方法については、GKE LoadBalancer Service のユーザー管理ファイアウォール ルールをご覧ください。
次の例では、TCP ポート
80を使用して内部 LoadBalancer Service を作成します。GKE は、転送ルールでポート80を使用する内部パススルー ネットワーク ロードバランサをデプロイしますが、ポート8080のバックエンド Pod にトラフィックを転送します。マニフェストを
ilb-svc.yamlとして保存します。apiVersion: v1 kind: Service metadata: name: ilb-svc # Request an internal load balancer. annotations: networking.gke.io/load-balancer-type: "Internal" spec: type: LoadBalancer # Evenly route external traffic to all endpoints. externalTrafficPolicy: Cluster # Prioritize routing traffic to endpoints that are in the same zone. trafficDistribution: PreferClose selector: app: ilb-deployment # Forward traffic from TCP port 80 to port 8080 in backend Pods. ports: - name: tcp-port protocol: TCP port: 80 targetPort: 8080マニフェストには次のものを含める必要があります。
- 内部 LoadBalancer Service の
name。この場合はilb-svc。 - 内部 LoadBalancer Service を要求することを示すアノテーション。GKE バージョン 1.17 以降の場合は、マニフェストの例に示すように、アノテーション
networking.gke.io/load-balancer-type: "Internal"を使用します。それより前のバージョンの場合は、代わりにcloud.google.com/load-balancer-type: "Internal"を使用してください。 type: LoadBalancer。spec: selectorフィールド。Service が対象にするポッドを指定します。例:app: hello- ポート情報:
portは、内部パススルー ネットワーク ロードバランサの転送ルールがパケットを受信する宛先ポートを表します。targetPortは、サービスを提供する各 Pod で定義されたcontainerPortと一致する必要があります。portとtargetPortの値を同じにする必要はありません。ノードは常に宛先 NAT を実行し、宛先ロードバランサの転送ルールの IP アドレスとportを宛先 Pod の IP アドレスとtargetPortに変更します。詳細については、LoadBalancer Service のコンセプト ドキュメントのノードでの宛先ネットワーク アドレス変換をご覧ください。
マニフェストには次の対象を含めることができます。
spec.ipFamilyPolicyとipFamiliesは、GKE が IP アドレスを Service に割り振る方法を定義します。GKE は、シングルスタック(IPv4 のみまたは IPv6 のみ)またはデュアルスタックの IP LoadBalancer Service をサポートしています。デュアルスタック LoadBalancer Service は、2 つの個別の内部パススルー ネットワーク ロードバランサの転送ルール(IPv4 トラフィック用と IPv6 トラフィック用)で実装されます。GKE デュアルスタック LoadBalancer Service は、バージョン 1.29 以降で使用できます。詳細については、IPv4 / IPv6 デュアルスタック Service をご覧ください。spec.trafficDistribution: GKE が受信トラフィックをルーティングする方法を定義します(プレビュー)。このフィールドをPreferCloseに設定すると、GKE はゾーンから発信されたトラフィックを同じゾーン内のノードと Pod に転送します。ゾーンに正常な Pod がない場合、GKE はトラフィックを別のゾーンに転送します。このフィールドを含める場合は、GKE サブセット化を有効にする必要があります。
詳細については、LoadBalancer Service のパラメータをご覧ください。
- 内部 LoadBalancer Service の
マニフェストをクラスタに適用します。
kubectl apply -f ilb-svc.yaml
Service に関する詳細情報を取得します。
kubectl get service ilb-svc --output yaml出力は次のようになります。
apiVersion: v1 kind: Service metadata: annotations: cloud.google.com/neg: '{"ingress":true}' cloud.google.com/neg-status: '{"network_endpoint_groups":{"0":"k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r"},"zones":["ZONE_NAME","ZONE_NAME","ZONE_NAME"]}' kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"networking.gke.io/load-balancer-type":"Internal"},"name":"ilb-svc","namespace":"default"},"spec":{"externalTrafficPolicy":"Cluster","ports":[{"name":"tcp-port","port":80,"protocol":"TCP","targetPort":8080}],"selector":{"app":"ilb-deployment"},"type":"LoadBalancer"}} networking.gke.io/load-balancer-type: Internal service.kubernetes.io/backend-service: k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r service.kubernetes.io/firewall-rule: k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r service.kubernetes.io/firewall-rule-for-hc: k8s2-pn2h9n5f-l4-shared-hc-fw service.kubernetes.io/healthcheck: k8s2-pn2h9n5f-l4-shared-hc service.kubernetes.io/tcp-forwarding-rule: k8s2-tcp-pn2h9n5f-default-ilb-svc-3bei4n1r creationTimestamp: "2022-07-22T17:26:04Z" finalizers: - gke.networking.io/l4-ilb-v2 - service.kubernetes.io/load-balancer-cleanup name: ilb-svc namespace: default resourceVersion: "51666" uid: d7a1a865-7972-44e1-aa9e-db5be23d6567 spec: allocateLoadBalancerNodePorts: true clusterIP: 10.88.2.141 clusterIPs: - 10.88.2.141 externalTrafficPolicy: Cluster internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: tcp-port # Kubernetes automatically allocates a port on the node during the # process of implementing a Service of type LoadBalancer. nodePort: 30521 port: 80 protocol: TCP targetPort: 8080 selector: app: ilb-deployment sessionAffinity: None trafficDistribution: PreferClose type: LoadBalancer status: # IP address of the load balancer forwarding rule. loadBalancer: ingress: - ip: 10.128.15.245出力には次の属性が含まれます。
- 内部パススルー ネットワーク ロードバランサの転送ルールの IP アドレスは
status.loadBalancer.ingressに含まれています。この IP アドレスは、clusterIPの値とは異なります。この例では、ロードバランサの転送ルールの IP アドレスは10.128.15.245です。 app: ilb-deploymentというラベルを持つ Pod は、この Service 用のサービスを提供する Pod です。これらの Pod は、内部パススルー ネットワーク ロードバランサによって転送されたパケットを受信します。- クライアントは、この
loadBalancerIP アドレスと Service マニフェストのportフィールドに指定された TCP 宛先ポートを使用して Service を呼び出します。ノードで受信されたパケットが転送される仕組みの詳細については、パケット処理をご覧ください。 - GKE が Service に
nodePortを割り当てました。この例では、ポート30521が割り当てられています。nodePortは、内部パススルー ネットワーク ロードバランサとは関係ありません。
- 内部パススルー ネットワーク ロードバランサの転送ルールの IP アドレスは
Service ネットワーク エンドポイント グループを調べます。
kubectl get svc ilb-svc -o=jsonpath="{.metadata.annotations.cloud\.google\.com/neg-status}"出力は次のようになります。
{"network_endpoint_groups":{"0":"k8s2-knlc4c77-default-ilb-svc-ua5ugas0"},"zones":["ZONE_NAME"]}レスポンスは、GKE が
k8s2-knlc4c77-default-ilb-svc-ua5ugas0という名前のネットワーク エンドポイント グループを作成したことを示します。このアノテーションは、GKE サブセット設定を使用するLoadBalancerタイプの Service に存在し、GKE サブセット設定を使用しない Service には存在しません。
内部パススルー ネットワーク ロードバランサのコンポーネントを確認する
このセクションでは、内部パススルー ネットワーク ロードバランサの主要コンポーネントを確認する方法について説明します。
Service が実行されていることを確認します。
kubectl get service SERVICE_NAME --output yamlSERVICE_NAMEは、Service マニフェストの名前に置き換えます。ゾーン アフィニティを有効にすると、出力に
spec.trafficDistributionパラメータが含まれ、フィールドがPreferCloseに設定されます。内部パススルー ネットワーク ロードバランサの転送ルールの IP アドレスを確認します。内部 LoadBalancer Service を作成するセクションに記載されている例では、内部パススルー ネットワーク ロードバランサの転送ルールの IP アドレスは
10.128.15.245です。Google Cloud CLI を使用して、この転送ルールがクラスタのプロジェクトの転送ルールのリストに含まれていることを確認します。gcloud compute forwarding-rules list --filter="loadBalancingScheme=INTERNAL"出力には、関連する内部パススルー ネットワーク ロードバランサの転送ルール、その IP アドレス、転送ルールで参照されるバックエンド サービス(この例では
k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r)が含まれます。NAME ... IP_ADDRESS ... TARGET ... k8s2-tcp-pn2h9n5f-default-ilb-svc-3bei4n1r 10.128.15.245 ZONE_NAME/backendServices/k8s2-pn2h9n5f-default-ilb-svc-3bei4n1rGoogle Cloud CLI を使用して、ロードバランサのバックエンド サービスの説明を取得します。
gcloud compute backend-services describe k8s2-tcp-pn2h9n5f-default-ilb-svc-3bei4n1r --region=COMPUTE_REGIONCOMPUTE_REGIONは、バックエンド サービスのコンピューティング リージョンに置き換えます。ゾーン アフィニティを有効にした場合:
networkPassThroughLbTrafficPolicy.zonalAffinity.spilloverフィールドはZONAL_AFFINITY_SPILL_CROSS_ZONEに設定する必要があります。networkPassThroughLbTrafficPolicy.zonalAffinity.spilloverRatioフィールドは0に設定するか、含めないようにします。
出力には、1 つまたは複数の Service のバックエンド
GCE_VM_IPNEG(この例ではk8s2-pn2h9n5f-default-ilb-svc-3bei4n1r)が含まれます。backends: - balancingMode: CONNECTION group: .../ZONE_NAME/networkEndpointGroups/k8s2-pn2h9n5f-default-ilb-svc-3bei4n1r ... kind: compute#backendService loadBalancingScheme: INTERNAL name: aae3e263abe0911e9b32a42010a80008 networkPassThroughLbTrafficPolicy: zonalAffinity: spillover: ZONAL_AFFINITY_SPILL_CROSS_ZONE protocol: TCP ...ゾーン アフィニティを無効にした場合、
networkPassThroughLbTrafficPolicy.zonalAffinity.spilloverフィールドはZONAL_AFFINITY_DISABLEDに設定するか、含めないようにする必要があります。クラスタが 1.33.3-gke.1392000 より前のバージョンを使用している場合、ゾーン アフィニティは自動的に無効になります。サービスのサブセットのノードのリストを確認します。
gcloud compute network-endpoint-groups list-network-endpoints NEG_NAME \ --zone=COMPUTE_ZONE次のように置き換えます。
NEG_NAME: GKE コントローラによって作成されたネットワーク エンドポイント グループの名前。COMPUTE_ZONE: 動作対象のネットワーク エンドポイント グループのコンピューティング ゾーン。
内部パススルー ネットワーク ロードバランサの正常なノードのリストを確認します。
gcloud compute backend-services get-health SERVICE_NAME \ --region=COMPUTE_REGION次のように置き換えます。
SERVICE_NAME: バックエンド サービスの名前。この値は、GKE コントローラによって作成されたネットワーク エンドポイント グループの名前と同じです。COMPUTE_REGION: 操作するバックエンド サービスのコンピューティング リージョン。
内部パススルー ネットワーク ロードバランサへの接続をテストする
クラスタと同じリージョンで次のコマンドを実行します。
curl LOAD_BALANCER_IP:80
LOAD_BALANCER_IP は、ロードバランサの転送ルールの IP アドレスに置き換えます。
レスポンスには ilb-deployment の出力が含まれます。
Hello, world!
Version: 1.0.0
Hostname: ilb-deployment-77b45987f7-pw54n
内部パススルー ネットワーク ロードバランサには、同じ VPC ネットワーク(または接続されたネットワーク)内でのみアクセスできます。デフォルトでは、ロードバランサの転送ルールはグローバル アクセスを無効にしているため、クライアント VM、Cloud VPN トンネル、または Cloud Interconnect アタッチメント(VLAN)は、内部パススルー ネットワーク ロードバランサと同じリージョンに配置する必要があります。すべてのリージョンのクライアントをサポートするには、Service マニフェストにグローバル アクセス アノテーションを含めることで、ロードバランサの転送ルールでグローバル アクセスを有効にします。
内部 LoadBalancer Service とロードバランサのリソースを削除する
Deployment と Service を削除するには、kubectl delete またはGoogle Cloud コンソールを使用します。
kubectl
Deployment を削除する
Deployment を削除するには、次のコマンドを実行します。
kubectl delete deployment ilb-deployment
Service を削除する
Service を削除するには、次のコマンドを実行します。
kubectl delete service ilb-svc
Console
Deployment を削除する
Deployment を削除するには、次の手順を行います。
Google Cloud コンソールの [ワークロード] ページに移動します。
削除する Deployment を選択して、[delete 削除] をクリックします。
確認を求められたら、[選択した Deployment に関連付けられている水平 Pod オートスケーラーを削除します] チェックボックスをオンにして、[削除] をクリックします。
Service を削除する
Service を削除するには、次の手順を行います。
Google Cloud コンソールの [Service と Ingress] ページに移動します。
削除するサービスを選択して、[delete 削除] をクリックします。
確認のメッセージが表示されたら、[削除] をクリックします。
共有 IP
内部パススルー ネットワーク ロードバランサを使用すると、複数の転送ルール間で仮想 IP アドレスを共有できます。これは、同じ IP で同時使用のポート数を拡張する場合や、同じ IP で UDP トラフィックと TCP トラフィックを受け入れる場合に便利です。IP アドレスあたり最大 50 個の公開ポートが許可されます。共有 IP は、内部 LoadBalancer Service のある GKE クラスタでネイティブにサポートされます。デプロイ時に、Service の loadBalancerIP フィールドを使用して、Service 間で共有する IP を指定します。
制限事項
複数のロードバランサの共有 IP には、次のような制限と機能があります。
- 各転送ルールには最大 5 つのポート(連続または非連続)を設定できます。また、すべてのポートでトラフィックを照合して転送するように構成することもできます。内部 LoadBalancer Service で 6 つ以上のポートが定義されている場合、転送ルールはすべてのポートに一致するように自動的に設定されます。
- IP アドレスを共有できるのは最大 10 個の Services(転送ルール)です。このため、共有 IP あたり最大で 50 個のポートを設定できます。
- 同じ IP アドレスを共有する転送ルールはそれぞれ、固有のプロトコルとポートの組み合わせを使用する必要があります。そのため、内部 LoadBalancer Service ごとに、固有のプロトコルとポートのセットを使用する必要があります。
- 同じ共有 IP では TCP 専用と UDP 専用の Service の組み合わせがサポートされていますが、同じ Service で TCP ポートと UDP ポートの両方を公開することはできません。
共有 IP の有効化
内部 LoadBalancer Service で共通の IP を共有するには、次の操作を行います。
--purpose SHARED_LOADBALANCER_VIPを使用して、静的内部 IP を作成します。共有を可能にするために、IP アドレスの作成が必要です。共有 VPC で静的内部 IP アドレスを作成する場合は、IP アドレスを使用するインスタンスと同じサービス プロジェクトに IP アドレスを作成する必要があります。これは、IP アドレスの値が共有 VPC ネットワークの選択された共有サブネット内の利用可能な IP の範囲から取得されたものだとしても、同様です。詳細については、共有 VPC のプロビジョニングのページで静的内部 IP の予約をご覧ください。この静的 IP を
loadBalancerIPフィールドに指定して、最大 10 個の内部 LoadBalancer Service をデプロイします。内部パススルー ネットワーク ロードバランサは、GKE サービス コントローラによって調整され、同じフロントエンド IP を使用してデプロイします。
次の例は、同じ内部ロードバランサの IP で複数の TCP ポートと UDP ポートをサポートする方法を示しています。
GKE クラスタと同じリージョンに静的 IP を作成します。サブネットはロードバランサが使用するサブネットと同じにする必要があります。デフォルトは、GKE クラスタノードの IP によって使用されるサブネットです。
クラスタと VPC ネットワークが同じプロジェクト内にある場合:
gcloud compute addresses create IP_ADDR_NAME \ --project=PROJECT_ID \ --subnet=SUBNET \ --addresses=IP_ADDRESS \ --region=COMPUTE_REGION \ --purpose=SHARED_LOADBALANCER_VIPクラスタが共有 VPC サービス プロジェクトにあるが、ホスト プロジェクトで共有 VPC ネットワークを使用している場合:
gcloud compute addresses create IP_ADDR_NAME \ --project=SERVICE_PROJECT_ID \ --subnet=projects/HOST_PROJECT_ID/regions/COMPUTE_REGION/subnetworks/SUBNET \ --addresses=IP_ADDRESS \ --region=COMPUTE_REGION \ --purpose=SHARED_LOADBALANCER_VIP次のように置き換えます。
IP_ADDR_NAME: IP アドレス オブジェクトの名前。SERVICE_PROJECT_ID: サービス プロジェクトの ID。PROJECT_ID: プロジェクト(単一プロジェクト)の ID。HOST_PROJECT_ID: 共有 VPC ホスト プロジェクトの ID。COMPUTE_REGION: 共有サブネットを含むコンピューティング リージョン。IP_ADDRESS: 選択したサブネットのプライマリ IP アドレス範囲の未使用の内部 IP アドレス。IP アドレスの指定を省略すると、 Google Cloud は選択したサブネットのプライマリ IP アドレス範囲から未使用の内部 IP アドレスを選択します。自動的に選択されるアドレスを確認するには、gcloud compute addresses describeを実行する必要があります。SUBNET: 共有サブネットの名前。
次の TCP Service の構成を
tcp-service.yamlというファイルに保存し、クラスタにデプロイします。IP_ADDRESSを前のステップで選択した IP アドレスに置き換えます。apiVersion: v1 kind: Service metadata: name: tcp-service namespace: default # Request an internal load balancer. annotations: networking.gke.io/load-balancer-type: "Internal" spec: type: LoadBalancer # Use an IP address that you create. loadBalancerIP: IP_ADDRESS selector: app: myapp ports: - name: 8001-to-8001 protocol: TCP port: 8001 targetPort: 8001 - name: 8002-to-8002 protocol: TCP port: 8002 targetPort: 8002 - name: 8003-to-8003 protocol: TCP port: 8003 targetPort: 8003 - name: 8004-to-8004 protocol: TCP port: 8004 targetPort: 8004 - name: 8005-to-8005 protocol: TCP port: 8005 targetPort: 8005この Service 定義をクラスタに適用します。
kubectl apply -f tcp-service.yaml次の UDP Service 構成を
udp-service.yamlというファイルに保存し、デプロイします。また、前のステップで指定したIP_ADDRESSも使用します。apiVersion: v1 kind: Service metadata: name: udp-service namespace: default # Request an internal load balancer. annotations: networking.gke.io/load-balancer-type: "Internal" spec: type: LoadBalancer # Use the same IP address that you used for the TCP Service. loadBalancerIP: IP_ADDRESS selector: app: my-udp-app ports: - name: 9001-to-9001 protocol: UDP port: 9001 targetPort: 9001 - name: 9002-to-9002 protocol: UDP port: 9002 targetPort: 9002このファイルをクラスタに適用します。
kubectl apply -f udp-service.yamlロードバランサ転送ルールのリストを取得して静的 IP をフィルタリングし、VIP がロードバランサ転送ルール間で共有されていることを確認します。これは、UDP と TCP の両方の転送ルールが、共有
IP_ADDRESS(この例では10.128.2.98)で 7 つの異なるポートをリッスンしていることを示しています。gcloud compute forwarding-rules list | grep 10.128.2.98 ab4d8205d655f4353a5cff5b224a0dde us-west1 10.128.2.98 UDP us-west1/backendServices/ab4d8205d655f4353a5cff5b224a0dde acd6eeaa00a35419c9530caeb6540435 us-west1 10.128.2.98 TCP us-west1/backendServices/acd6eeaa00a35419c9530caeb6540435
既知の問題
10 分ごとに接続タイムアウトする
サブセットを使用して作成した内部 LoadBalancer Service では、約 10 分ごとにトラフィックが中断されることがあります。このバグは次のバージョンで修正されています。
- 1.18.19-gke.1700 以降
- 1.19.10-gke.1000 以降
- 1.20.6-gke.1000 以降
スタンダード ティアでのロードバランサの作成でエラーが発生する
プロジェクトのデフォルト ネットワーク階層がスタンダードに設定されているプロジェクトで内部パススルー ネットワーク ロードバランサを作成すると、次のエラー メッセージが表示されます。
Error syncing load balancer: failed to ensure load balancer: googleapi: Error 400: STANDARD network tier (the project's default network tier) is not supported: Network tier other than PREMIUM is not supported for loadBalancingScheme=INTERNAL., badRequest
1.23.3-gke.900 より前の GKE バージョンでこの問題を解決するには、プロジェクトのデフォルト ネットワーク階層を Premium に構成します。
この問題は、GKE のサブセット化が有効になっている GKE バージョン 1.23.3-gke.900 以降で解決されています。
GKE コントローラは、プロジェクトのデフォルト ネットワーク階層がスタンダードに設定されていても、Premium ネットワーク階層で内部パススルー ネットワーク ロードバランサを作成します。
次のステップ
- GKE ネットワークの概要を読む。
- Compute Engine ロードバランサの詳細を確認する。
- VPC ネイティブ クラスタの作成方法について学ぶ。
- GKE でのロード バランシングのトラブルシューティング。
- IP マスカレード エージェントについて学ぶ。
- 承認済みネットワークの構成について学ぶ。