容器间通信方法及装置转让专利

申请号 : CN201510875613.4

文献号 : CN105491123B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 胡春明肖远昊杜乐乐师斌

申请人 : 北京航空航天大学

摘要 :

本发明提供一种容器间通信方法及装置,其中方法包括:创建全局哈希表,将哈希表的所有表头指针初始化为NULL值;启动VETH网络设备,在每个容器与虚拟网桥中创建成对的虚拟网卡,并为每个容器的虚拟网卡分配IP地址以及指针,为虚拟网桥的虚拟网卡分配指针;将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中;根据所述全局哈希表中的IP地址以及指针,进行容器间的通信。本发明提供的容器间通信方法及装置,能够动态构建容器间的虚拟点对点通信链路,提升同一宿主机的容器间的通信效率,降低容器间的通信延迟,并且提高了容器间的网络带宽,还能够有效避免网卡资源浪费。

权利要求 :

1.一种容器间通信方法,其特征在于,包括:创建全局哈希表,将哈希表的所有表头指针初始化为NULL值;

启动VETH网络设备,在每个容器与虚拟网桥中创建成对的虚拟网卡,并为每个容器的虚拟网卡分配IP地址以及指针,为虚拟网桥的虚拟网卡分配指针;将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中;

获取发送方虚拟网卡欲发送的报文中的目的IP地址;

根据所述目的IP地址,在所述全局哈希表中查找对应的指针;

若找到对应的指针,则判断所述指针对应的接收方虚拟网卡的合法性;

若合法,则将所述报文插入到所述接收方虚拟网卡的接收队列;

在所述报文插入成功后,更新所述发送方虚拟网卡的报文发送数量。

2.根据权利要求1所述的方法,其特征在于,还包括:若所述指针对应的接收方虚拟网卡的合法性为不合法,则清除所述报文的缓存;

更新所述发送方虚拟网卡的报文丢失数量。

3.根据权利要求1所述的方法,其特征在于,还包括:若所述报文插入失败,则更新所述发送方虚拟网卡的报文丢失数量。

4.根据权利要求1所述的方法,其特征在于,在所述根据所述目的IP地址,在所述全局哈希表中查找相应的指针之后,还包括:若在所述全局哈希表中没有找到与所述目的IP地址对应的指针,则从所述发送方虚拟网卡的私有数据空间中获取对等端虚拟网卡的指针;

根据所述对等端虚拟网卡的指针,判断所述对等端虚拟网卡的合法性;

若合法,则将所述报文插入到所述对等端虚拟网卡的接收队列;

更新所述发送方虚拟网卡的报文发送数量。

5.根据权利要求1-4任一项所述的方法,其特征在于,所述将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中,具体包括:在每一虚拟网卡创建完成后,判断所述虚拟网卡是否具有IP地址;

若具有IP地址,则将所述虚拟网卡的IP地址和指针对应存储在所述全局哈希表中。

6.根据权利要求5所述的方法,其特征在于,在所述根据所述全局哈希表中的IP地址以及指针,进行容器间的通信之后,还包括:当虚拟网卡关闭后,判断所述虚拟网卡是否具有IP地址;

若具有IP地址,则将所述虚拟网卡的IP地址和指针从所述全局哈希表中删除。

7.一种容器间通信装置,其特征在于,包括:创建模块,用于创建全局哈希表,将哈希表的所有表头指针初始化为NULL值;

启动模块,用于启动VETH网络设备,在每个容器与虚拟网桥中创建成对的虚拟网卡,并为每个容器的虚拟网卡分配IP地址以及指针,为虚拟网桥的虚拟网卡分配指针;

添加模块,用于将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中;

通信模块,用于根据所述全局哈希表中的IP地址以及指针,进行容器间的通信;

所述通信模块具体用于:

获取发送方虚拟网卡欲发送的报文中的目的IP地址;

根据所述目的IP地址,在所述全局哈希表中查找对应的指针;

若找到对应的指针,则判断所述指针对应的接收方虚拟网卡的合法性;

若合法,则将所述报文插入到所述接收方虚拟网卡的接收队列;

在所述报文插入成功后,更新所述发送方虚拟网卡的报文发送数量。

