一种基于IP协议可选字段的容器公网带宽限制方法与流程

文档序号:25704630发布日期:2021-07-02 10:36阅读:138来源:国知局
本发明涉及容器
技术领域
:,具体涉及一种基于ip协议可选字段的容器公网带宽限制方法。
背景技术
::容器是一种轻量级的计算虚拟化技术。通过使用容器技术,可以将应用程序和其运行所依赖标准库、第三方库、配置文件等运行环境打包到一个容器镜像中,后续应用程序的运行可以通过运行容器镜像的方式来替代。将应用程序打包成容器镜像再运行相比于直接运行应用程序具有隔离运行环境和物理资源的优点。由于容器间的运行环境和cpu、内存、网络等物理资源是互间隔离的,当同一台物理机上运行多个容器时,就不会造成运行环境管理混乱、互相争抢物理资源等情况。目前,容器已经成为互联网数据中心应用程序的主流部署方式。数据中心的多台物理机通常部署在同一个局域网内,物理机间的互相访问通过局域网ip地址进行,物理机访问公网通常会通过网关做nat(networkaddresstranslation)将局域网ip地址转换为公网ip地址,网关是同一局域网中的一台具有公网ip地址的物理机。在网关机器上,通过对网关的所有流量数据包的局域网ip地址字段进行分析,就可以统计局域网内各物理机的公网流量,从而对物理机的流量进行限制。容器运行在物理机上,同一台物理机上可以运行多个容器,每个容器都拥有独立的ip地址。不同于物理机的ip地址,容器通常通过桥接的方式将网络接入到物理机的虚拟网桥中,因此容器的ip地址通常是物理机虚拟网桥的内部ip,容器内访问公网需要通过两层nat,第一层是在容器所在的物理机上将容器的ip地址转换为物理机的局域网ip地址,第二层是在网关机器上将物理机的局域网ip地址转换为网关的公网ip地址。在做第一层转换后,容器的ip地址就丢失了,在网关的机器上只能确定数据包来源的物理机,无法确定数据包是来源于物理机上哪个容器。对容器公网带宽进行限制的方法通常是在容器所在的物理机上进行的。在做第一层nat之前,通过对物理机虚拟网桥的流量数据包进行分析,可以根据数据包的源ip地址字段确定数据包的来源容器,从而实现对容器的公网带宽进行统计和限制。技术实现要素:本发明提出了一种基于ip协议可选字段的容器公网带宽限制方法,能够实现在局域网网关机器上实现对局域网内任意物理机上容器的公网带宽进行限制。一种基于ip协议可选字段的容器公网带宽限制方法,包括以下步骤:1)在物理机架设第一linux内核模块和第二linux内核模块;2)物理机上加载第一linux内核模块(linux内核模块1),在收到容器对公网发送的数据包后,将容器的ip地址添加到数据包的ip头部options字段(可选字段)中;3)容器中发送的数据包通过物理机的第一层nat(网络地址转换协议)之后,数据包的源ip地址被修改为物理机的局域网地址,并被发送到网关机器;4)网关机器加载第二linux内核模块(即内核模块2),在收到步骤3)的数据包后,将数据包ip头部options字段中取出容器的ip地址,将数据包打上相应的标签;5)网关机器通过添加iptables规则,在mangle表的input链中将数据包中的标签保存到数据包的连接中;6)网关机器通过添加iptables规则,在mangle表的input链中将数据包连接中的标签保存到数据包中;7)通过tc(trafficcontrol)对具有标签的数据包进行流量控制。本发明中,通过在局域网的物理机上加载内核模块(第一linux内核模块和第二linux内核模块),在容器将ip数据包发往局域网之前,将ip数据包的容器ip地址设置到ip协议的可选字段中。在局域网的公网网关机器上,通过加载特定内核模块,将ip数据包可选字段中的容器ip地址取出,并且对数据包打上相应的标签,交给带宽限制模块进行带宽控制。本发明在一台局域网网关机器上对局域网内所有容器的流量进行统一管理和限制,简化了软件架构,能提高管理效率,降低管理成本。并且,本发明能实现对多个跨物理机的容器公网带宽的联合管理和限制,对数据包的操作都在操作系统的内核态完成,具有很高的运行效率。步骤2)中,内核模块1在物理机启动后即被自动加载到linux内核中。在内核模块1被加载时,会调用nf_register_hook函数将内核模块1中的钩子函数挂载到内核的netfilter链中;物理机上加载第一linux内核模块具体包括:调用nf_register_hook函数将第一linux内核模块中的钩子函数挂载到内核的netfilter链中。步骤2)中,物理机上所有的数据包都会被第一linux内核模块注册在netfilter链中的钩子函数所捕获;步骤2)中,内核模块1的钩子函数通过调用setsockopt内核函数,将容器ip地址设置到ipproto_ip协议的ip_options字段中,ipproto_ip和ip_options为setsockopt函数的两个控制参数;将容器的ip地址添加到数据包的ip头部options字段(可选字段)中,具体包括:第一linux内核模块的钩子函数通过调用setsockopt内核函数,将容器ip地址设置到ipproto_ip协议的ip_options字段中,ipproto_ip和ip_options为setsockopt函数的两个控制参数。ip_options字段是指ip协议头部options字段。步骤3)中,容器传输到物理机作为第一层nat(网络地址转换协议),物理机输到公网作为第二层nat(网络地址转换协议);步骤4)中,内核模块2在网关机器启动后即被自动加载到linux内核中。在内核模块2被加载时,会调用nf_register_hook函数将内核模块2中的钩子函数挂载到内核的netfilter链中。网关机器加载第二linux内核模块,具体包括:会调用nf_register_hook函数将钩子函数挂载到内核的netfilter链中。步骤4)中,网关机器上所有的数据包都会被第二linux内核模块(内核模块2)注册在netfilter链中的钩子函数所捕获;步骤4)中,将数据包ip头部options字段中取出容器的ip地址,具体包括:第二linux内核模块的钩子函数通过调用getsockopt内核函数,从ipproto_ip协议的ip_options字段中获取容器的ip地址,ipproto_ip和ip_options为setsockopt函数的两个控制参数;ip_options字段是指ip协议头部options字段。步骤4)中,将数据包打上相应的标签,具体包括:通过对数据包结构体(sk_buff类型)的mark字段赋值进行操作,数据包结构体传给第二linux内核模块的钩子函数,标签值为容器ip地址的32位数值;对数据包打标签可以通过对数据包结构体(sk_buff类型)的mark字段赋值进行操作,数据包结构体由内核传给内核模块2的钩子函数,标签值可以为容器ip地址的32位数值;步骤5)中,iptables是linux中常用的数据包管理工具,可以实现对数据包的修改、打标签、转发、统计等功能;步骤5)中,mangle表是iptables工具保存对数据包修改规则的表,通常在这张表中对数据包进行修改和打标签。input链是数据包进入内核tcp/ip协议栈的入口。步骤5)中,将数据包中的标签保存到数据包连接中可以通过iptables的connmark模块来完成,命令为:iptables-tmangle-ainput-jconnmark--save-mark;步骤6)中,将数据包连接中的标签保存到数据包中可以通过iptables的connmark模块来完成,命令为:iptables-tmangle-ainput-jconnmark--restore-mark;步骤7)中,tc是linux系统中常用的网络流量限制工具,可以根据数据包的标签对带有相同标签的流量进行限速;具有标签的数据包即标记为i的数据包的带宽bi可以通过以下公式进行计算:q为网关的最大物理带宽值,b为所有标记的数据包的带宽期望值总和,bi为标记为i的数据包的带宽期望值。与现有技术相比,本发明具有如下优点:1)本发明在一台局域网网关机器上对局域网内所有容器的流量进行统一管理和限制,现有方案需要在所有局域网物理机中进行容器流量的管理,本发明简化了软件架构,能提高管理效率,降低管理成本;并且,本发明能实现对多个跨物理机的容器公网带宽的联合管理和限制,对数据包的操作都在操作系统的内核态完成,具有很高的运行效率。2)本发明可以实现对多个跨物理机的容器公网带宽的联合管理和限制,现有方案则无法实现该功能;3)本发明能提升容器带宽规则变更时的更新速度,本发明只需要更新网关机器上的规则即可,现有方案需要更新每一台物理机上的规则;4)本发明对数据包的修改和带宽的限制均在操作系统的内核模块中进行,具有很高的运行性能。附图说明图1为本发明基于ip协议可选字段的容器公网带宽限制方法的流程示意图。具体实施方式如图1所示,一种基于ip协议可选字段的容器公网带宽限制方法,包括以下步骤:1)物理机上加载linux内核模块1,在收到容器对公网发送的数据包后,将容器的ip地址添加到数据包ip头部的options字段中;2)容器中发送的数据包通过物理机的第一层nat之后,数据包的源ip地址被修改为物理机的局域网地址,并被发送到网关机器;3)网关机器加载内核模块2,在收到数据包后,将数据包ip头部的options字段中取出容器的ip地址,将数据包打上相应的标签;4)网关机器通过添加iptables规则,在mangle表的input链中将数据包中的标签保存到连接中;5)网关机器通过添加iptables规则,在mangle表的input链中将连接中的标签保存到数据包中;6)通过tc(trafficcontrol)对具有标签的数据包进行流量控制。步骤1)中,内核模块1在物理机启动后即被自动加载到linux内核中。在内核模块1被加载时,会调用nf_register_hook函数将内核模块1中的钩子函数挂载到内核的netfilter链中;步骤1)中,物理机上所有的数据包都会被内核模块1注册在netfilter链中的钩子函数所捕获;步骤1)中,内核模块1的钩子函数通过调用setsockopt内核函数,将容器ip地址设置到ipproto_ip协议的ip_options字段中,ipproto_ip和ip_options为setsockopt函数的两个控制参数;步骤3)中,内核模块2在网关机器启动后即被自动加载到linux内核中。在内核模块2被加载时,会调用nf_register_hook函数将内核模块2中的钩子函数挂载到内核的netfilter链中;步骤3)中,网关机器上所有的数据包都会被内核模块2注册在netfilter链中的钩子函数所捕获;步骤3)中,内核模块2的钩子函数通过调用getsockopt内核函数,从ipproto_ip协议的ip_options字段中获取容器的ip地址,ipproto_ip和ip_options为setsockopt函数的两个控制参数;步骤3)中,对数据包打标签可以通过对数据包结构体(sk_buff类型)的mark字段赋值进行操作,数据包结构体由内核传给内核模块2的钩子函数,标签值可以为容器ip地址的32位数值;步骤4)中,iptables是linux中常用的数据包管理工具,可以实现对数据包的修改、打标签、转发、统计等功能;步骤4)中,mangle表是iptables工具保存对数据包修改规则的表,通常在这张表中对数据包进行修改和打标签。input链是数据包进入内核tcp/ip协议栈的入口。步骤4)中,将数据包中的标签保存到连接中可以通过iptables的connmark模块来完成,命令为:iptables-tmangle-ainput-jconnmark--save-mark;步骤5)中,将连接中的标签保存到数据包中可以通过iptables的connmark模块来完成,命令为:iptables-tmangle-ainput-jconnmark--restore-mark;步骤6)中,tc是linux系统中常用的网络流量限制工具,可以根据数据包的标签对带有相同标签的流量进行限速;具有标签的数据包即标记为i的数据包的带宽bi可以通过以下公式进行计算:q为网关的最大物理带宽值,b为所有标记的数据包的带宽期望值总和,bi为标记为i的数据包的带宽期望值。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1