Kubernetes网络相关详解

网络基础

一、二层网络和三层网络的区别

 
  二层网络 三层网络
定义
二层三层是按照逻辑拓扑结构进行的分类,并不是ISO七层模型中的数据链路层和网络层,而是指核心层、汇聚层和接入层。只有核心层和接入层,没有汇聚层的是二层网络。
核心层、汇聚层和接入层三层都部署的是三层网络。
用途 二层网络仅仅通过MAC寻址即可实现通讯,但仅仅是同一个冲突域内 三层网络需要通过IP路由实现跨网段的通讯,可以跨多个冲突域;
能力 二层网络的组网能力非常有限,一般只是小局域网 三层网络则可以组大型的网络
性质 二层网络基本上是一个安全域,也就是说在同一个二层网络内,终端的安全性从网络上讲基本上是一样的,除非有其它特殊的安全措施 三层网络则可以划分出相对独立的多个安全域。
    

 

 

 

二、网络通信-Vlan和VxLAN

1、VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理(交换机)的网络在逻辑上划分成多个广播域的通信技术,VLAN内的主机间可以直接通信,而VLAN网络外的主机需要通过三层网络设备转发才可以通信,因此一个vlan可以将服务器的广播报文限制在一个VLAN内,从而降低单个网络环境中的广播报文,vlan采用12位标识vlan ID,即一个交换机设备最多为2^12=4096个vlan。
 
2、VxLAN:VxLAN全称是Virtual eXtensible Local Area Network(虚拟扩展本地局域网),主要有Cisco推出,vxlan是一个 VLAN 的扩展协议,是由IETF定义的NVO3(Network Virtualization over Layer 3)标准技术之一,VXLAN的特点是将L2的以太帧封装到UDP报文(即L2 over L4)中,并在L3网络中传输,即使用MAC in UDP的方法对报文进行重新封装, VxLAN 本质上是一种overlay的隧道封装技术,它将L2的以太网帧封装成L4的UDP数据报,然后在L3的网络中传输,效果就像L2的以太网帧在一个广播域中传输一样,实际上L2的以太网帧跨越了L3网络传输,但是却不受L3网络的限制,vxlan采用24位标识vlan ID号,因此可以支持2^24=16777216个vlan,其可扩展性比vlan强大的多,可以支持大规模数据中心的网络需求。
VXLAN本质上在两台交换机之间构建了一条穿越基础IP网络的虚拟隧道,将IP基础网络虚拟成一个巨型“二层交换机”,即大二层网络,满足虚拟机大范围动态迁移的需求。

 

 

三、网络通信-Overlay网络:

1、overlay简介:

Overlay 叫叠加网络也叫覆盖网络,指的是在物理网络的基础之上叠加实现新的虚拟网络,即可使网络的中的容器可以相互通信  --即容器网络包容在物理机网络中。
优点是对物理网络的兼容性比较好,可以实现pod的夸宿主机子网通信
缺点是有额外的封装与解封性能开销。  
calico与flannel等网络插件都支持overlay网络

2、overlay设备简介

1)VTEP(VXLAN Tunnel Endpoint vxlan隧道端点),VTEP是VXLAN网络的边缘设备,是VXLAN隧道的起点和终点,VXLAN对用户原始数据帧的封装和解封装均在VTEP上进行,用于VXLAN报文的封装和解封装,VTEP与物理网络相连,VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道,服务器上的虚拟交换机(隧道flannel.1就是VTEP),比如一个虚拟机网络中的多个vxlan就需要多个VTEP对不同网络的报文进行封装与解封装。 
2)、VNI(VXLAN Network Identifier):VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信,一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。
3)、NVGRE:Network Virtualization using Generic Routing Encapsulation,主要支持者是Microsoft,与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE),NVGRE使用GRE头部的第24位作为租户网络标识符(
TNI),与VXLAN一样可以支持1777216个vlan。

3、overlay通信简介

1)VM A发送L2 帧与VM请求与VM B通信。
2)源宿主机VTEP添加或者封装VXLAN、UDP及IP头部报文。
3)网络层设备将封装后的报文通过标准的报文在三层网络进行转发到目标主机。
4)目标宿主机VTEP删除或者解封装VXLAN、UDP及IP头部。
5)将原始L2帧发送给目标VM。
 

四、网络通信-underlay网络

1、简介

1)Underlay网络就是传统IT基础设施网络,由交换机和路由器等设备组成,借助以太网协议、路由协议和VLAN协议等驱动,它还是Overlay网络的底层网络,为Overlay网络提供数据通信服务。容器网络中的Underlay网络是指借助驱动程序将宿主机的底层网络接口直接暴露给容器使用的一种网络构建技术,较为常见的解决方案有MAC VLAN、IP VLAN和直接路由等。

2)Underlay依赖于物理网络进行跨主机通信。

2、underlay实现模式简介