8.根据权利要求7所述的装置,其特征在于,所添加模块具体用于:在每一虚拟网卡创建完成后,判断所述虚拟网卡是否具有IP地址;

若具有IP地址,则将所述虚拟网卡的IP地址和指针对应存储在所述全局哈希表中。

说明书 :

容器间通信方法及装置

技术领域

[0001] 本发明涉及计算机技术,尤其涉及一种容器间通信方法及装置。

背景技术

[0002] 虚拟化技术分为硬件虚拟化和软件虚拟化:硬件虚拟化主要是指通过模拟硬件的方式获得一个类似于真实计算机的环境,在这个环境中可以运行一个完整的操作系统;软件虚拟化,又称轻量级虚拟化,主要是指在同一个操作系统实例的基础上提供多个隔离的虚拟运行环境,因此也常常被称为容器技术。利用容器技术,可以进行应用或者服务的封装,例如封装编辑器、封装脚本语言、封装Apache服务、数据库服务等,并且可以将封装后的容器看成一个个独立的组件,进行任意的组装,实现一个整体的应用或服务。
[0003] 在容器组装成一个更大应用或服务的过程中,容器之间的通信是不可或缺的一部分。在Linux中,VETH(Virtual Ethernet,虚拟以太网)网络设备是一种用于连接不同命令空间的网络设备,VETH网络设备能够创建成对的虚拟网卡,利用VETH网络设备创建的虚拟网卡,容器之间可以进行相互通信。
[0004] 现有技术一中,容器间可以通过虚拟网桥的虚拟网卡进行通信,具体地,可以在宿主机上创建一个虚拟网桥dockerO,当容器启动时,VETH网络设备可以在容器和虚拟网桥中创建成对的虚拟网卡。图1为现有技术一中容器的虚拟网卡与虚拟网桥的通信示意图。如图1所示,VETH设备创建一对虚拟网卡中,其中一个位于容器中,且命名为ethO,另一个位于虚拟网桥dockerO中,且命名为vethk(k=1,2,……,n),这样,容器和虚拟网桥之间就建立了直接通信,各个容器之间可以通过虚拟网桥进行数据传输。现有技术二中,两个容器之间可以通过点对点通信链路进行数据传输,具体地,VETH网络设备可以在需要进行通信的两个容器中创建成对的虚拟网卡,实现两个容器的直接通信。图2为现有技术二中各容器间的通信示意图。如图2所示,容器1中可以设置有多个虚拟网卡,每个虚拟网卡与不同容器的虚拟网卡绑定,实现容器1与多个容器之间的直接通信。
[0005] 现有技术一的不足之处在于,由于各容器之间只能通过虚拟网桥来进行通信,因此通信时延较高,网络带宽较低;现有技术二的不足之处在于,每个容器中需要创建多个虚拟网卡,过程复杂,且容易造成网卡资源浪费。

发明内容

