GKE 多網路功能可讓您將工作負載連線至多個虛擬私有雲網路。您可以使用 type: LoadBalancer 的 Kubernetes 服務,向內部或外部用戶端公開這些多重網路 Pod。GKE 會為 Service 佈建 Google Cloud L4 負載平衡器,將流量傳送至指定次要網路上的 Pod。
本文說明 GKE 如何為多網路 Pod 實作LoadBalancer服務。其中涵蓋這項功能所需的設定、功能和限制。
多重網路 LoadBalancer 服務的運作方式
如要公開多網路工作負載,請建立 Service type:
LoadBalancer。這項服務必須包含特殊選取器,根據 Pod 次要介面的網路指定 Pod。您也可以新增註解,指定要建立內部或外部負載平衡器。
選取器中的 networking.gke.io/network 標籤會依網路篩選端點。這可確保負載平衡器只會將流量傳送至連線至指定網路的 Pod 介面。
內部 LoadBalancer 服務
如要建立內部負載平衡器,請將 networking.gke.io/load-balancer-type: "Internal" 註解新增至 Service 資訊清單。以下範例顯示的服務會建立內部負載平衡器,以 dmz 網路上的 Pod 為目標:
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 服務
如要建立以後端服務為基礎的外部網路負載平衡器,請將 cloud.google.com/l4-rbs: enabled 註解新增至 Service 資訊清單。以下範例顯示的 Service 會建立外部負載平衡器,以 dmz 網路上的 Pod 為目標:
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 內設定路由規則。
以下範例顯示 Pod 的 Deployment 資訊清單,介面位於 dmz 網路上。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 管理多重網路服務的端點。這個控制器會為多重網路服務建立 EndpointSlice 物件。這些 EndpointSlice 物件中的 IP 位址屬於 Service 選取器中指定的次要網路。
如果負載平衡器沒有健康的後端,請檢查 Service 的 EndpointSlice,確認控制器已選取正確的 Pod IP 位址。如果 EndpointSlice 沒有端點,請檢查服務選取器標籤是否與正在執行的 Pod 相符,以及 networking.gke.io/network 選取器是否與 Pod 的網路相符。
限制
多重網路 LoadBalancer 服務有下列限制:
- 內部負載平衡器需要 GKE 子集。
- 不支援以目標集區或執行個體群組為基礎的負載平衡器。
- 系統不支援使用
externalTrafficPolicy: Cluster的服務。 - 服務無法指定
hostNetworkPod。 - 不支援 IPv6 和雙重堆疊網路。
- 您無法變更現有服務的網路。
- 僅支援第 3 層網路。
後續步驟
- 請按照多網路服務使用者指南的說明,部署多網路服務。
- 請參閱 GKE 多重網路使用者指南,瞭解如何準備 VPC,以及如何建立具備額外網路的 GKE 叢集。