k8s下POD之间的通信过程

本文主要描述同一个node之内的pod之间的通信,以及不同node之间的pod之间的通信。

同一个node上的不同pod之间的通信:

假设上图的POD A要和POD B 通信: POD A 发送一个包,目的ip为POD B,当包路由后,按路由从POD A的veth0接口出去。这是查找veth0接口下的arp table,如果arp table中没有POD B的record,则进行arp地址解析,即发送arp request,请求reserve 10.1.20.3的mac地址,这个arp request包经docker0 bridge转发到POD B,从而完成地址解析。于是POD A的包填充POD B的mac地址,从veth0发出去。

veth0/veth1是veth对,即从其中一个接口的发包,就转化为另一个接口对该包的接收。所以,POD A从veth0发出的包,相当于docker0 bridge从veth1接口收到这个包。然后docker0 bridge查找转发表(key为dst mac),将包从veth0发送,POD B则在veth1接口接收这个来自POD A的包,通信完成。

不同node上的不同pod之间的通信:

假设上图的PODA 要和另外一个node上的POD X通信,POD X的POD IP为10.1.15.2/24.

POD A组包:

     src ip: 10.1.20.2         dst ip: 10.1.15.2

由于10.1.15.2和自己不在同一个网络10.1.20.0/24, 包需要经veth0发送到自己的网关10.1.20.1(docker0 bridge)。然后开始填充mac, 自然目的mac为docker0 bridge的mac。

当包通过veth对到达docker0 bridge。

Docker0 bridge收到这个包后,丢给内核网络协议栈处理,网络协议栈经过路由发现,这个包的目的地址不是本机,则forward。Forward时重新进行路由,即查找dst ip 为10.1.15.2的route entry。这个dst ip 为10.1.15.2的route entry的out device为flannel0,则将包发送给flannel0设备处理。

Flannel0是一个虚拟的vxlan设备,收到这个包后,构建这个包的mac层。

如果flannel0的arp table没有10.1.15.2对应的mac地址,则会触发一个kernel事件: L3 MISS。

用户空间有个进程flanneld收到这个L3 MISS事件后,从etcd中取得10.1.15.2的mac地址,以及其对应的node的ip地址(假设为192.168.12.100),然后将arp信息填充到flannel0设备下,使得flannel0设备能构建发向10.1.15.2的mac地址。然后flannel0设备构建eth/ip/udp/vxlan包来发送POD A要发送到10.1.15.2的包(eth packet):

      (下图为POD A 发向10.1.15.2的原始包)

Src mac: POD A ,   src ip: 10.1.20.2(POD A)

Dst mac: POD X,  ds tip: 10.1.15.2(POD X)

     (下图为POD A 发向10.1.15.2的vxlan包)

Src mac: POD A所在的node的eth0,  dst mac: POD X所在的node的eth0

Src ip: POD A所在的node的eth0 ip- 192.168.0.200,  ds tip: POD X所在node的eth0 ip – 192.168.12.100.

于是POD A发出的包就被整个封装在vxlan里面发送到对端node上。

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值