赞
踩
istio数据平面的核心是proxy,以sidecar模式运行,每个服务pod启动时伴随启动istio-init和proxy容器。其中istio-init容器主要功能是初始化pod网络和对pod设置iptable规则,设置完毕后自动结束。proxy容器中启动两个服务:pilot-agent、envoy,agent的作用是同步管理数据、启动并管理envoy服务进程、上报遥测数据,envoy服务则根据管理策略完成流量管控、生成遥测数据。
*mangle :PREROUTING ACCEPT [24256:13098448] :INPUT ACCEPT [24256:13098448] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [23191:16009212] :POSTROUTING ACCEPT [23191:16009212] COMMIT # Completed on Mon Apr 15 02:43:12 2019 # Generated by iptables-save v1.6.0 on Mon Apr 15 02:43:12 2019 *nat :PREROUTING ACCEPT [1276:76560] :INPUT ACCEPT [1276:76560] :OUTPUT ACCEPT [1034:91283] :POSTROUTING ACCEPT [1034:91283] :ISTIO_INBOUND - [0:0] :ISTIO_IN_REDIRECT - [0:0] :ISTIO_OUTPUT - [0:0] :ISTIO_REDIRECT - [0:0] -A PREROUTING -p tcp -j ISTIO_INBOUND -A OUTPUT -p tcp -j ISTIO_OUTPUT -A ISTIO_INBOUND -p tcp -m tcp --dport 9080 -j ISTIO_IN_REDIRECT -A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15001 -A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -j ISTIO_REDIRECT -A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN -A ISTIO_OUTPUT -m owner --gid-owner 1337 -j RETURN -A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN -A ISTIO_OUTPUT -j ISTIO_REDIRECT -A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001
istio通过给nat表中PREROUTING、OUTPUT链增加规则来实现流量redirect,流量流转大致如下图:
首先,我们假设:srv-A监听9080端口,proxy监听15001端口,下游服务向srv-A发送的请求为“to 9080”,srv-A的upstream是srv-B。
-A PREROUTING -p tcp -j ISTIO_INBOUND
-A ISTIO_INBOUND -p tcp -m tcp --dport 9080 -j ISTIO_IN_REDIRECT
-A ISTIO_IN_REDIRECT -p tcp -j REDIRECT --to-ports 15001
从这条规则可以看出,所有从外部请求本地目标端口9080的tcp流量均会重定向到本地15001端口(proxy监听)
-A OUTPUT -p tcp -j ISTIO_OUTPUT
所有从本地流向外部的tcp流量均会被ISTIO-OUTPUT规则处理
-A ISTIO_OUTPUT ! -d 127.0.0.1/32 -o lo -j ISTIO_REDIRECT
从lo网卡流出,并且目的地址不是环回地址的tcp流量将会被重定向
-A ISTIO_OUTPUT -m owner --uid-owner 1337 -j RETURN
-A ISTIO_OUTPUT -m owner --gid-owner 1337 -j RETURN
对istio-proxy自己发出的流量不做处理(从proxy往外发送的流量本身就已经得到了处理,自然不用再redirect到proxy)。注:当proxy作为sidecar运行时,启用的是envoy的redirect模式,此时进程为–uid-owner 1337;当proxy作为透明代理运行时,启用的是envoy的tproxy模式,此时进程为–gid-owner 1337
-A ISTIO_OUTPUT -d 127.0.0.1/32 -j RETURN
对目的地址是环回地址的流量不做处理(这部分流量是proxy将外部请求upstream到srv-A的流量,以及srv-A回复给proxy的流量,也不能redirect到proxy的15001端口)
-A ISTIO_OUTPUT -j ISTIO_REDIRECT
-A ISTIO_REDIRECT -p tcp -j REDIRECT --to-ports 15001
其他出口流量均redirect到proxy的15001端口(这部分流量是srv-A请求srv-B服务所产生)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。