劫持的数据的流转动作
对于入站的数据,被劫持之后的目的动作有两个:
RETURN,不进行任何istio proxy的处理
ISTIO_IN_REDIRECT,进行istio proxy的入站处理
对于出站的数据,被劫持之后的目的动作有三个:
RETURN,不进行任何istio proxy的处理
ISTIO_IN_REDIRECT,进行istio proxy的入站处理
ISTIO_REDIRECT,进行istio proxy的出站处理
这里比较费解的是出站数据竟然有可能要进行入站处理,主要是考虑服务A的某个POD1调用自己所在的服务A的Kubernetes service IP,最后被istio proxy进行mesh之后调度到自己(POD1)的情况,这种情况下出站操作之后紧接着就应该是入站操作。
servicemesh的调用和响应流程
app1(svc1)会使用app2所在的svc2来进行调用:
a) app1容器发出请求数据包P1(src: POD1_IP, dst: svc2, out device: eth0)
b) P1会先经过iptables的ISTIO_OUTPUT链表,根据P1的TCP包头信息以及数据包owner是app1,所以不能匹配规则15~22,而匹配规则23进入ISTIO_REDIRECT链表
c) P1经过ISTIO_REDIRECT链表规则6的引导进入proxy的15001出站监听端口
d) proxy根据svc2的域名进行mesh而选中svc2的一个endpoint app2,确定其地址POD2_IP,数据包P1被修改成P2(src: POD1_IP, dst: POD2_IP, out device: eth0),该数据包进入ISTIO_OUTPUT链表
e) 由于数据包P2输出设备是eth0,owner是proxy,所以不满足链表规则15~17,但是满足规则18,所以直接return,并且随后eth0被发送出去到app2所在的POD2
f) 在POD2数据包P2被接收之后被修改成数据包P3(src: POD1_IP, dst: POD2_IP, in device: eth0),并进入ISTIO_INBOUND链表
g) ISTIO_INBOUND链表内部的规则9~12都无法匹配,所以直接进入ISTIO_IN_REDIRECT链表
h) ISTIO_IN_REDIRECT链表规则7将数据包P3引导进入proxy的15006入站监听端口
i) proxy处理完毕之后数据包P3被修改成数据包P4(src: POD1_IP, dst: 127.0.0.1, out device: lo)并且由proxy发送出去并进入ISTIO_OUTPUT链表
j) 由于数据包P4的owner是proxy并且输出设备是lo,所以不满足ISTIO_OUTPUT链表的规则15~21,而匹配规则22,直接return并且将数据包P4发送给业务容器app2
app2(svc2)处理之后响应app1的流程如下:
k) app2将响应数据包P5(src: POD2_IP, dst: POD1_IP, out device: eth0)发送出来进入ISTIO_OUTPUT链表
l) 数据包P5的owner是app2并且出口设备是eth0,所以无法匹配ISTIO_OUTPUT链表规则15~22,可以匹配规则23,进入ISTIO_REDIRECT链表
m) ISTIO_REDIRECT链表的规则6将数据包P5引导进入proxy的15001出站监听端口
n) 针对响应数据包,proxy不做mesh处理,直接将数据包P5(src: POD2_IP, dst: POD1_IP, out device: eth0)发出来至ISTIO_OUTPUT链表,并将数据包owner变成proxy的uid
o) 数据包P5会匹配ISTIO_OUTPUT链表的规则18,直接return,后续发送给app1所在的POD1
p) POD1接收之后会进入ISTIO_INBOUND链表,此时数据包P5被修改成数据包P6(src: POD2_IP, dst: POD1_IP, in device: eth0),这个数据包P6会匹配规则13,进入ISTIO_IN_REDIRECT链表
q) ISTIO_IN_REDIRECT链表规则7会将数据包P6引导进入proxy的15006入站监听端口
r) 针对响应数据包,proxy不做mesh处理,会将数据包P6修改成P7(src: POD2_IP, dst: 12.0.0.1, out device: lo)并直接将数据包P7发出来至ISTIO_OUTPUT链表,并将数据包owner变成proxy的uid
s) 根据P7数据包的特点,会匹配ISTIO_OUTPUT链表的规则22,直接return并且将数据包P7发送给业务容器app1,完成一次请求响应
注释:
特别的,如果svc1 = svc2,并且在步骤d)中POD1 = POD2,则数据包的出口设备会变成lo,目的地址为POD1的IP地址,则会匹配ISTIO_OUTPUT链表中的规则16/19,然后进入ISTIO_IN_REDIRECT链表