1)Mac Vlan模式
    MAC VLAN:支持在同一个以太网接口上虚拟出多个网络接口(子接口),每个虚拟接口都拥有唯一的MAC地址并可配置网卡子接口IP。
       a、Private(私有)模式:在Private模式下,同一个宿主机下的容器不能通信,即使通过交换机再把数据报文转发回来也不行。
  b、VEPA模式:虚拟以太端口汇聚器(Virtual Ethernet Port Aggregator,简称VEPA),在这种模式下,macvlan内的容器不能直接接收在同一个物理网卡的容器的请求数据包,但是可以经过交换机的(端口回流)再转发回来可以实现通信。
  c、passthru(直通)模式:Passthru模式下该macvlan只能创建一个容器,当运行一个容器后再创建其他容器则会报错。
  d、bridge模式:在bridge这种模式下,使用同一个宿主机网络的macvlan容器可以直接实现通信,推荐使用此模式。
2)IP VLAN模式
   IP VLAN类似于MAC VLAN,它同样创建新的虚拟网络接口并为每个接口分配唯一的IP地址,不同之处在于,每个虚拟接口将共享使用物理接口的MAC地址。

3、Underlay架构图

 

 

五、网络通信-总结:

Overlay:基于VXLAN、NVGRE等封装技术实现overlay叠加网络。 
Underlay(Macvlan):基于宿主机物理网卡虚拟出多个网络接口(子接口),每个虚拟接口都拥有唯一的MAC地址并可配置网卡子接口IP

 

kubernetes 网络

一、kubernetes 网络通信模式

1、Overlay网络

1)Flannel Vxlan、Calico IPIP、Calico Vxlan
2)将pod 地址信息封装在宿主机地址信息以内,实现跨主机且可跨node子网的通信报文。

2、直接路由

1)Flannel Host-gw、Flannel VXLAN Directrouting、Calico Directrouting
2)基于主机路由,实现报文从源主机到目的主机的直接转发,不需要进行报文的叠加封装,性能比overlay更好。

3、Underlay

需要为pod启用单独的虚拟机网络,而是直接使用宿主机物理网络,pod甚至可以在k8s环境之外的节点直接访问(与node节点的网络被打通),相当于把pod当桥接模式的虚拟机使用,比较方便k8s环境以外的服务访问k8s环境中的pod中的服务,而且由于主机使用的宿主机网络,其性能最好。
 

二、网络组件flannel介绍及通信流程分析

1、通信需求

1)pod中不同container的通信

  sidcar模式的多容器pod
  lnmp模式的多容器环境

2)pod与pod中间的通信 

a、 pod与pod在同一个node
b、pod与pod不带同一个node
c、node与node在同一个物理子网(vlan)
d、node与node不在同一个物理子网(vxlan)

3)pod与外部服务的通信  

a、pod中的服务主动调用node网络之外的存储、中间件等
b、pod中的服务主动调用银联、支付宝、微信等第三方API接口

4)客户端与pod的通信 

a、来自于客户端浏览器的请求
b、来自于客户端APP的请求
 

2、flannel 简介

1)官网

https://coreos.com/flannel/docs/latest/

2)文档

https://coreos.com/flannel/docs/latest/kubernetes.html

3)简介

由CoreOS开源的针对k8s的网络服务,其目的为解决kubernetes集群中各主机上的pod相互通信的问题,其借助于etcd维护网络IP地址分配,并为每一个node服务器分配一个不同的IP地址段。
 

3、flannel网络模式

Flannel 网络模型 (后端模型),Flannel目前有三种方式实现 UDP/VXLAN/host-gw:
UDP:早期版本的Flannel使用UDP封装完成报文的跨越主机转发,其安全性及性能略有不足。
VXLAN:Linux 内核在在2012年底的v3.7.0之后加入了VXLAN协议支持,因此新版本的Flannel也有UDP转换为VXLAN,VXLAN本质上是一种
tunnel(隧道)协议,用来基于3层网络实现虚拟的2层网络,目前flannel 的网络模型已经是基于VXLAN的叠加(覆盖)网络,目前推荐使用vxlan作为其网络模型。
Host-gw:也就是Host GateWay,通过在node节点上创建到达各目标容器地址的路由表而完成报文的转发,因此这种方式要求各node节点本身必须处于同一个局域网(二层网络)中,因此不适用于网络变动频繁或比较大型的网络环境,但是其性能较好。
wireguard:flannel v0.20.0开始支持、可在实现跨网络通信的同时还能对报文进行加密,5.6及以下版本内核需要单独安装wireguard,如sudo apt install wireguard。 https://www.wireguard.com/ 

1)Flannel 组件的解释

a、Cni0:网桥设备,每创建一个pod都会创建一对 veth pair,其中一端是pod中的eth0,另一端是Cni0网桥中的端口(网卡),Pod中从网卡eth0发出的流量都会发送到Cni0网桥设备的端口(网卡)上,Cni0 设备获得的ip地址是该节点分配到的网段的第一个地址。
b、Flannel.1: overlay网络的设备,用来进行vxlan报文的处理(封包和解包),不同node之间的pod数据流量都从overlay设备以隧道的形式发送到对端。
 

