Docker网络模型
-
Bridge网络,自由网络名称空间
-
Joined网络,共享使用另外一个容器的网络名称空间
-
Open网络,容器直接共享使用宿主机的网络名称空间
-
None网络(Close),不使用任何网络名称空间
Kubernetes网络通信
-
容器间通信:同一个pod内的多个容器间的通信,lo接口;
-
Pod间通信:Pod IP <—> Pod IP;(所见即所得,无NAT)
-
Pod与service之间的通信;Pod IP <—> Cluster IP;根据IPtables和IPVS规则来实现;
(注:通过命令
kubectl get configmap kube-proxy -o yaml -n kube-system
查看kube-proxy中mode是IPVS,还是iptables;) -
Service与集群外部服务端或者客户端通信;(Ingress,Nodeport,Loadbalancer亦可)
Kubernetes本身不提供网络方案,需要通过各种CNI(Container Network Interface)来配套实现;
CNI种类
Flannel,可以提供网络管理和网络地址分配等功能;
优点:简单;缺点:无法提供网络策略,即NetworkPolicy
Calico,缺点:部署使用复杂;优点:支持IP地址分配和网络策略;其中地址转发,基于BGP的方式实现二层网络转发和三层网络路由,具备自学习功能,且性能更强;
Canel:Flannel+Calico;
Kube-router
……
解决方案:
虚拟网桥(Bridge)——通过软件实现虚拟网络,虚拟网卡,接入虚拟网桥,保证每一个容器,每一个Pod都有一个专有的网络接口,虚拟网卡成对出现,一个留在Pod之上,一个留在宿主机之上,接入到虚拟网桥使用。(Overlay)适用:L2或者L3层逻辑网络;优点:强大的控制能力;缺点:网络传输的性能开销较大,需要多封装IP或者Mac守护,走隧道网络;如VxLAN;
多路复用:MacVLAN,基于物理网卡MAC地址的方式创建Vlan,为每个虚拟接口配置一个独有的mac地址,使得一个物理网卡能为多个容器提供跨节点的网络通信服务;
硬件交换:SR-IOV,single router-IO virtualization,一个物理网卡硬件直接虚拟多个接口,供容器使用;优点:高性能;
Kubelet, 直接加载网络插件配置文件路径:/etc/cni/net/.d的即可;
网络插件类型:None,meta,IPam;
Flannel
Flannel默认采用VxLAN的方式,支持多种后端网络传输机制:
-
VxLAN,①原生VxLAN;②Directrouting,若两者处于同一网络则为Host-GW,否则降级为VxLAN方式;
-
Host-GW,Host-Gateway,效果更好,开销少,但是要求各个节点必须处在同一个二层网络当中,可能会遭受网络风暴;
-
UDP,效果最差,优选上面两种;(早期Linux系统不支持VxLAN时使用较多)
任何部署Kubelet的节点,都应该部署Flannel。
Flannel的部署:部署为系统级守护进程DaemonSet,或者部署为Pod(共享节点的网络名称空间)
Flannel的配置参数:
(1) Network:Flannel使用的CIDR格式的网络地址,用于为Pod配置网络功能;
举例:10.244.0.0/16网段;
-
master: 10.244.0.0/24
-
node01: 10.244.1.0/24
-
…
-
node255: 10.244.255.0/24
(2) SubnetLen:把Network切分子网供各节点使用,默认使用24位掩码进行切分;
(3) SubnetMin和SubnetMax;
(4) Backend:即后端网络类型,VxLAN、Host-GW、UDP等;