借助 GKE 多网络,您可以将工作负载连接到多个 VPC 网络。您可以使用 type: LoadBalancer 的 Kubernetes
Service 将这些多网络 Pod 公开给内部或外部客户端。
GKE 会为
该 Service 预配一个 Google Cloud L4 负载均衡器,该负载均衡器会将流量发送到指定辅助网络上的 Pod。
本文档介绍了 GKE 如何为多网络 Pod 实现 LoadBalancer Service。它涵盖了该功能所需的配置、功能和限制。
多网络 LoadBalancer Service 的工作原理
如需公开多网络工作负载,您可以创建 Service 的 type:
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 无法定位
hostNetworkPod。 - 不支持 IPv6 和双栈网络。
- 您无法更改现有 Service 的网络。
- 仅支持第 3 层网络。
后续步骤
- 如需了解如何部署多网络服务,请参阅多网络
服务用户
指南。
- 如需了解如何准备 VPC 并创建具有额外网络的 GKE 集群,请参阅GKE 多网络用户 指南 。