マルチネットワーク LoadBalancer Service

GKE マルチネットワーキングを使用すると、ワークロードを複数の VPC ネットワークに接続できます。これらのマルチネットワーク Pod を内部クライアントまたは外部クライアントに公開するには、type: LoadBalancer の Kubernetes Service を使用します。GKE は、指定されたセカンダリ ネットワーク上の Pod にトラフィックを送信する Service 用の Google Cloud L4 ロードバランサをプロビジョニングします。

このドキュメントでは、GKE がマルチネットワーク Pod 用の LoadBalancer サービスを実装する方法について説明します。この機能に必要な構成、機能、制限事項について説明します。

マルチネットワーク LoadBalancer Service の仕組み

マルチネットワーク ワークロードを公開するには、type: LoadBalancerService を作成します。この Service には、セカンダリ インターフェースのネットワークに基づいて Pod をターゲットとする特別なセレクタを含める必要があります。内部ロードバランサと外部ロードバランサのどちらを作成するかを指定するアノテーションも追加します。

セレクタの networking.gke.io/network ラベルは、ネットワークでエンドポイントをフィルタします。これにより、ロードバランサは指定されたネットワークに接続された Pod インターフェースにのみトラフィックを送信します。

内部 LoadBalancer Service

内部ロードバランサを作成するには、Service マニフェストに networking.gke.io/load-balancer-type: "Internal" アノテーションを追加します。次の例は、dmz ネットワーク上の Pod をターゲットとする内部ロードバランサを作成する Service を示しています。

apiVersion: v1
kind: Service
metadata:
  name: web-app-internal-lb
  namespace: default
  annotations:
    networking.gke.io/load-balancer-type: "Internal"
spec:
  externalTrafficPolicy: Local
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    networking.gke.io/network: dmz
    app: web-app
  type: LoadBalancer

外部 LoadBalancer Service

バックエンド サービスベースの外部ネットワーク ロードバランサを作成するには、Service マニフェストに cloud.google.com/l4-rbs: enabled アノテーションを追加します。次の例は、dmz ネットワーク上の Pod をターゲットとする外部ロードバランサを作成する Service を示しています。

apiVersion: v1
kind: Service
metadata:
  name: web-app-external-lb
  namespace: default
  annotations:
    cloud.google.com/l4-rbs: enabled
spec:
  externalTrafficPolicy: Local
  ports:
  -   port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    networking.gke.io/network: dmz
    app: web-app
  type: LoadBalancer

Pod とネットワークの構成

Pod には、LoadBalancer Service がターゲットとするネットワークにインターフェースが必要です。また、適切なネットワーク インターフェースでリクエストに正しく応答できるように、Pod 内でルーティングを構成する必要があります。

Pod のルーティングは、次のいずれかの方法で構成できます。

  • デフォルトのインターフェースを設定する: Pod の networking.gke.io/default-interface アノテーションを使用して、セカンダリ ネットワーク インターフェースをデフォルト ルートとして設定します。

  • ポリシーベース ルーティングを構成する: NET_ADMIN 機能を持つ initContainer を使用して、Pod 内のルーティング ルールを構成します。

次の例は、dmz ネットワークにインターフェースを持つ Pod の Deployment マニフェストを示しています。networking.gke.io/default-interface アノテーションは、dmz インターフェース(eth1)をデフォルト ルートとして設定します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
      annotations:
        networking.gke.io/default-interface: 'eth1'
        networking.gke.io/interfaces: |-
          [
            {"interfaceName":"eth0","network":"default"},
            {"interfaceName": "eth1","network": "dmz"}
          ]
    spec:
      containers:
      -   name: whereami
        image: us-docker.pkg.dev/google-samples/containers/gke/whereami:v1
        ports:
        -   containerPort: 8080

マルチネットワーク エンドポイントの検証

GKE は、専用のコントローラ multinet-endpointslice-controller.gke.io を使用して、マルチネットワーク Service のエンドポイントを管理します。このコントローラは、マルチネットワーク サービスの EndpointSlice オブジェクトを作成します。これらの EndpointSlice オブジェクトの IP アドレスは、サービス セレクタで指定されたセカンダリ ネットワークに属します。

ロードバランサに正常なバックエンドがない場合は、Service の EndpointSlice を調べて、コントローラが正しい Pod IP アドレスを選択していることを確認します。EndpointSlice にエンドポイントがない場合は、Service セレクタ ラベルが実行中の Pod と一致し、networking.gke.io/network セレクタが Pod のネットワークと一致していることを確認します。

制限事項

マルチネットワーク LoadBalancer サービスには次の制限があります。

  • 内部ロードバランサには GKE のサブセット化が必要です。
  • ターゲット プールまたはインスタンス グループ ベースのロードバランサはサポートされていません。
  • externalTrafficPolicy: Cluster を使用するサービスは対象外です。
  • サービスは hostNetwork Pod をターゲットにできません。
  • IPv6 とデュアルスタック ネットワーキングはサポートされていません。
  • 既存の Service のネットワークは変更できません。
  • レイヤ 3 ネットワークのみがサポートされます。

次のステップ