k8s - 网络- pod 之间通信
分类:
- pod之间: pod1与pod2同主机, pod1与pod3跨主机
- Node与pod通信: Node1与pod1,与pod3跨主机通信
同一节点上的不同pod通信,通过做网络地址转换(NAT)
Node之间的pod通信,是通过 overlay network(覆盖网络)实现的
flannel覆盖网络
流程:
- etcd 服务启动
- 每个节点上的flannel启动,创建虚拟网卡flannle.1, etcd为每个节点的flannel分配唯一的ip
- flannel配置docker0网桥,实际是通过修改docker启动参数–bip,这样每个节点上的docker网桥就分配了全局唯一的ip
- flannel修改节点路由表,此时flannel虚拟网卡接管容器跨主机通信
[root@k8s-master pod]# ip addr show docker0
12: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:1f:b9:b5:c1 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
[root@k8s-master pod]# ip addr show flannel.1
14: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
link/ether ea:a9:a7:b2:f3:fd brd ff:ff:ff:ff:ff:ff
inet 10.244.0.0/32 brd 10.244.0.0 scope global flannel.1
valid_lft forever preferred_lft forever
[root@k8s-master pod]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.226.2 0.0.0.0 UG 100 0 0 ens33
10.244.0.0 0.0.0.0 255.255.255.0 U 0 0 0 cni0
如:
节点 | ip | docker0网桥 | flannel.1网上 | pod |
---|---|---|---|---|
node-master | 192.168.xx.19 | 172.17.0.1/16 | 10.244.0.0/32 | pod1/10.244.0.20 |
node1 | 192.168.xx.20 | 172.17.0.1/16 | 10.244.1.0/32 | pod2/10.244.1.22 |
很奇怪,我虚拟机上不同节点的docker0网桥居然是一样的,理论上来讲应该是不一样的??
举例
pod1(10.244.0.20)与pod2(10.244.1.22) 实现通信 流程
- 数据包A从master节点 pod1 发出,发现 docker0 上没有对应的路由表,转发到docker0
- docker0 网桥路由到 flannel.1网卡上(etcd中维护了docker0与flannel的路由表,但是我在etcd中没有找到。。)
- flannel.1网卡对数据包封装,通过隧道协议,默认是UDP,发送到node1节点上的 flannel.1网卡上
- node1 的flannel.1将数据转发到 node1上的docker0网桥
- node1 上的docker0 根据路由表 将数据包转发给 pod2