容器网络限流实践

640?wx_fmt=jpeg


我们需要为“上云“的应用提供流量带宽保证,使其不受到其他应用或其他用户的应用的影响。我们需要提供租户级别或者应用级别的有效隔离。本文分享一下我们为了达到这个目标做了哪些实践工作。
容器平台做容器网络限流的意义

640?wx_fmt=png


无论我们的目标是搭建公有云的容器云平台还是为客户提供容器平台的私有部署或解决方案,我们都会面临一个问题:容器网络限流的问题。在我们实验室的环境下,如果没有对容器带宽进行限制,单Pod使用的最大吞吐量将可以独占整个带宽,从而导致其他应用不能被访问。
单用户单Pod在没有做任何网络带宽限制情况下,网络吞吐量测试结果如下: 
640?wx_fmt=png
我们需要为“上云”的应用提供流量带宽保证,使其不受到其他应用或其他用户的应用的影响。我们需要提供租户级别或者应用级别的有效隔离。今天将分享一下我们为了达到这个目标做了哪些实践工作。
在Kubernetes众多的网络插件中,我们选择使用Open vSwitch容器网络插件。通常情况下,我们根据VNID实现租户间的网络隔离,并且在此基础上我们还可以根据Networkpolicy网络策略提供更细粒度的网络隔离,可以实现Pod之间、跨Namespace的网络访问控制。 
640?wx_fmt=png
使用Open vSwitch容器网络插件如何进行容器网络限流

640?wx_fmt=png


使用Open vSwitch容器网络插件如何进行容器网络限流呢?Open vSwitch本身不实现QoS,它使用Linux内核自带的traffic-control机制进行流量控制。主要两种实现方式:
  • Policing管制:Policing用于控制接口上接收分组(ingress)的速率,是一种简单的QoS的功能,通过简单的丢包机制实现接口速率的限制,它既可以作用于物理接口,也可以作用于虚拟接口。

  • Shaping整形:Shaping是作用于接口上的出口流量(egress)策略,可以实现QoS队列,不同队列里面处理不同策略。


640?wx_fmt=png
Policing的实现
Policing在OVS中采用ingresspolicingrate和ingresspolicingburst两个字段完成ingress入口限速功能,该两个字段放在Interface表中。
入口限速直接配置在网络接口上,命令示例如下:
 
 
  1. # ovs-vsctl set interface eth1 ingress_policing_rate=1000

  2. # ovs-vsctl set interface eth1 ingress_policing_burst=100

  • eth1:加入OVS桥端口的网络接口名称;

  • ingresspolicingrate:为接口最大收包速率,单位kbps,超过该速度的报文将被丢弃,默认值为0表示关闭该功能;

  • ingresspolicingburst:为最大突发流量大小,单位kb。默认值0表示1000kb,这个参数最小值应不小于接口的MTU,通常设置为ingresspolicingrate的10%更有利于tcp实现全速率;


通过命令ovs-vsctl list interface eth1可以查看配置: 
640?wx_fmt=png
Shaping的实现
Shaping用于实现出口流量的控制,使用了队列Queue,可以缓存和调度数据包发送顺序,比Policing更加精确和有效,在OVS的数据表中主要使用QoS和Queue两张表。
QoS创建命令:
 
 
  1. ovs-vsctl set port eth1 qos=@newqos--  

  2. --id=@newqoscreate qos type=linux-htb queues=0=@q0--

  3. --id=@q0create queue other-config:max-rate=100000000


创建Queue:
 
 
  1. --id=@q0 create queue other-config:max-rate=100000000


创建q0队列,设置最大速率100M,通过ovs-vsctl查看配置的Queue表内容如下:
640?wx_fmt=png
创建Qos规则:
 
 
  1. --id=@newqos create qos type=linux-htb queues=0=@q0


创建QoS规则newqos,类型为linux-htb,并连接key值为0的队列q0,通过ovs-vsctl查看配置的QoS表内容如下:
640?wx_fmt=png
创建接口Qos:
 
 
  1. set port eth1 qos=@newqos


设置接口eth1的QoS为newqos,通过ovs-vsctl list port查看配置的port表内容如下:
640?wx_fmt=png
我们采用的技术栈是Golang。我们也可以使用红帽提供的OVS的库github.com/openshift/origin/pkg/util/ovs实现上面Policing和Shaping功能。
代码示意如下:
640?wx_fmt=png 640?wx_fmt=png
在Kubernetes上,如果使用Open vSwitch CNI插件,我们可以在创建Pod资源的时候为其配置速率限制。
创建iperf-pod.yaml,并为其配置速率限制:
 
 
  1. cat <<EOF >iperf-pod.yaml

  2. apiVersion: v1

  3. kind: Pod

  4. metadata:

  5.  name: iperf

  6.  annotations:

  7.    kubernetes.io/ingress-bandwidth: 3M

  8.    kubernetes.io/egress-bandwidth: 3M

  9. spec:

  10.  containers:

  11.  -

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值