4、Flannel vxlan架构图

 

5、flannel通信流程-1.pod->2.cni->3.eth0

1)源pod发起请求,此时报文中源IP为pod的eth0 的ip,源mac 为pod的eth0的mac,目的Pod为目的Pod的IP,目的mac为网关(cni0)的MAC 
2)数据报文通过veth peer发送给网关cni0,检查目的mac就是发给自己的,cni0进行目标IP检查,如果是同一个网桥的报文就直接转发,不是的话就发送给flannel.1, 此时报文被修改如下:
  源IP: Pod IP,10.100.0.2
  目的IP: Pod IP,10.100.1.2
  源MAC: 源Pod MAC
  目的MAC:cni MAC 
3)到达flannel.1,检查目的mac就是发给自己的,开始匹配路由表,先实现overlay报文的内层封装(主要是修改目的Pod的对端flannel.1的 MAC、源MAC为当前宿主机flannel.1的MAC)
4)源宿主机基于UDP封装Vxlan报
VXLAN ID:1
UDP 源端口: 随机
UDP 目的端口: 8472
源IP #源Pod所在宿主机的物理网卡IP#
目的IP #目的Pod所在宿主机的物理网卡IP
源MAC: 00:0c:29:bc:fe:d8 #源Pod所在宿主机的物理网卡
目的MAC: 00:0c:29:56:e7:1b #目的Pod所在宿主机的物理网卡 
5)报文到达目的宿主机物理网卡,接开始解封装报文
外层目的IP为本机物理网卡,解开后发现里面还有一层目的IP和目的MAC,发现目的IP为10.100.1.2,目的MAC为de:34:a2:06:d3:56(目的flannel.1的MAC),然后将报文发送给flannel.1
6)报文到达目的宿主机flannel.1
flannel.1检查报文的目的IP,发现是去往本机cni0的子网,将请求报文转发至cni0 
7)报文到达目的宿主机cni0
cni0基于目的IP检查mac地址表,修改目的MAC为目的MAC后将来请求转给pod
8)报文到达目的宿主机pod
cni0收到报文返现去往10.100.1.2,检查MAC地址表发现是本地接口,然后通过网桥接口发给pod
目的IP: 目的pod IP 10.100.1.2
源IP:源Pod IP 10.200.0.2
目的MAC: 目的pod MAC,f2:50:98:b4:ea:01
源MAC: cni0的MAC,b2:12:0d:e4:eb:46

三、网络组件calico介绍及通信流程分析

1、calico 示意图

 

2、calico通信流程-pod产生请求报文到达宿主机虚拟网卡

1)源pod发起请求, 报文到达宿主机与pod对应的网卡

2)报文到达在宿主机与pod对应的网卡:cali2b2e7c9e43e
此时报文中源IP为pod的eth0 的ip,源mac 为pod的eth0的mac,目的IP为10.200.151.205,下一跳为网关地址172.31.7.1 ,目的mac为ee:ee:ee:ee:ee:ee(默认网关172.31.7.1的MAC地址),源端口随机产生、目的端口80

3、calico通信流程-报文到达源宿主机tun0

1)报文到达源宿主机tun0

此时报文的源IP为源pod IP,目的IP为目的pod IP。没有MAC 地址。

4、calico通信流程-报文到达源宿主机eth0

1)报文到达源宿主机eth0

此时报文为IPinIP格式,外层为源宿主机和目的宿主机的源MAC目的MAC、源IP及目的IP,内部为源pod IP及目的pod的IP,没有使用pod的MAC地址。

5、calico通信流程-报文到达目的宿主机eth0

1)报文到达目的宿主机eth0

此时收到的是源宿主机的IPinIP报文,外层为源宿主机和目的宿主机的源MAC目的MAC、源IP及目的IP,内部为源pod IP及目的pod的IP,没有使用MAC地址,解封装后发现是去往10.200.151.205

6、calico通信流程-报文到达目的宿主机tunl0

1)报文到达目的宿主机tunl0

报文到达目的宿主机tunl0,此时源IP为源pod IP,目的IP为目的pod的IP,没有MAC地址。

7、calico通信流程-报文到达源宿主机虚拟网卡

1)报文到达目的Pod与目的宿主机对应的网卡cali32ecf57bfbe 

报文到达目的宿主机cali32ecf57bfbe 网卡。此时源IP为源Pod IP,源MCA为tunl0 MAC,目的IP为目的Pod IP,目的MAC为目的PodMAC,随后报文被转发被目的MAC(目的Pod) 。

8、calico通信流程-报文到达目的Pod

1)报文到达目的Pod

报文到达目的pod,目的pod接受请求并构建响应报文并原路返回给源pod。

 

 
 
posted @ 2023-03-12 20:47  耿筱诺  阅读(74)  评论(0编辑  收藏  举报