这里以用户访问 https://gw.example.com gateway服务为例,整个网络包的调用过程如下:
`CLIENT->阿里云SLB->K8S NODE(IPVS/kube-proxy)->INGRESS POD(nginx controller)->GATEWAY POD(gateway服务)`
```BASH
CLIENT IP: CLIENT_IP
SLB IP: 47.107.x.x
K8S NODE IP: 172.18.238.85
INGRESS POD IP: 10.151.0.78
GATEWAY POD IP: 10.151.0.107
```
#### 1.CLIENT-->阿里云SLB
```bash
解析gw.example.com 47.107.x.x(SLB公网ip),
数据包到达阿里云SLB(CLIENT_IP:RANDOM_PORT---->47.107.x.x:443)
```
#### 2.阿里云SLB-->K8S NODE(IPVS/kube-proxy)
```bash
阿里云SLB配置后端虚拟服务: TCP:443-->172.18.238.85:30483
数据包到达K8S NODE(CLIENT_IP:RANDOM_PORT---->172.18.238.85:30483)
```
K8S NODE抓包
```bash
$ tcpdump -i eth0 ip host CLIENT_IP -n
14:39:33.043508 IP CLIENT_IP.RANDOM_PORT > 172.18.238.85.30483: Flags [S], seq 1799504552, win 29200, options [mss 1460,sackOK,TS val 1092093183 ecr 0,nop,wscale 7], length 0
```
#### 3.K8S NODE(IPVS/kube-proxy)-->INGRESS POD(nginx controller)
IPVS配置后端服务:
```BASH
$ ipvsadm -L -n
TCP 172.18.238.85:30483 rr
-> 10.151.0.78:443 Masq 1 2 40
-> 10.151.0.83:443 Masq 1 8 42
```
```BASH
数据包到达nginx ingress(CLIENT_IP:RANDOM_PORT---->10.151.0.78.443)
```
K8S NODE抓包nginx ingress服务([抓包pod教程](https://ynotes.cn/blog/article_detail/260))
```bash
$ tcpdump -i vethfe247b7f -nnn |grep "\.443" #vethfe247b7f为ingress controller pod的网卡
16:45:28.687578 IP CLIENT_IP.RANDOM_PORT > 10.151.0.78.443: Flags [S], seq 2547516746, win 29200, options [mss 1460,sackOK,TS val 1099648828 ecr 0,nop,wscale 7], length 0
```
#### 4.INGRESS POD(nginx controller)->GATEWAY POD(gateway服务)
```bash
$ kubectl get pods -o wide --all-namespaces|grep 10.151.0.78
kube-system nginx-ingress-controller-8489c5b8c4-fccs5 1/1 Running 1 49d 10.151.0.78 cn-shenzhen.172.18.238.85 <none> <none>
```
```BASH
数据包到达gateway服务(10.151.0.78.57270---->10.151.0.107.18880)
```
K8S NODE抓包gateway服务
```bash
$ tcpdump -i veth553c1000 -nnn port 18880
17:05:58.463497 IP 10.151.0.78.57270 > 10.151.0.107.18880: Flags [S], seq 3538162899, win 65535, options [mss 1460,sackOK,TS val 878505289 ecr 0,nop,wscale 9], length 0
```