k8s中规定了CNI接口,但是没有标准化网络方案,网络方案也是网络基础,在这个基础上k8s提供了service负载均衡抽象,搞清楚基础网络方案是非常重要的。
CNI定义
type CNI interface {
AddNetworkList(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)
DelNetworkList(net *NetworkConfigList, rt *RuntimeConf) error
AddNetwork (net *NetworkConfig, rt *RuntimeConf) (types.Result, error)
DelNetwork (net *NetworkConfig, rt *RuntimeConf) error
}
当infra容器创建后,kubelet就调用CNI接口为Infra创建网络,这个网络是由一些列的插件创建出来的,例如IPM、IPAM、Flannel。
Flannel网络模型
Flannel网络模型有三种,基于
- Vxlan
- host-gw
- UDP
基于UDP
UDP数据从node1发送到node2的时候:在主机上有一系列的规则,当容器ip的目的地址匹配的时候,只能匹配的flannel设备,数据包被转发到这个设备 -》再匹配路由表,匹配到子网-》子网名称对应的ip保存在etcd中,flannel设备查询etcd中子网对那个的ip,将数据转发到node2节点。数据发送的时候是将ip包以UDP的方式发送出去的。
基于Vxlan
Vxlan与UDP方式不同的是docker0网桥被替换程了cni网桥,容器的IP MAC信息被VxLan保存后,通过NAT,修改为Node的IP和MAC,从Node1传递到Node2.放到flannel,删除掉外层,变回内存ip和mac。寻址到最终目的ip和地址。
基于host-gw
host-gwhost-gw就是将子网保存的对那个ip换成节Node ip,将数据直接转发出去。
小结
k8s的网络方案非常多,深入学习需要了解很多网络基础知识,是学习网络的很好的入口点。
网友评论