GKE マルチネットワーキングを使用すると、ワークロードを複数の VPC ネットワークに接続できます。これらのマルチネットワーク Pod を内部クライアントまたは外部クライアントに公開するには、type: LoadBalancer の Kubernetes Service を使用します。GKE は、指定されたセカンダリ ネットワーク上の Pod にトラフィックを送信する Service 用の Google Cloud L4 ロードバランサをプロビジョニングします。
このドキュメントでは、GKE がマルチネットワーク Pod 用の LoadBalancer サービスを実装する方法について説明します。この機能に必要な構成、機能、制限事項について説明します。
マルチネットワーク LoadBalancer Service の仕組み
マルチネットワーク ワークロードを公開するには、type:
LoadBalancer の Service を作成します。この 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を使用するサービスは対象外です。- サービスは
hostNetworkPod をターゲットにできません。 - IPv6 とデュアルスタック ネットワーキングはサポートされていません。
- 既存の Service のネットワークは変更できません。
- レイヤ 3 ネットワークのみがサポートされます。
次のステップ
- マルチネットワーク サービス ユーザーガイドに沿って、マルチネットワーク サービスをデプロイする方法を確認する。
- VPC を準備し、追加のネットワークを使用して GKE クラスタを作成する方法については、GKE マルチネットワーク ユーザーガイドをご覧ください。