多重網路 LoadBalancer 服務

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 的服務。
  • 服務無法指定 hostNetwork Pod。
  • 不支援 IPv6 和雙重堆疊網路。
  • 您無法變更現有服務的網路。
  • 僅支援第 3 層網路。

後續步驟