k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel,calico等。 CNI插件存放位置:# cat /etc/cni/net.d/10-flannel.conflist
插件使用的解决方案如下: 虚拟网桥,虚拟网卡,多个容器共用一个虚拟网卡进行通信。 多路复用:MacVLAN,多个容器共用一个物理网卡进行通信。 硬件交换:SR-LOV,一个物理网卡可以虚拟出多个接口,这个性能最好
容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现;
pod之间的通信: 同一节点的pod之间通过cni网桥转发数据包。 不同节点的pod之间的通信需要网络插件支持。
pod和service通信: 通过iptables或ipvs实现通信,ipvs取代不了iptables,因为ipvs只能做 负载均衡,而做不了nat转换
pod和外网通信:iptables的MASQUERADE。
Service与集群外部客户端的通信;(ingress、nodeport、loadbalancer)
flannel网络
flannel网络原理
当容器发送IP包,通过veth pair 发往cni网桥,再路由到本机的flannel.1设备进行处理。 • VTEP设备之间通过二层数据帧进行通信,源VTEP设备收到原始IP包后,在上面加 上一个目的MAC地址,封装成一个内部数据帧,发送给目的VTEP设备。 • 内部数据桢,并不能在宿主机的二层网络传输,Linux内核还需要把它进一步封装成 为宿主机的一个普通的数据帧,承载着内部数据帧通过宿主机的eth0进行传输。 • Linux会在内部数据帧前面,加上一个VXLAN头,VXLAN头里有一个重要的标志叫 VNI,它是VTEP识别某个数据桢是不是应该归自己处理的重要标识。 • flannel.1设备只知道另一端flannel.1设备的MAC地址,却不知道对应的宿主机地址是 什么。在linux内核里面,网络设备进行转发的依据,来自FDB的转发数据库,这个 flannel.1网桥对应的FDB信息,是由flanneld进程维护的。 • linux内核在IP包前面再加上二层数据帧头,把目标节点的MAC地址填进去,MAC地 址从宿主机的ARP表获取。 • 此时flannel.1设备就可以把这个数据帧从eth0发出去,再经过宿主机网络来到目标节 点的eth0设备。目标主机内核网络栈会发现这个数据帧有VXLAN Header,并且VNI 为1,Linux内核会对它进行拆包,拿到内部数据帧,根据VNI的值,交给本机 flannel.1设备处理,flannel.1拆包,根据路由表发往cni网桥,最后到达目标容器。
k8s网络通信
配置flannel
flannel支持多种后端:
• Vxlan • vxlan //报文封装,默认
• Directrouting //直接路由,跨网段使用vxlan,同网段使用host-gw模式。
• host-gw: //主机网关,性能好,但只能在二层网络中,不支持跨网络, 如果有成千上万的Pod,容易产生广播风暴,不推荐
• UDP: //性能差,不推荐
重启生效
每个节点都有此路由表,本机走cni0。
calico网络插件
官网:https://docs.projectcalico.org/getting-started/kubernetes/selfmanaged-onprem/onpremises
calico简介:
• flannel实现的是网络通信,calico的特性是在pod之间的隔离。
• 通过BGP路由,但大规模端点的拓扑计算和收敛往往需要一定的时间和 计算资源。
• 纯三层的转发,中间没有任何的NAT和overlay,转发效率最好。
• Calico 仅依赖三层路由可达。Calico 较少的依赖性使它能适配所有 VM、 Container、白盒或者混合环境场景。
每个节点都删除
安装calico:
mkdir colico,cd colico
wget https://docs.projectcalico.org/manifests/calico.yaml
vim calico.yml
多余的删掉,只留一个svc,两个由控制器负责的pod
网络策略
NetworkPolicy策略模型:控制某个namespace下的pod的网络出入站规则
网络策略通过网络插件 来实现。要使用网络策略,你必须使用支持 NetworkPolicy 的网络解决方案。 创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的。
默认拒绝所有入站流量
可以通过创建选择所有容器但不允许任何进入这些容器的入站流量的 NetworkPolicy 来为名字空间创建 “default” 隔离策略。
vim police1.yaml
有了这个策略,任何额外的策略都不会导致到这些 Pod 的任何入站连接被拒绝。 此策略对任何 Pod 的出口隔离没有影响
此时在test ns下创建的pod可以访问myapp标签的pod,因为test ns添加了yaml文件中指定的标签