多网络 LoadBalancer 服务

借助 GKE 多网络,您可以将工作负载连接到多个 VPC 网络。您可以使用 type: LoadBalancer 的 Kubernetes Service 将这些多网络 Pod 公开给内部或外部客户端。 GKE 会为 该 Service 预配一个 Google Cloud L4 负载均衡器,该负载均衡器会将流量发送到指定辅助网络上的 Pod。

本文档介绍了 GKE 如何为多网络 Pod 实现 LoadBalancer Service。它涵盖了该功能所需的配置、功能和限制。

多网络 LoadBalancer Service 的工作原理

如需公开多网络工作负载,您可以创建 Servicetype: LoadBalancer。此 Service 必须包含一个特殊选择器,该选择器会根据 Pod 的辅助接口的网络来定位 Pod。您还可以添加注解,以指定是创建内部负载均衡器还是外部负载均衡器。

选择器中的 networking.gke.io/network 标签会按网络过滤端点。这样可确保负载均衡器仅将流量发送到连接到指定网络的 Pod 接口。

内部 LoadBalancer Service

如需创建内部负载均衡器,请将 networking.gke.io/load-balancer-type: "Internal"注解添加到 Service 清单中。以下示例展示了一个 Service,该 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 Service

如需创建基于后端服务的外部网络负载均衡器,请将 cloud.google.com/l4-rbs: enabled 注解添加到 Service 清单中。以下示例展示了一个 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 路由:

  • 设置默认接口:在 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 的端点。此控制器会为您的多网络 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 层网络。

后续步骤