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