マルチネットワーク LoadBalancer Service

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

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

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

マルチネットワーク ワークロードを公開するには、Servicetype: LoadBalancer を作成します。この 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 アノテーションを使用して、セカンダリ ネットワーク インターフェースをデフォルト ルートとして設定します。

  • ポリシーベース ルーティングを構成する: initContainer を使用して、 NET_ADMIN 機能を持つ 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 のエンドポイントを管理します。このコントローラは、マルチネットワーク Service の EndpointSlice オブジェクトを作成します。これらの EndpointSlice オブジェクトの IP アドレスは、Service セレクタで指定されたセカンダリ ネットワークに属します。

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

制限事項

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

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

次のステップ