社区编辑申请
注册/登录
浅析Istio组件Envoy的流量管理
网络 网络管理
Envoy的核心工作内容在于对业务透明的请求拦截,将所有进出流量进行管理。对拦截的请求进行一定的规则进行安全访问控制、接入控制、流量控制等诸多方面处理后,发送给应用程序。

背景介绍

微服务架构带来的开发便捷性使业务功能的开发周期明显缩短,通过对于云计算平台架构的原生优化,让业务功能的持续集成与交付更为敏捷。但同时微服务架构也引入了服务治理的诸多问题:一个应用由多个服务组成,每个服务有数个实例,每个实例的运行状态又在实时变化,这些催生了服务间通讯层的出现。通讯层既不与应用程序代码耦合,又能捕获到底层环境的动态变化并作出适当的调整,避免业务出现单点故障。

1.ServiceMesh简介

1.1服务网格(Service Mesh)简介

服务网络是一个基础设施层,用于处理服务间通信。云原生应用有着复杂的服务拓扑,服务网格负责在这些拓扑中实现请求的可靠传递。在实践中,服务网格通常实现为一组轻量级网络代理,它们与应用程序一起部署,但对应用程序透明。

从局部看,服务网格技术就是在应用节点上部署代理,应用将请求发给代理,由代理完成点对点的路由转发。

在上面的图中,如果把左边图中的应用程序去掉,只呈现出来代理和它们之间的调用关系(即右图)。这时Service Mesh的概念就会清晰:代理和调用关系形成完整的网络,代表服务间复杂的调用关系,承载着系统内的所有应用。

1.2服务网络架构特点及优势

1)点对点通讯:没有中心瓶颈。

2对应用无入侵:可以支持异构技术产品的集成。同时对应用透明,应用开发不再需要关心复杂的网络通讯实现,可以专注业务逻辑的实现。

2.Istio及Envoy简介

Istio是一个由Google,IBM和Lyft团队合作开发的开源Service Mesh框架。目前已成为ServiceMesh的事实技术标准,被广泛应用于各个行业的IT架构。

Envoy 是用 C++语言开发的高性能代理,其内置服务发现、负载均衡、TLS终止、HTTP/2、GRPC代理、熔断器、健康检查,基于百分比流量拆分的灰度发布、故障注入等功能,用于协调服务网格中所有服务的入站和出站流量。

3.Envoy流量管理的原理

3.1Iptables介绍

Istio调用Linux中的iptables进行流量管理。iptables是一个运行在用户空间的应用软件,它通过控制Linux内核netfilter模块,来管理网络数据包的流动与转送,实际上netfilter才是防火墙真正的安全框架。netfilter是Linux网络安全大厦的基石,它提供了一整套钩子(Hook)函数机制,IP层的5个钩子点对应了iptables的5个内置链条:

  • PREROUTING:在此DNAT。
  • POSTROUTING:在此SNAT。
  • INPUT:处理输入给本地进程的封包。
  • OUTPUT:处理本地进程输出的封包。
  • FORWARD:处理转发给其他机器、其他网络命名空间的封包。

3.2关于网络入站的IP封包

从网络入站的IP封包,先入TREOUTING链,而后进行路由判断:

1)如果封包路由目的地是本机:则进入INPUT链,然后发给本地进程。

2如果封包路由目的地不是本机,并且启用了IP转发,则进入FORWARD链,然后通过POSTROUTING链,最后经过网网络接口发走。

3对于本地进程发往协议栈的封包,则首先通过OUTPUT链,然后通过POSTROUTING链,最后经过网络接口发走。

3.3关于自定义链

除此以外,我们还可以自定义链,但自定义链只能被某个默认的链当做动作去调用才能起作用。

在Kubernetes中Istio通过Admission webhook的机制将Envoy Sidecar自动注入,与应用容器运行于同一个Pod中,这种情况下它们将共享网络名称空间,因此也使用同一个网络协议栈。

Istio 给应用 Pod 注入的配置主要包括:

1)Init 容器 istio-init:用于Pod中设置iptables端口转发。

2) Sidecar 容器 istio-proxy:运行Envoy Sidecar代理。

3.4Iptables配置规则

在容器初始化后,我们进入Sidecar容器切换为root用户,查看配置的iptables规则。

iptables -t nat -S

ISTIO_INBOUND 链:对所有进入Pod但非指定端口(如22)的流量全部重定向至15006端口(Envoy入口流量端口)进行拦截处理。

ISTIO_OUTPUT 链:将由 istio-proxy 用户空间发出且目的地不为localhost的Pod流出流量全部重定向至15001端口(envoy出口流量端口)。其他流量全部直接放行至下一个POSTROUTING链,不用被Envoy拦截处理。