[0006] 本发明提供一种容器间通信方法及装置,用以解决现有技术中各容器间通信时延较高,网络带宽较低的技术问题。
[0007] 本发明提供一种容器间通信方法,包括:
[0008] 创建全局哈希表,将哈希表的所有表头指针初始化为NULL值;
[0009] 启动VETH网络设备,在每个容器与虚拟网桥中创建成对的虚拟网卡,并为每个容器的虚拟网卡分配IP地址以及指针,为虚拟网桥的虚拟网卡分配指针;将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中;
[0010] 根据所述全局哈希表中的IP地址以及指针,进行容器间的通信。
[0011] 进一步地,所述根据所述全局哈希表中的IP地址以及指针,进行容器间的通信,具体包括:
[0012] 获取发送方虚拟网卡欲发送的报文中的目的IP地址;
[0013] 根据所述目的IP地址,在所述全局哈希表中查找对应的指针;
[0014] 若找到对应的指针,则判断所述指针对应的接收方虚拟网卡的合法性;
[0015] 若合法,则将所述报文插入到所述接收方虚拟网卡的接收队列;
[0016] 在所述报文插入成功后,更新所述发送方虚拟网卡的报文发送数量。
[0017] 进一步地,所述方法还包括:
[0018] 若所述指针对应的接收方虚拟网卡的合法性为不合法,则清除所述报文的缓存;
[0019] 更新所述发送方虚拟网卡的报文丢失数量。
[0020] 进一步地,所述方法还包括:
[0021] 若所述报文插入失败,则更新所述发送方虚拟网卡的报文丢失数量。
[0022] 进一步地,在所述根据所述目的IP地址,在所述全局哈希表中查找相应的指针之后,还包括:
[0023] 若在所述全局哈希表中没有找到与所述目的IP地址对应的指针,则从所述发送方虚拟网卡的私有数据空间中获取对等端虚拟网卡的指针;
[0024] 根据所述对等端虚拟网卡的指针,判断所述对等端虚拟网卡的合法性;
[0025] 若合法,则将所述报文插入到所述对等端虚拟网卡的接收队列;
[0026] 更新所述发送方虚拟网卡的报文发送数量。
[0027] 进一步地,所述将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中,具体包括:
[0028] 在每一虚拟网卡创建完成后,判断所述虚拟网卡是否具有IP地址;
[0029] 若具有IP地址,则将所述虚拟网卡的IP地址和指针对应存储在所述全局哈希表中。
[0030] 进一步地,在所述根据所述全局哈希表中的IP地址以及指针,进行容器间的通信之后,还包括:
[0031] 当虚拟网卡关闭后,判断所述虚拟网卡是否具有IP地址;
[0032] 若具有IP地址,则将所述虚拟网卡的IP地址和指针从所述全局哈希表中删除。
[0033] 本发明还提供一种容器间通信装置,包括:
[0034] 创建模块,用于创建全局哈希表,将哈希表的所有表头指针初始化为NULL值;
[0035] 启动模块,用于启动VETH网络设备,在每个容器与虚拟网桥中创建成对的虚拟网卡,并为每个容器的虚拟网卡分配IP地址以及指针,为虚拟网桥的虚拟网卡分配指针;
[0036] 添加模块,用于将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中;
[0037] 通信模块,用于根据所述全局哈希表中的IP地址以及指针,进行容器间的通信。
[0038] 进一步地,所述通信模块具体用于:
[0039] 获取发送方虚拟网卡欲发送的报文中的目的IP地址;
[0040] 根据所述目的IP地址,在所述全局哈希表中查找对应的指针;
[0041] 若找到对应的指针,则判断所述指针对应的接收方虚拟网卡的合法性;
[0042] 若合法,则将所述报文插入到所述接收方虚拟网卡的接收队列;
[0043] 在所述报文插入成功后,更新所述发送方虚拟网卡的报文发送数量。
[0044] 进一步地,所添加模块具体用于:
[0045] 在每一虚拟网卡创建完成后,判断所述虚拟网卡是否具有IP地址;
[0046] 若具有IP地址,则将所述虚拟网卡的IP地址和指针对应存储在所述全局哈希表中。
[0047] 本发明提供的容器间通信方法及装置,通过创建全局哈希表,将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中,并根据所述全局哈希表中的IP地址以及指针,进行容器间的通信,能够动态构建容器间的虚拟点对点通信链路,提升同一宿主机的容器间的通信效率,降低容器间的通信延迟,并且提高了容器间的网络带宽,还能够有效避免网卡资源浪费。

附图说明

[0048] 图1为现有技术一中容器的虚拟网卡与虚拟网桥的通信示意图;
[0049] 图2为现有技术二中各容器间的通信示意图;
[0050] 图3为本发明实施例一提供的容器间通信方法的流程图;
[0051] 图4为本发明实施例一提供的容器间通信方法中容器和虚拟网桥的虚拟网卡的结构示意图;
[0052] 图5为本发明实施例一提供的容器间通信方法中步骤103的具体流程图;
[0053] 图6为本发明实施例二提供的容器间通信装置的结构示意图。

具体实施方式

