网络模型与网络策略

VXLAN

vxlan是属于overlay中的一种隧道封装技术,实际上将L2(数据链路层)的以太网帧封装成L4(传输层)的UDP数据报文,然后在L3网络层传输,最终实现的效果就类似于在L2的以太网传输报文一样,但是不受L3网络层限制

为什么是在L3传输?
因为传输是基于路由表,路由只涉及ip,不涉及端口

vxlan标志位有24位,可以划分2^24个虚拟局域网

1. 感觉封装UDP是多余的,只靠IP也能通信
因为Vxlan的封装思维是将原始数据报文当做用户数据包,VTEP当做大二层接入,那么VTEP会依次进行传输层封装,网络层封装,以太网头部封装,如果直接进行IP封装则跳过了传输层的封装过程,会在传输的过程中遇到一些困难,很多数据中心里都会有大量的冗余链路,交换机面对多条等价路径时会进行基于五元组进行HASH,此时会出现问题;其次,在遇到NAT设备时,无法穿透也会造成影响

2. 为什么封装成UDP,而不是TCP
因为封装UDP开销比较小,至于TCP比UDP更可靠,但是依靠原始数据报文的TCP也可以实现可靠性的要求

网络模型

docker的网络模型

  • Bridge:桥接
  • Host:主机
  • Container:容器

kubernetes网络模型

kubernetes的网络模型主要用于解决四类通信需求

Pod内通信

命名空间:linux底层概念,在内核层实现,容器使用namespce技术实现容器间相互隔离

  • mnt namespace:隔离根,即chroot技术
  • ipc namespace:隔离进程间通信
  • uts namespace:隔离系统信息,主机名等信息
  • pid namespace:隔离进程号
  • net namespace:隔离网络
  • user namespce:隔离用户

运行在同一个pod内的容器,共享net、ipc、uts、一组存储卷,亲密关系,同进同退

Pod间通信 ★★★

网络模型:所有Pod在一个平面网络中,每个Pod拥有一个集群全局唯一的地址,可直接与其他Pod通信

k8s设计了网络模型,但将其实现交给网络插件,主流的网络插件有:flannel、calico、kube-router 等

flannel

早期版本的Flannel使用UDP封装完成报文的跨越主机转发,其安全性及性能略有不足,现在已经废弃这种方式了,现在只能通过 vxlan 或 host-gw 进行通信

  • flannel VXLAN后端:

  • flannel VXLAN Direct Routing后端:

    Directrouting 为在同一个二层网络中的node节点启用直接路由机制,类似于host-gw模式

  • host-gw后端:

    类似 calico,通过路由表完成报文转发

calico

Calico本身是一个三层的虚拟网络方案,它将每个节点都当作路由器(router),将每个节点的容器都当作是“节点路由器”的一个终端并为其分配一个IP地址,各节点路由器通过BGP(BorderGateway Protocol)学习生成路由规则,从而将不同节点上的容器连接起来

BGP是互联网上一个核心的去中心化自治路由协议,性能非常高,需要物理路由器的支持,这也是公有云不提供calico的原因,因为公有云上节点连接的都是虚拟路由器

calico 核心组件:

  • Felix:calico的agent,维护路由规则、汇报当前节点状态
  • Etcd:路由规则储存在etcd
  • BGP Client:运行在每个node上,负责监听由felix生成的路由信息,然后通过BGP协议广播至其他node节点,其他node的Felix会自动更新路由规则,从而实现路由的相互学习
  • Route Reflector:集中式的路由反射器,维护全网的路由规则,替换路由广播,如果节点非常多,可以考虑使用

BGP模式下calico的通信过程:

# traceroute命令查看请求ip为10.10.74.193的pod
/ $ traceroute 10.10.74.193
traceroute to 10.10.74.193 (10.10.74.193), 30 hops max, 46 byte packets
 1  10.0.1.32 (10.0.1.32)  0.005 ms  0.006 ms  0.002 ms		# 当前pod所在节点的ip
 2  10.0.1.33 (10.0.1.33)  1.220 ms  0.254 ms  0.147 ms		# 对方pod所在节点的ip
 3  10.10.74.193 (10.10.74.193)  0.207 ms  0.308 ms  0.163 ms	# 对方pod的ip

如果node需要跨网段通信,Calico也提供了IPIP模式,IPIP模式下,calico会在每个节点上创建一个tunl0接口(TUN类型虚拟设备)用于封装三层隧道报文。节点上每创建一个Pod资源,都自动创建一对虚拟以太网接口(TAP类型的虚拟设备),其中一个附加于Pod的网络名称空间,另一个(名称以cali为前缀后跟随机字串)留置在节点的根网络名称空间,并经由tunl0封装或解封三层隧道报文,Calico IPIP 模式如下图:

IPIP模式下calico的通信过程:

/ $ traceroute 10.10.58.65		# 请求ip为10.10.58.65的pod
traceroute to 10.10.58.65 (10.10.58.65), 30 hops max, 46 byte packets
 1  172.31.6.210 (172.31.6.210)  0.004 ms  0.004 ms  0.002 ms	# 当前pod所在node地址
 2  10.10.58.64 (10.10.58.64)  0.003 ms  0.432 ms  0.497 ms	# 对方pod所在node的tunl0地址
 3  10.10.58.65 (10.10.58.65)  0.553 ms  2.114 ms  0.775 ms	# 对方pod地址

BGP模式则直接使用物理机作为虚拟路由路(vRouter),请求直接通过路由跳转,不再创建额外的tunnel,没有tunnel封装、解封的步骤,所以BGP的性能会比IPIP高很多,建议禁用IPIP

Service与Pod通信

集群外部与Service通信

请求流量首先到达外部负载均衡器,由其调度至某个工作节点之上,而后再由工作节点的netfilter(kube-proxy)组件上的规则(iptables或ipvs)调度至某个目标Pod对象

集群外的流量先进入节点网络,再进入service网络,最后进入pod网络

网络策略

网络策略(Network Policy)是用于控制分组的Pod资源彼此之间如何进行通信,以及分组的Pod资源如何与其他网络端点进行通信的规范。它用于为Kubernetes实现更为精细的流量控制,实现租户隔离机制。Kubernetes使用标准的资源对象“NetworkPolicy”供管理员按需定义网络访问控制策略

Kubernetes的网络策略功能由其所使用的网络插件实现,Calico、Canal及kube-router支持网络策略,而flannel不支持