邢台天气:Istio 流量挟制历程

admin 4个月前 (05-30) 科技 33 0

开篇

Istio 流量挟制的文章实在现在可以在servicemesher社区找到一篇异常详细的文章,可查阅:Istio 中的 Sidecar 注入及透明流量挟制历程详解。特别是博主整理的那张“流量挟制示意图”,已经可以很清晰的看出来挟制流程。这里我借着那张图片注释一版该图片的文字版本。在最先文字版前若是对iptables下令若是不是异常领会的话建议先重点看下下面的两篇文章,深入浅出的注释了该下令的观点及用法:

  1. iptables观点 - 以通俗易懂的方式形貌iptables的相关观点
  2. iptables指南 - iptables下令用法指南

这里引用iptables的一张报文流向图(版权归原博主所有)

当客户端接见服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部门,以是,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目的终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目的终点则为客户端,这个时刻,web服务所监听的IP与端口反而变成了原点。 -- 引用自 zsythink

上面这部门形貌相当主要,它是明白sidecar在举行流量挟制的基础之一。

下面我们剖析下昨天istio-init启动时执行的istio-iptables下令

nsenter -t 8533 -n iptables -t nat -S

# 默认
# 为PREROUTING/INPUT/OUTPUT/POSTROUTING链设置策略为吸收数据包(ACCEPT)
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT

# 自定义4个istio的规则链
-N ISTIO_INBOUND
-N ISTIO_IN_REDIRECT
-N ISTIO_OUTPUT
-N ISTIO_REDIRECT

# 进入PREROUTING链tcp协议请求所有定向至 ISTIO_INBOUND 自定义链举行规则匹配
-A PREROUTING -p tcp -j ISTIO_INBOUND
# 进入OUTPUT链tcp协议请求所有定向至 ISTIO_OUTPUT 自定义链举行规则匹配
-A OUTPUT -p tcp -j ISTIO_OUTPUT

# 入口
# tcp协议请求且请求端口为22/15090/15021/15020的请求住手执行当前链中的后续Rules,并执行下一个链
-A ISTIO_INBOUND -p tcp -m tcp --dport 22 -j RETURN
-A ISTIO_INBOUND -p tcp -m tcp --dport 15090 -j RETURN
-A ISTIO_INBOUND -p tcp -m tcp --dport 15021 -j RETURN
-A ISTIO_INBOUND -p tcp -m tcp --dport 15020 -j RETURN
# tcp协议且端口不是22/15090/15021/15020的请求所有定向至 ISTIO_IN_REDIRECT
-A ISTIO_INBOUND -p tcp -j ISTIO_IN_REDIRECT
# 将重定向于此的tcp协议请求流量所有重定向至15006端口(envoy入口流量端口)
-A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15006

# 出口
#  源IP地址为localhost且数据包出口为 ”lo“ 的流量都返回到它的挪用点中的下一条链执行(1)
-A ISTIO_OUTPUT -s 127.0.0.6/32 -o lo -j RETURN
#  目的地非localhost,数据包出口为 ”lo“,是istio-proxy用户的流量转发至 ISTIO_REDIRECT (2)
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -m owner --uid-owner 1337 -j ISTIO_IN_REDIRECT
#  数据包出口为 ”lo“,非istio-proxy用户的流量都返回到它的挪用点中的下一条链执行(1)
-A ISTIO_OUTPUT -o lo -m owner ! --uid-owner 1337 -j RETURN
#  istio-proxy 用户的流量都返回到它的挪用点中的下一条链执行
-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN
#  目的地非localhost,数据包出口为 ”lo“,是istio-proxy用户组的流量转发至 ISTIO_REDIRECT(2)
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -m owner --gid-owner 1337 -j ISTIO_IN_REDIRECT
#  数据包出口为 ”lo“ 且非istio-proxy用户组流量都返回到它的挪用点中的下一条链执行(1)
-A ISTIO_OUTPUT -o lo -m owner ! --gid-owner 1337 -j RETURN
#  到 istio-proxy 用户组的流量都返回到它的挪用点中的下一条链执行(1)
-A ISTIO_OUTPUT -m owner --gid-owner 1337 -j RETURN
#  所有目的地为localhost的流量都返回到它的挪用点中的下一条链执行(1)
-A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN
#  其他不满足上述rules的流量所有转发到 ISTIO_REDIRECT  (2)
-A ISTIO_OUTPUT -j ISTIO_REDIRECT
#  将重定向于此的tcp协议请求流量所有重定向至15001端口(envoy出口流量端口)
-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001

-m = --match. istio-proxy 用户身份运行, uid-owner 1337 为用户ID / gid-owner 1337 为用户组,即 sidecar 所处的用户空间,这也是 istio- proxy 容器默认使用的用户。

注重文中打括号的地方

(1) 代表流量会直接执行下一个阻挡链,本文中下一个阻挡链为POSTROUTING

(2) 代表流量会被重定向至envoy出口流量端口

凭据上面的规则小结一下:

ISTIO_INBOUND 链:所有进入Pod但非指定端口(如22)的流量所有重定向至15006端口(envoy入口流量端口)举行阻挡处置。

ISTIO_OUTPUT 链:所有流出Pod由 istio-proxy 用户空间发出且目的地不为localhost的流量所有重定向至15001端口(envoy出口流量端口),其他流量所有直接放行至下一个POSTROUTING链,不用被envoy阻挡处置。

实在仔细思索下可以看到,流量阻挡主要发生在两个地方:

  1. 用户请求到达Pod时对应流量会被阻挡至sidecar举行处置,由sidecar请求营业服务
  2. 当营业服务响应用户请求时该响应再次被阻挡至sidecar,由sidecar响应用户