[0054] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0055] 实施例一
[0056] 本发明实施例一提供一种容器间通信方法。图3为本发明实施例一提供的容器间通信方法的流程图。如图3所示,本实施例中的容器间通信方法,可以包括:
[0057] 步骤101、创建全局哈希表,将哈希表的所有表头指针初始化为NULL值。
[0058] 具体地,本实施例中的方法,可以由VETH内核来执行,VETH内核启动时,可以创建全局哈希表,并将所述哈希表的所有表头指针初始化为NULL值。
[0059] 步骤102、启动VETH网络设备,在每个容器与虚拟网桥中创建成对的虚拟网卡,并为每个容器的虚拟网卡分配IP地址以及指针,为虚拟网桥的虚拟网卡分配指针;将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中。
[0060] 当VETH网络设备启动后,可以按照实际需要为容器和虚拟网桥dockerO创建虚拟网卡。本实施例中,VETH网络设备可以在每个容器与虚拟网桥中创建成对的虚拟网卡,所述成对的虚拟网卡中,其中一个在容器中,另一个在虚拟网桥中,成对的网卡之间可以直接进行数据传输。图4为本发明实施例一提供的容器间通信方法中容器和虚拟网桥的虚拟网卡的结构示意图。如图4所示,每个容器可以通过虚拟网卡直接与虚拟网桥进行通信。
[0061] VETH网络设备在创建虚拟网卡后,可以为每个虚拟网卡分配指针,若虚拟网卡在容器中,还可以为该虚拟网卡分配IP地址。
[0062] 在每一虚拟网卡创建完成后,可以判断所述虚拟网卡是否具有IP地址:若该虚拟网卡具有IP地址,则将该虚拟网卡的IP地址和指针对应存储在所述全局哈希表中;若该虚拟网卡不具有IP地址,则不对该虚拟网卡进行任何操作。这样,全局哈希表中存储的全部是容器的虚拟网卡的指针,而不涉及到虚拟网桥的虚拟网卡的指针。
[0063] 在将虚拟网卡的IP地址和指针对应存储在全局哈希表中时,可以将所述虚拟网卡的IP地址作为key值,将对应的指针作为value值,value=h(key),其中,h(x)为哈希函数,哈希函数的具体形式可以根据实际需要来确定。
[0064] 步骤103、根据所述全局哈希表中的IP地址以及指针,进行容器间的通信。
[0065] 图5为本发明实施例一提供的容器间通信方法中步骤103的具体流程图。如图5所示,步骤103可以包括:
[0066] 步骤1031、获取发送方虚拟网卡欲发送的报文中的目的IP地址。
[0067] 本实施例中,在容器间进行报文传输之前,可以先从报文缓存中获取目的IP地址。
[0068] 步骤1032、根据所述目的IP地址,在所述全局哈希表中查找对应的指针。
[0069] 具体地,可以将目的IP地址作为key值,在全局哈希表中查找h(key)对应的value值,即为所述目的IP地址对应的指针。
[0070] 步骤1033、若找到对应的指针,则判断所述指针对应的接收方虚拟网卡的合法性。
[0071] 若找到对应的指针,说明报文是发给同一宿主机上的其它容器的,所述指针对应的虚拟网卡即为报文的接收方网卡。若在全局哈希表中没有找到与所述目的IP地址对应的指针,说明报文是发给其它宿主机上的容器的,此时,可以从所述发送方虚拟网卡的私有数据空间中获取对等端虚拟网卡的指针,并以所述对等端虚拟网卡作为所述接收方虚拟网卡。
[0072] 本步骤中,判断接收方虚拟网卡的合法性,是指:通过内核合法性校验函数验证虚拟网卡指针的正确性。其具体验证方式属于现有技术,本实施例中不再赘述。
[0073] 若所述指针对应的接收方虚拟网卡不合法,则清除所述报文的缓存,并更新所述发送方虚拟网卡的报文丢失数量。
[0074] 步骤1034、若合法,则将所述报文插入到所述接收方虚拟网卡的接收队列。
[0075] 步骤1035、在所述报文插入成功后,更新所述发送方虚拟网卡的报文发送数量。
[0076] 若所述报文插入失败,则更新所述发送方虚拟网卡的报文丢失数量。
[0077] 本实施例中,通过共享内存进行报文传输,直接将报文插入到所述接收方虚拟网卡的接收队列,能够实现报文的零拷贝。
[0078] 进一步地,在完成容器间的通信后,可以关闭虚拟网卡,当虚拟网卡关闭后,可以将虚拟网卡的指针从全局哈希表中删除。具体地,可以判断所述虚拟网卡是否具有IP地址;若具有IP地址,则将所述虚拟网卡的IP地址和指针从所述全局哈希表中删除。
[0079] 当VETH内核退出时,可以清除全局哈希表中的所有IP地址和指针。
[0080] 在实际应用中,VETH网络设备可以为每个容器创建一个虚拟网卡,每个容器在与另一容器进行通信时,可以通过哈希表获取另一容器的指针,进而构建两个容器间的动态点对点虚拟链路,从而通过共享内存的方式进行零拷贝通信,由于不需要再通过虚拟网桥、而是直接进行数据传输,因此,有效提高了容器间的通信效率,并且,每个容器只需要创建一个虚拟网卡,避免了网卡资源浪费。
[0081] 本实施例提供的容器间通信方法,通过创建全局哈希表,将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中,并根据所述全局哈希表中的IP地址以及指针,进行容器间的通信,能够动态构建容器间的虚拟点对点通信链路,提升同一宿主机的容器间的通信效率,降低容器间的通信延迟,并且提高了容器间的网络带宽,还能够有效避免网卡资源浪费。
[0082] 下面以两个实验验证本实施例提供的容器间通信方法相较于现有技术一的优势。
[0083] 实验一:使用网络测试工具nerperf,通过TCP_RR、UDP_RR这两个测试用例测试两个容器间的通信延迟,通过TCP_STREAM这个测试用例测试两个容器间的网络带宽。通过实验得出,本实施例中的方法相对于现有技术一,通信延迟降低了28.9%,网络带宽提高了79.2%。
[0084] 实验二:在一个宿主机内创建了10个容器,让9个容器运行netperf服务程序,让一个容器运行nerperf客户端程序,并且让该容器并发地和其余9个容器通信10次。通过实验得出,本实施例中的方法相对于现有技术一,网络延迟降低了35.96%,网络带宽提高了22%。
[0085] 实施例二
[0086] 本发明实施例二提供一种容器间通信装置。图6为本发明实施例二提供的容器间通信装置的结构示意图。如图6所示,本实施例中的容器间通信装置,可以包括:
[0087] 创建模块201,用于创建全局哈希表,将哈希表的所有表头指针初始化为NULL值;
[0088] 启动模块202,用于启动VETH网络设备,在每个容器与虚拟网桥中创建成对的虚拟网卡,并为每个容器的虚拟网卡分配IP地址以及指针,为虚拟网桥的虚拟网卡分配指针;
[0089] 添加模块203,用于将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中;
[0090] 通信模块204,用于根据所述全局哈希表中的IP地址以及指针,进行容器间的通信。
[0091] 本实施例中的容器间通信装置,可以用于执行实施例一所述的容器间通信方法,其具体实现原理与实施例一类似,此处不再赘述。
[0092] 本实施例提供的容器间通信装置,通过创建全局哈希表,将各个容器的虚拟网卡的IP地址以及指针添加到所述全局哈希表中,并根据所述全局哈希表中的IP地址以及指针,进行容器间的通信,能够动态构建容器间的虚拟点对点通信链路,提升同一宿主机的容器间的通信效率,降低容器间的通信延迟,并且提高了容器间的网络带宽,还能够有效避免网卡资源浪费。
[0093] 进一步地,所述通信模块204具体用于:
[0094] 获取发送方虚拟网卡欲发送的报文中的目的IP地址;
[0095] 根据所述目的IP地址,在所述全局哈希表中查找对应的指针;
[0096] 若找到对应的指针,则判断所述指针对应的接收方虚拟网卡的合法性;
[0097] 若合法,则将所述报文插入到所述接收方虚拟网卡的接收队列;
[0098] 在所述报文插入成功后,更新所述发送方虚拟网卡的报文发送数量。
[0099] 进一步地,所添加模块203具体用于:
[0100] 在每一虚拟网卡创建完成后,判断所述虚拟网卡是否具有IP地址;
[0101] 若具有IP地址,则将所述虚拟网卡的IP地址和指针对应存储在所述全局哈希表中。
[0102] 最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。