k8s网络
基础
容器网络一般有三种:
veth pair bridge
这种方式会在容器上,以及宿主机上,产生一对(2个)网卡,两个网卡之间是桥接的方式
这种用的是最多的,默认情况下用的都是这个
MacVLAN/IPVLAN 的方式
MacVLAN,容器使用虚拟网卡和虚拟mac地址,与宿主机通过物理网卡通信
IPVLAN, 容器和宿主机共用同一个mac 地址,但容器有自己的IP地址
SR-IOV方式
容器直接使用宿主机的网卡,一个网卡对应一个容器
查看cgroup和 network namespace
lsns -t cgroup
lsns -t net // 或者 ip netnsnetwork namespace初探
创建两个network namespace进行通信
在同一个linux宿主机上创建两个 network namespace,然后每一个network namespace里创建一个虚拟网卡,配置一个虚拟ip,模拟通信
删除的时候,直接删除 namespace,则 namespace里的虚拟网卡也就被删除了
将两个network namespace里的网卡,与加宿主机 的veth peer,在veth peer里进行bridge进行通信
flannel
flannel 支持三种网络模式,vxlan, host-gw, vxlan+host-gw。宿主机上有一个 cni0的网桥,pod 和宿主机之间,有一个veth pair,宿主机上的veth 加入到 cni0上,从而让宿主机和 pod 里的ip产生了联系。当不同节点的2个pod之间通信的时候,pod通过自己的veth,将流量给宿主机veth,再给宿主机cni0,然后在 vxlan网络里,给另外一个节点cni0,再给另外一个节点的veth,再给pod内的veth,从而另外一个节点的pod能收到这个数据包。在这种模式下ping的话,通过TTL判断,能看出减少了2. 如果是 host-gw 网络,那么就不是 vxlan了,是靠本机路由实现的。但需要网络环境支持这种路由(比如IDC,在云厂商就不行了)。为了让 vxlan 和 host-gw 结合起来,本机走 host gw,跨节点走vxlan,flannel也是支持这么配置的。
calico
calico 和 flannel最大的不同,是没有了 cni0 网桥,pod 和宿主机还是有一对veth,宿主机上的veth,要开启 proxy arp 的功能,当pod去任意地址的时候,宿主机的 veth 都会响应,然后再通过路由的模式,找到目标地址的宿主机veth.
arp proxy 学习
Last updated