再看下iptables nat 表的规则

nsenter -t 8533 -n iptables -t nat -L -v


Chain PREROUTING (policy ACCEPT 3435 packets, 206K bytes)
 pkts bytes target     prot opt in     out     source               destination         
 3435  206K ISTIO_INBOUND  tcp  --  any    any     anywhere             anywhere      (1)       

Chain INPUT (policy ACCEPT 3435 packets, 206K bytes)                                  (5)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 599 packets, 54757 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   22  1320 ISTIO_OUTPUT  tcp  --  any    any     anywhere             anywhere            

Chain POSTROUTING (policy ACCEPT 599 packets, 54757 bytes)                            (8)
 pkts bytes target     prot opt in     out     source               destination         

Chain ISTIO_INBOUND (1 references)                                                    (2) 
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     tcp  --  any    any     anywhere             anywhere             tcp dpt:22
    1    60 RETURN     tcp  --  any    any     anywhere             anywhere             tcp dpt:15090
 3434  206K RETURN     tcp  --  any    any     anywhere             anywhere             tcp dpt:15021
    0     0 RETURN     tcp  --  any    any     anywhere             anywhere             tcp dpt:15020
    0     0 ISTIO_IN_REDIRECT  tcp  --  any    any     anywhere             anywhere  (3)        

Chain ISTIO_IN_REDIRECT (3 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REDIRECT   tcp  --  any    any     anywhere             anywhere             redir ports 15006                                                                     (4)

Chain ISTIO_OUTPUT (1 references)                                                     (6)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 RETURN     all  --  any    lo      127.0.0.6            anywhere            
    0     0 ISTIO_IN_REDIRECT  all  --  any    lo      anywhere            !localhost            owner UID match 1337
    0     0 RETURN     all  --  any    lo      anywhere             anywhere             ! owner UID match 1337
   22  1320 RETURN     all  --  any    any     anywhere             anywhere             owner UID match 1337
    0     0 ISTIO_IN_REDIRECT  all  --  any    lo      anywhere            !localhost            owner GID match 1337
    0     0 RETURN     all  --  any    lo      anywhere             anywhere             ! owner GID match 1337
    0     0 RETURN     all  --  any    any     anywhere             anywhere             owner GID match 1337
    0     0 RETURN     all  --  any    any     anywhere             localhost           
    0     0 ISTIO_REDIRECT  all  --  any    any     anywhere             anywhere            

Chain ISTIO_REDIRECT (1 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REDIRECT   tcp  --  any    any     anywhere             anywhere             redir ports 15001

让我们一起再来仔细看下面这个图片,同步考察上面iptables chain的规则。这里的剖析主要针对红色的数字一对一注释:

  1. productpage 服务对reviews 服务发送 TCP 毗邻请求
  2. 请求进入reviews服务所在Pod内核空间,被netfilter阻挡入口流量,经由PREROUTING链然后转发至ISTIO_INBOUND
  3. 在被ISTIO_INBOUND链被这个规则-A ISTIO_INBOUND -p tcp -j ISTIO_IN_REDIRECT阻挡再次转发至ISTIO_IN_REDIRECT
  4. ISTIO_IN_REDIRECT链直接重定向至 envoy监听的 15006 入口流量端口
  5. 在 envoy 内部经由一系列入口流量治理动作后,发出TCP毗邻请求 reviews 服务,这一步对envoy来说属于出口流量,会被netfilter阻挡转发至出口流量OUTPUT
  6. OUTPUT链转发流量至ISTIO_OUTPUT
  7. 目的地为localhost,不能匹配到转发规则链,直接RETURN到下一个链,即POSTROUTING
  8. sidecar发出的请求到达reviews服务9080端口
  9. reviews服务处置完营业逻辑后响应sidecar,这一步对reviews服务来说属于出口流量,再次被netfilter阻挡转发至出口流量OUTPUT
  10. OUTPUT链转发流量至ISTIO_OUTPUT
  11. 发送非localhost请求且为istio-proxy用户空间的流量被转发至 ISTIO_REDIRECT
  12. ISTIO_REDIRECT链直接重定向至 envoy监听的 15001 出口流量端口
  13. 在 envoy 内部经由一系列出口流量治理动作后继续发送响应数据,响应时又会被netfilter阻挡转发至出口流量OUTPUT
  14. OUTPUT链转发流量至ISTIO_OUTPUT
  15. 流量直接RETURN到下一个链,即POSTROUTING

针对上文实在我另有两个疑问点,还请人人不吝指教:

  • 上面的明白没有写第16点,博主的图中的16点还会再进 ISTIO_REDIRECT链,我们可以看到 ISTIO_REDIRECT链中只有一个改写端口转发的规则,这样岂不是会进入一个死循环?或者是我还没有明白清晰
  • envoy 转发流量是不是自己新确立的tcp 毗邻请求照样通过修改请求报文地址来实现的。由于对c++领会有限,无法查阅其源码去一探事实

从整个流量阻挡流程人人也可以看出,路径这么长, 在大并发场景下肯定会损失转发性能。现在业界有一些框架在试着缩短这个阻挡路径,让人人拭目以待吧。

参考文献

https://www.servicemesher.com/blog/sidecar-injection-iptables-and-traffic-routing/

https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#REDIRECTTARGET

http://www.zsythink.net/archives/1199

,

Allbet Gaming

www.xjllhp.com欢迎进入欧博平台网站(Allbet Gaming),Allbet Gaming开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博真人游戏(百家乐)等业务。

AllBetGaming声明:该文看法仅代表作者自己,与本平台无关。转载请注明:邢台天气:Istio 流量挟制历程

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:794
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1349
  • 评论总数:363
  • 浏览总数:32707