借助 GKE 多网络功能,您可以将工作负载连接到多个 VPC 网络。您可以使用 type: LoadBalancer 的 Kubernetes Service 将这些多网络 Pod 公开给内部或外部客户端。GKE 为 Service 预配 Google Cloud L4 负载均衡器,该 Service 会将流量发送到指定辅助网络上的 Pod。
本文档介绍了 GKE 如何为多网络 Pod 实现 LoadBalancer Service。其中涵盖了该功能所需的配置、功能和限制。
多网络 LoadBalancer Service 的工作原理
如需公开多网络工作负载,您需要创建一个 type:
LoadBalancer 的 Service。此 Service 必须包含一个特殊选择器,该选择器会根据 Pod 的次要接口的网络来定位 Pod。您还可以添加注解,以指定是创建内部负载均衡器还是外部负载均衡器。
选择器中的 networking.gke.io/network 标签会按网络过滤端点。这样可确保负载均衡器仅将流量发送到连接到指定网络的 Pod 接口。
内部 LoadBalancer Service
如需创建内部负载均衡器,请将 networking.gke.io/load-balancer-type: "Internal" 注解添加到 Service 清单中。以下示例展示了用于创建内部负载均衡器以定位 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
如需创建外部网络负载均衡器,您必须配置基于后端服务的负载均衡器。在 GKE 1.37 及更高版本中,这是默认行为。在早期版本中,请将 cloud.google.com/l4-rbs: enabled 注解添加到 Service 清单中。以下示例展示了用于创建外部负载均衡器以定位 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注解,将辅助网络接口设置为默认路由。配置基于政策的路由:使用具有
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 来管理多网络服务的端点。此控制器会为您的多网络服务创建 EndpointSlice 对象。这些 EndpointSlice 对象中的 IP 地址属于 Service 选择器中指定的次要网络。
如果负载均衡器没有运行状况良好的后端,请检查 Service 的 EndpointSlice,以验证控制器是否选择了正确的 Pod IP 地址。如果 EndpointSlice 没有端点,请检查 Service 选择器标签是否与正在运行的 Pod 匹配,以及 networking.gke.io/network 选择器是否与 Pod 的网络匹配。
限制
多网络 LoadBalancer Service 具有以下限制:
- 内部负载均衡器需要 GKE 子集。
- 不支持基于目标池或实例组的负载均衡器。
- 不支持使用
externalTrafficPolicy: Cluster的服务。 - 服务无法定位到
hostNetworkPod。 - 不支持 IPv6 和双栈网络。
- 您无法更改现有服务的网络。
- 仅支持第 3 层网络。
后续步骤
- 如需了解如何部署多网络服务,请参阅多网络服务用户指南。
- 如需了解如何准备 VPC 以及如何创建具有其他网络的 GKE 集群,请参阅 GKE 多网络用户指南。