我们按照 kubernetes 网络原理(1) - 环境预备 & 初窥网络 重新部署一个 BGP
集群的 Calico
。
¶部署 Demo
按照下文的 2 个 yaml 文件部署我们的测试镜像。
1 | apiVersion: v1 |
1 | apiVersion: v1 |
执行部署
1 | $ kubectl apply -f c2c-demo.yaml |
¶状态检测
我们先看看我们的 Pod
运行状态:
1 | $ kubectl get pods -o wide |
我们从 192.168.1.2
访问 192.168.2.3
访问是通畅的。检查下网卡状态
1 | root@c2c-network-demo-w2:/# ip a |
1 | ➜ ~ ip a |
按照上文中的检查veth
的方式,我们还是可以发现这里的 eth0
和 calid9d486e54a8
是一对veth
,那我们的数据包从此处流出。
¶抓包大作战
尝试在物理网卡上抓取 10.12.22.152
的包,并没有获得什么有用的信息。
1 | tcpdump -i ens192 dst host 10.12.22.152 |
尝试使用 tcpdump -i ens192 src 192.168.1.2
抓包,我们却获得真实的数据,这又是为什么?
1 | ➜ ~ tcpdump -i ens192 src 192.168.1.2 |
我们检查下路由表
,我们发现其中的玄妙:
1 | ➜ ~ route -n |
我们发现,系统在处理的时候,将数据包报文直接从 ens192
的网卡,将数据交付给下一跳的 10.12.22.152
机器。因为这两台机器隶属于同一个网络,不需要交换机作为外部桥接,直接采用 IP转发-直接交付
的方式,将数据包转发到 10.12.22.152
所以我们自然在 10.12.22.152
的机器上去监听网卡就获得了如下的数据
1 | ➜ ~ tcpdump -i ens192 src host 192.168.1.2 |
到现在,整个系统的扭转如下:
摆在我们面前,也就是10.12.22.152
的机器又如何处理这个 IP
报文呢?
¶抵达目的地
当我们抵达10.12.22.152
的机器的时候,我们在此机器上查看下路由表
1 | ➜ ~ route -n |
熟悉的配方,我们又从 192.168.2.3 的路由表将数据转发到真正的容器内。
¶汇总
我们从最近的一系列分析中:
- Pod -> Node-A
通过 veth 设备将数据从容器的 eth0 发出 - Node-A -> Node-B
通过路由表将数据发送到 eth0,直接转发IP包 - Node-B -> Pod
eth0 使用路由表将数据从 veth 输入到 Pod 的 eth0
¶New Question
我们整个过程,我们有一些疑问,
- 这些路由表的维护是如何维护的?
- iptable 好像一直没有发现用途?
带着这些问题我们进入下一步的。
¶附录
¶ETCD 操作指南
1 | ETCDCTL_API=3 etcdctl --endpoints=<etcd_ip>:2379 get / --prefix --keys-only |