整体流量流向示意图如下图所示:

1)进入Pod的Inbound流量首先被PREROUTING链拦截并处理。

2当TCP请求进入PREROUTING链时全部交给ISTIO_INBOUND处理。

-A PREROUTING -p tcp -j ISTIO_INBOUND

3请求目标端口非15008/22/15090/15021/15020的TCP请求全部交给ISTIO_IN_REDIRECT处理。

-A ISTIO_INBOUND -p tcp -j ISTIO_IN_REDIRECT

4将发送到此的TCP请求全部重定向至15006端口(Envoy入口流量端口)

-A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15006

5)在Envoy内部处理后,决定将数据包转发到应用,这一步对Envoy来说属于出口流量,会被netfilter拦截转发至出口流量OUTPUT链。

6出站请求,当TCP请求进入OUTPUT链时全部交给ISTIO_OUTPUT处理。

-A OUTPUT -p tcp -j ISTIO_OUTPUT

7匹配出站请求对应规则,请求本地服务,出口为lo网卡同时来自istio-proxy用户空间,流量返回到它的调用点中的下一条链执行,即POSTROUTING链 。

-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN -A ISTIO_OUTPUT -m owner 
--gid-owner 1337 -j RETURN

8Sidecar发出的请求到达目标应用。

9目标应用处理完业务逻辑后响应Sidecar,这一步对应用来说属于出口流量,再次被netfilter拦截转发至出口流量OUTPUT链。

10 出站请求,当TCP请求进入OUTPUT链时全部交给ISTIO_OUTPUT处理。

-A OUTPUT -p tcp -j ISTIO_OUTPUT

11请求下一个服务/响应请求,即请求非本地服务同时不来自istio-proxy用户空间,流量被转发至ISTIO_REDIRECT链。

-A ISTIO_OUTPUT -j ISTIO_REDIRECT

12将重定向于此的TCP协议请求流量全部重定向至15001端口(Envoy出口流量端口)。

-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001

13在Envoy内部处理后,决定将数据包对外转发,这一步对Envoy来说属于出口流量,会被netfilter拦截转发至出口流量OUTPUT链。

14出站请求,当TCP请求进入OUTPUT链时全部交给ISTIO_OUTPUT处理。

-A OUTPUT -p tcp -j ISTIO_OUTPUT

15请求非本地的服务,出口不为lo网卡同时来自istio-proxy用户空间则跳过了ISTIO_REDIREC处理,直接RETURN到下一个链,即POSTROUTING链

-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN -A ISTIO_OUTPUT -m owner 
--gid-owner 1337 -j RETURN

16POSTROUTING链处理完成后,根据路由表选择合适的网卡发送Outbound流量。

4.总结

Envoy的核心工作内容在于对业务透明的请求拦截,将所有进出流量进行管理。对拦截的请求进行一定的规则进行安全访问控制、接入控制、流量控制等诸多方面处理后,发送给应用程序。通过使用Envoy,可以使开发者专注于应用功能的开发,不用考虑复杂的网络通讯。

责任编辑:武晓燕 来源: 匠心独运维妙维效
相关推荐

2022-03-10 08:24:17

Docker容器SaaS

2022-05-11 15:08:52

驱动开发系统移植

2022-05-09 11:19:12

CSS函数开源

2022-03-07 15:22:16

classHarmony鸿蒙

2022-04-19 11:23:26

release3.1子系统鸿蒙

2022-05-11 14:48:33

腾讯云寿险民生保险

2022-05-24 07:51:05

测试模型测试单元测试

2022-04-15 09:23:29

Kubernetes面试题

2022-04-30 08:43:52

Spring模块化框架

2022-03-11 10:53:32

UML建模语言

2022-04-21 10:49:30

智慧城市物联网

2022-04-17 23:09:07

深度学习人工智能芯片

2022-04-15 14:57:57

Flex布局鸿蒙操作系统

2022-04-24 14:56:53

容器组件StackTS

2022-04-13 08:00:00

Hilla开发Java

2022-05-13 09:27:55

Widget机票业务App

2022-04-29 14:56:40

通话应用源码剖析

2022-04-12 15:48:47

物联网

2022-04-20 11:14:05

人工智能军事化科技革命

2022-04-28 16:14:05

区块链加密货币数据

同话题下的热门内容

秒懂流媒体协议 RTMP 与 RTSP

编辑推荐

这是全面的IGMP协议总结,没有之一!百亿级访问量的实时监控系统如何实现?深度 | 只有IT人才能读懂的《西游记》10分钟理解TCP、UDP 和端口号从TCP到Socket,彻底理解网络编程是怎么回事
我收藏的内容
点赞
收藏

51CTO技术栈公众号