istio学习笔记 - 1 (初探数据平面)

istio学习笔记 - 1 (初探数据平面)

  • 数据平面模型
    • 模型
    • iptables规则

数据平面模型

模型

istio学习笔记 - 1 (初探数据平面)_第1张图片
istio数据平面的核心是proxy,以sidecar模式运行,每个服务pod启动时伴随启动istio-init和proxy容器。其中istio-init容器主要功能是初始化pod网络和对pod设置iptable规则,设置完毕后自动结束。proxy容器中启动两个服务:pilot-agent、envoy,agent的作用是同步管理数据、启动并管理envoy服务进程、上报遥测数据,envoy服务则根据管理策略完成流量管控、生成遥测数据。

iptables规则

 *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,流量流转大致如下图:
istio学习笔记 - 1 (初探数据平面)_第2张图片
首先,我们假设: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服务所产生)

你可能感兴趣的:(istio学习笔记 - 1 (初探数据平面))