概览
您可以使用 GKE 服务流量导向来控制网络流量在 GKE 集群内的流动方式。您可以定义规则,将特定类型的流量定向到您在集群中部署的网络功能。GKE 服务流量导向类似于基于政策的路由,您在其中可以替换网络流量的正常路径。
术语和概念
本页面使用以下概念:
服务功能 (SF)
服务功能是用于处理收到的数据包的软件组件。从第 2 层(数据链路层)开始,服务层可以在 OSI 模型的任何层上运行。
服务功能大致可分为以下几种:
- 防火墙,用于确保安全
- 代理,用于控制访问权限
- WAN 加速,用于提高速度
- 深度数据包检测 (DPI),用于分析内容
- 合法拦截 (LI),用于监控和调查
- 网络地址转换器 (NAT),用于专用和公共 IP 地址
- HTTP,用于丰富标头
- 负载均衡器,用于高效分配流量
服务功能的替代术语包括:
- 容器设备
- 虚拟设备
- 虚拟网络功能 (NFV)
- 容器化网络功能 (CNF)
- 云原生网络功能 (CNF)
在服务流量导向中,Service 对象表示服务功能 (SF)。
服务功能链 (SFC)
服务功能链 (SFC) 是一系列服务功能(例如防火墙、代理或负载均衡器),这些功能彼此关联,按特定顺序处理网络流量。此链的作用如同流水线,其中每个服务功能都会先对流量执行特定任务,然后再将其传递到下一个功能。
服务功能链 (SFC) 也称为服务链 (SC)。
在服务流量导向中,ServiceFunctionChain
对象表示服务功能链 (SFC)。
服务功能独立于任何服务功能链运行。服务功能通常不知道它所属的服务功能链。
服务流量导向
服务流量导向采用对来源和目标完全透明的方式将数据包路由到所选的服务功能。此概念有时称为“基于政策的路由”“流量重定向”或“服务功能转发”。服务流量导向使用 Geneve + NSH 封装实现透明路由(请参阅 RFC 8926、RFC 8300、Geneve + NSH IETF 草案)。
服务流量导向的一些重要特征包括:
- 跨服务功能的后端 Pod 实现负载均衡:服务功能通常在多个 Pod 上运行,以实现可伸缩性和可靠性。服务流量导向会在这些 Pod 之间均匀分配传入的网络流量,以防止任何单个 Pod 过载。
- 支持 5 元组流亲和性(对于给定流,所有中间跃点必须稳定):5 元组流是一种根据来源 IP 地址、来源端口、目标 IP 地址、目标端口和协议识别特定网络流量流的方法。服务流量导向可确保同一流中的所有数据包都一致地定向到同一组服务功能(跃点)。
- 实现对称返回数据路径:对称返回数据路径意味着响应流量会遵循与原始请求流量相同的路径返回到来源。服务流量导向可确保这种对称性,这对于某些网络协议和应用非常重要。
对于进行服务流量导向的任何给定网络流量,中间服务功能 Pod 会处理该特定网络流量的所有数据包,从而确保一致的中间跃点和可预测的路由。相同的服务功能 Pod 会接收返回流量,以确保对称流量流。如果原始流量发送到同一集群中的目标,则返回流量会自动通过同一服务链返回。如果原始流量位于集群外部,则链中的最终服务功能会使用来源网络地址转换 (SNAT) 或充当中间组件的代理将流量吸引回自身。
使用场景
GKE 服务流量导向会将基于政策的路由集成到集群中。这可实现以下主要应用场景:
自行管理的安全服务:
组织可以使用虚拟防火墙 (vFW)、虚拟下一代防火墙 (vNG-FW) 和虚拟入侵检测系统 (vIDS) 等容器化网络功能 (CNF) 构建自己的安全基础架构。服务流量导向可确保流量在到达预期目标之前通过这些 CNF 进行路由,从而提供一层保护和控制。
托管式安全服务提供商 (MSP):
MSP 可以利用 GKE 服务流量导向,通过其云端安全服务链路由您的流量。这使他们可以提供全面的安全解决方案,包括安全 Web 网关 (SWG)、SASE(安全访问服务边缘)和 SD-WAN(软件定义的广域网)功能。
电信和 5G 网络:
服务流量导向可为电信和 5G 基础架构中的各种网络功能管理流量。您可以编排虚拟路由器 (vRouter)、虚拟会话边界控制器 (vSBC) 和 5G 核心网络功能,以确保高效管理流量、实现负载均衡以及强制执行特定的安全或服务质量政策。
服务流量导向的工作原理
本部分介绍了服务流量导向的各种组件的工作原理。
服务功能
识别网络流量流:GKE 服务流量导向使用唯一的流 ID(数据包来源 IP 地址、来源端口、目标 IP 地址、目标端口和协议组成的 5 元组哈希)来识别每个网络连接。
确保流亲和性:服务流量导向通过相同服务功能 (SF) 路径定向具有相同流 ID 的所有数据包,以确保流亲和性。
修改数据包以创建新流:如果服务功能修改了数据包中的任何 5 元组字段(例如 NAT 更改来源 IP 地址),这会创建一个新流。
为新流选择流量:流量选择过程会评估新流以确定其通过其余
Service Functions
的路径(可能会采用与原始流不同的路由)。将代理和 NAT 作为两个流进行处理:通过代理或 NAT 的流量被视为两个单独的流:来源到代理/NAT 以及代理/NAT 到目标。服务流量导向不保证这两个流具有相同的路径。
验证来源地址:SF 始终需要进行来源地址验证,即使是并非由服务流量导向进行导向的流量。如果服务功能使用不匹配的来源 IP 地址发起新流,则除非明确允许,否则这些数据包会被丢弃。
保持封装透明度:服务流量导向将 Geneve 封装用于 SF 之间的流量,但服务功能 Pod 本身对此并不了解。数据包在进入 Pod 之前会被解封,从而简化服务功能开发。
现有的关联项
创建 TrafficSelector
后,服务流量导向会自动将它应用于与选择器的条件匹配的任何现有连接。它会将来自这些连接的数据包重定向到相应的服务功能。服务功能本身负责管理这些运行中的连接。一种常见的方法是丢弃数据包并依赖客户端发起新连接,因而该连接会从一开始便无缝集成到服务链中。
资源生命周期
TrafficSelector
和 ServiceFunctionChain
资源会在标记为待删除后立即被删除。没有阻止或延迟资源删除的 webhook 或终结器。
Pod 到服务的流量
服务流量导向会在解析服务虚拟 IP 地址后执行流量选择。如果在解析虚拟 IP 地址后,目标 Pod 的 IP 地址处于 .egress.to.ipBlock
字段中指定的 CIDR 内,则可以选择使用服务的 ClusterIP 定向到服务的流量进行服务流量导向。
NetworkPolicy 强制实施
服务流量导向不会绕过 NetworkPolicy
。来源 Pod 上的出站流量政策和目标 Pod 上的入站流量政策仍适用于被选择进行服务流量导向的流量。但是,不会在服务功能的入站流量或出站流量方面对相应流量强制执行 NetworkPolicy
。这是因为已为来源和目标 Pod(而非数据包转发器)明确定义了 NetworkPolicy
的入站流量或出站流量规则。
优势
采用 GKE 服务流量导向以及过渡到云原生技术具有以下优势:
- Marketplace 产品:第三方可以在 Google Cloud Marketplace 上提供其容器化产品并使用服务流量导向 API。他们可以根据由 GKE 提供和管理的 Kubernetes 内置 API 提供部署指南。
- Kubernetes 粒度:您可以控制 Kubernetes 集群中的流量。您可以对要进行流量导向的流量进行分类。您可以选择希望选择性应用服务流量导向的工作负载。
- 双向性:GKE 的服务流量导向在本质上是双向的。这意味着,对于给定流,返回路径与转发路径对称。在将服务功能 (SF) 作为一组副本进行部署时,这一点很重要。可确保同一流经过同一组副本,以便保持有状态性。
- 多网络支持:大多数服务功能都需要多个 Pod 接口,以便将数据平面与控制平面和管理平面分开。某些服务功能在其架构中包含多个接口。GKE 的服务流量导向包括与 Pod 上的多网络的集成。通过这种方式,用户可以在特定 Pod 网络上创建服务流量导向。
- 将原始数据包传送到应用:GKE 的服务流量导向会封装原始数据包并将其直接传送到 Pod。这样,您就无需进行任何解封,并且您的应用可以直接对原始数据包执行操作。