资源清单
nodeA 192.168.1.1
nodeB 192.168.1.2
podA 在 nodeA 上 podIP 10.111.1.1
podB 在 nodeB 上 podIP 10.111.2.2
podC 在 nodeA 上 podIP 10.111.3.3
svc 管理 podA podB ,svcIP 为 10.111.4.1
svc endpoint 为 10.111.1.1 、10.111.2.2
疑问点在 podC 通过 svcIP 访问的流程,其中涉及了 flannel-UDP 、网桥、kubeproxy ipvs ,比较乱,想整体捋清下流程
以下是我认为的流程
发送
1.nodeA 上的 podC 发出向 svc 的流量,源地址 10.111.3.3 ,目标地址 10.111.4.1 ,根据容器内路由会走 cni0 网桥
2.cni0 和宿主机网卡建立 pair veth 关系,流量会出现在宿主机网卡
3.由于目的 ip 为一个 svc 地址,nodeA 上面的 kubeproxy 已经提前建立好的 iptables ,会做 DNAT 转换为 podA 、podB 的 IP
4.此时在 nodeA 上已经做了 DNAT ,相当于是 podC 请求 podB 的 IP(iptables 做负载均衡,假如负载到了 podB)
5.nodeA 根据路由将流量转到 flanned.0 ,TUN 到 flanned
6.flanned 通过 etcd 获取 podB IP 和 node 的关系,得到 podB 在 nodeB 上,封 UDP 包
7.此时 IP 包的源 IP 为 nodeA 、目的 IP 为 nodeB ,UDP 包的源 IP 为 podC 、目的 IP 为 podB ,用 nodeB 做 ARP ,经过内核将 UDP 发出
收包
1.流量到 nodeB 上的 flanne.0,TUN 到 flanned ,解包得出真正容器维度源 IP 、目的 IP
2.根据目的 IP 流转到 cni0
3.流到 podB
以上的流程有问题么???感觉 svc 经过 iptables 转换为 endpoint 中的 IP ,不太确定到底是发生在哪一步
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.