【编者的话】我们需要为“上云“的应用提供流量带宽保证,使其不受到其他应用或其他用户的应用的影响。我们需要提供租户级别或者应用级别的有效隔离。今天将分享一下我们为了达到这个目标做了哪些实践工作。

容器平台做容器网络限流的意义无论我们的目标是搭建公有云的容器云平台还是为客户提供容器平台的私有部署或解决方案,我们都会面临一个问题:容器网络限流的问题。在我们实验室的环境下,如果没有对容器带宽进行限制,单Pod使用的最大吞吐量将可以独占整个带宽,从而导致其他应用不能被访问。

单用户单Pod在没有做任何网络带宽限制情况下,网络吞吐量测试结果如下:

我们需要为“上云”的应用提供流量带宽保证,使其不受到其他应用或其他用户的应用的影响。我们需要提供租户级别或者应用级别的有效隔离。今天将分享一下我们为了达到这个目标做了哪些实践工作。

在Kubernetes众多的网络插件中,我们选择使用Open vSwitch容器网络插件。通常情况下,我们根据VNID实现租户间的网络隔离,并且在此基础上我们还可以根据Networkpolicy网络策略提供更细粒度的网络隔离,可以实现Pod之间、跨Namespace的网络访问控制。

使用Open vSwitch容器网络插件如何进行容器网络限流使用Open vSwitch容器网络插件如何进行容器网络限流呢?Open vSwitch本身不实现QoS,它使用Linux内核自带的traffic-control机制进行流量控制。主要两种实现方式:

Policing管制:Policing用于控制接口上接收分组(ingress)的速率,是一种简单的QoS的功能,通过简单的丢包机制实现接口速率的限制,它既可以作用于物理接口,也可以作用于虚拟接口。

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

Policing的实现Policing在OVS中采用ingress_policing_rate和ingress_policing_burst两个字段完成ingress入口限速功能,该两个字段放在Interface表中。

入口限速直接配置在网络接口上,命令示例如下:

# ovs-vsctl set interface eth1 ingress_policing_rate=1000

# ovs-vsctl set interface eth1 ingress_policing_burst=100

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

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

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

通过命令ovs-vsctl list interface eth1可以查看配置:

Shaping的实现Shaping用于实现出口流量的控制,使用了队列Queue,可以缓存和调度数据包发送顺序,比Policing更加精确和有效,在OVS的数据表中主要使用QoS和Queue两张表。

QoS创建命令:

ovs-vsctl set port eth1 qos=@newqos--

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

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

创建Queue:

--id=@q0 create queue other-config:max-rate=100000000

创建q0队列,设置最大速率100M,通过ovs-vsctl查看配置的Queue表内容如下:

创建Qos规则:

--id=@newqos create qos type=linux-htb queues=0=@q0

创建QoS规则newqos,类型为linux-htb,并连接key值为0的队列q0,通过ovs-vsctl查看配置的QoS表内容如下:

创建接口Qos:

set port eth1 qos=@newqos

设置接口eth1的QoS为newqos,通过ovs-vsctl list port查看配置的port表内容如下:

我们采用的技术栈是Golang。我们也可以使用红帽提供的OVS的库github.com/openshift/origin/pkg/util/ovs实现上面Policing和Shaping功能。

代码示意如下:

在Kubernetes上,如果使用Open vSwitch CNI插件,我们可以在创建Pod资源的时候为其配置速率限制。

创建iperf-pod.yaml,并为其配置速率限制:

cat <iperf-pod.yaml

apiVersion: v1

kind: Pod

metadata:

name: iperf

annotations:

kubernetes.io/ingress-bandwidth: 3M

kubernetes.io/egress-bandwidth: 3M

spec:

containers:

- name: iperf

image: yadu/hello-openshift-iperf

imagePullPolicy: IfNotPresent

nodeSelector:

zone: default

EOF

流入测试:

Pod容器里启动iperf server:

$ iperf -s -p 12345 -i 1

------------------------------------------------------------

Server listening on TCP port 12345

TCP window size: 85.3 KByte (default)

------------------------------------------------------------

在任意节点向iperf server产生流量:

[root@a-node4 ~]# iperf -c 10.130.2.103 -p 12345 -i 1 -t 10 -w 5m

------------------------------------------------------------

Client connecting to 10.130.2.103, TCP port 12345

TCP window size:  416 KByte (WARNING: requested 4.77 MByte)

------------------------------------------------------------

[  3] local 10.130.2.1 port 58162 connected with 10.130.2.103 port 12345

[ ID] Interval       Transfer     Bandwidth

[  3]  0.0- 1.0 sec 773 KBytes 6.33 Mbits/sec

[  3]  1.0- 2.0 sec 316 KBytes 2.59 Mbits/sec

[  3]  2.0- 3.0 sec 314 KBytes 2.57 Mbits/sec

(omitted)

查看Pod里流入的日志:

iperf -s -p 12345 -i 1

------------------------------------------------------------

Server listening on TCP port 12345

TCP window size: 85.3 KByte (default)

------------------------------------------------------------

[  4] local 10.130.2.103 port 12345 connected with 10.130.2.1 port 58162

[ ID] Interval       Transfer     Bandwidth

[  4]  0.0- 1.0 sec 354 KBytes 2.90 Mbits/sec

[  4]  1.0- 2.0 sec 351 KBytes 2.87 Mbits/sec

[  4]  2.0- 3.0 sec 349 KBytes 2.86 Mbits/sec

(omitted)

流出测试:

在任意节点上启动iperf server作为测试:

iperf -s -p 12345 -i 1

------------------------------------------------------------

Server listening on TCP port 12345

TCP window size: 85.3 KByte (default)

------------------------------------------------------------

Pod中用iperf client进行测试:

iperf -c 172.18.143.117 -p 12345 -i 1 -t 10 -w 5m

------------------------------------------------------------

Client connecting to 172.18.143.117, TCP port 12345

TCP window size:  416 KByte (WARNING: requested 5.00 MByte)

------------------------------------------------------------

[  3] local 10.130.2.103 port 44602 connected with 172.18.143.117 port 12345

[ ID] Interval       Transfer     Bandwidth

[  3]  0.0- 1.0 sec 1.62 MBytes 13.6 Mbits/sec

[  3]  1.0- 2.0 sec 384 KBytes 3.15 Mbits/sec

[  3]  2.0- 3.0 sec 384 KBytes 3.15 Mbits/sec

(omitted)

查看node4上流入的日志:

iperf -s -p 12345 -i 1

------------------------------------------------------------

Server listening on TCP port 12345

TCP window size: 85.3 KByte (default)

------------------------------------------------------------

[  4] local 172.18.143.117 port 12345 connected with 10.130.2.103 port 44602

[ ID] Interval       Transfer     Bandwidth

[  4]  0.0- 1.0 sec 1.28 MBytes 10.7 Mbits/sec

[  4]  1.0- 2.0 sec 373 KBytes 3.05 Mbits/sec

[  4]  2.0- 3.0 sec 380 KBytes 3.11 Mbits/sec

[  4]  3.0- 4.0 sec 339 KBytes 2.77 Mbits/sec

(omitted)

查看tc的配置:

[root@a-node4 ~]# tc -s -d class show dev vethddb66bac

class htb 1:1 parent 1:fffe prio 0 quantum 1450 rate 11600bit ceil 3000Kbit burst 1513b/1 mpu 0b overhead 0b cburst 1513b/1 mpu 0b overhead 0b level 0

Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)

rate 0bit 0pps backlog 0b 0p requeues 0

lended: 0 borrowed: 0 giants: 0

tokens: 16314655 ctokens: 63083

class htb 1:fffe root rate 3000Kbit ceil 3000Kbit burst 1449b/1 mpu 0b overhead 0b cburst 1449b/1 mpu 0b overhead 0b level 7

Sent 4187548 bytes 2872 pkt (dropped 0, overlimits 0 requeues 0)

rate 0bit 0pps backlog 0b 0p requeues 0

lended: 998 borrowed: 0 giants: 0

tokens: 60416 ctokens: 6041

实现AdmissionWebhook组件:bandwidth-inject-webhook在公有云平台中,我们可以根据租户等级,为其创建的Pod设置不同级别的限流限制。我们通过自研开发实现了AdmissionWebhook组件:bandwidth-inject-webhook。当创建Pod的配置文件yaml提交给apiserver时,可以为其增加网络限流配置。

上面是我们基于Open vSwitch的CNI做的一些研究和开发工作。当然,我们也可以借鉴华为自研的CNI插件,去支持任何网络插件的情景。

参考文章:Open vSwitch之QoS的实现:https://www.sdnlab.com/19208.html

Q&AQ:网络插件为什么没用Flannel?

A:如果选择flannel cni网络插件,可以采用华为开发的限流CNI插件。

Q:目前Istio也具有限速功能,这与tc限速共存吗?

A:SDN控制器,红帽开源的OpenShift有相应的实现。OVS选择是vxlan方式解决节点间通信。Istio的限流方式暂时我还没有了解。

以上内容根据2019年1月8日晚微信群分享内容整理。分享人范彬,现电信云容器项目研发组长。对技术保有一颗热衷的心。自2016年起开始一直从事容器、微服务等方面的研究和开发工作。熟悉Golang技术栈、Kubernetes分布式系统架构和工作原理。DockOne每周都会组织定向的技术分享,欢迎感兴趣的同学加微信:liyingjiesd,进群参与,您有想听的话题或者想分享的话题都可以给我们留言。

网络限流linux,DockOne微信分享(一九八):容器网络限流实践相关推荐

  1. DockOne微信分享(一八三):滴滴弹性云Kubernetes实践...

    当前Kubetnetes已经成为容器编排领域事实的行业标准,越来越多的公司选择使用Kubernetes来搭建其容器云平台.本次分享主要介绍滴滴弹性云在围绕Kubernetes打造企业级私有云过程中的一 ...

  2. DockOne微信分享( 九十):猎豹移动基于CoreOS在AWS上的项目实践

    本文讲的是DockOne微信分享( 九十):猎豹移动基于CoreOS在AWS上的项目实践[编者的话]本次分享介绍基于AWS的EC2服务如何设计和搭建适合自己业务的架构方案实现全球多region部署,介 ...

  3. DockOne微信分享(一三一):Juice——一种基于MesosFramework的任务云框架

    本文讲的是DockOne微信分享(一三一):Juice--一种基于MesosFramework的任务云框架[编者的话]近年来,随着Mesos在生产环境中的普及,使大规模的集群管理变得简单,而基于Mes ...

  4. DockOne微信分享(八十一):唯品会数据库备份恢复容器化项目实践经验总结

    本文讲的是DockOne微信分享(八十一):唯品会数据库备份恢复容器化项目实践经验总结[编者的话]本文分享了唯品会数据库Docker的异地容灾项目实践经验,项目中针对用户数据库的异地恢复场景的需求进行 ...

  5. DockOne微信分享(一一二):Flannel中vxlan backend的原理和实现

    本文讲的是DockOne微信分享(一一二):Flannel中vxlan backend的原理和实现[编者的话]Overlay网络是kubernetes网络模型的重要解决方案之一,而Flannel作为焦 ...

  6. DockOne微信分享(八十四):Docker在B站的实施之路

    本文讲的是DockOne微信分享(八十四):Docker在B站的实施之路[编者的话]B站一直在关注Docker的发展,去年成功在核心SLB(Tengine)集群上实施了Docker.今年我们对比了各种 ...

  7. DockOne微信分享(一一零):Docker在沪江落地的实践

    本文讲的是DockOne微信分享(一一零):Docker在沪江落地的实践[编者的话]容器化是很多公司技术层向往又惧怕的一项热门技术,它的高效性,封装性能给开发.运维带来许多便利,但其本身也需要较强的技 ...

  8. DockOne微信分享(一三四):国内某大型酒店管理集团基于Kubernetes的实践

    本文讲的是DockOne微信分享(一三四):国内某大型酒店管理集团基于Kubernetes的实践[编者的话]随着业务的增长,架构变得越来越复杂,服务器和应用数量越来越多,随之应用的管理,配置的管理,后 ...

  9. DockOne微信分享(一二四):轻松筹监控系统实现方案

    本文讲的是DockOne微信分享(一二四):轻松筹监控系统实现方案[编者的话]监控系统是服务管理最重要的组成部分之一,可以帮助开发人员更好的了解服务的运行状况,及时发现异常情况.虽然阿里提供收费的业务 ...

最新文章

  1. The EF Core tools version '2.1.1-rtm-30846' is older than that of the runtime '2.1.3-rtm-32065'. ...
  2. java 构造方法和析构方法_PHP面向对象程序设计之构造方法和析构方法详解
  3. redis配置实例及redis.conf详细说明
  4. jQuery源码分析 整体框架部分及部分常用方法
  5. 一个REST风格的URI设计方案[Blog Web Services]
  6. 如何制作一款HTML5 RPG游戏引擎——第一篇,地图类的实现
  7. 学计算机的学期计划书,学习计划表
  8. C++复习(五)(const、static、inline、引用与指针、new/delete)
  9. JAVA收到网络报文的IP是::1,怎么回事?
  10. 网页版QQ、MSN等等聊天工具web版大全
  11. 如何选择适合的微信号码开通状态检测工具
  12. 教你如何下载并破解IAR
  13. CodeBlocks汉化安装教程
  14. matlab求解数值积分,应用MATLAB求解数值积分
  15. 高通QCC5100系列蓝牙音频模块芯片
  16. Linux动态频率调节系统CPUFreq之一:概述
  17. 面板数据、工具变量选择和Hausman检验的若干问题
  18. 高等数学笔记-乐经良老师-第五章-积分(Ⅱ)-定积分的应用-第六节-定积分的应用
  19. kafka SASL认证介绍及自定义SASL PLAIN认证功能
  20. 创建表空间(Oracle)

热门文章

  1. 壁仞科技A轮融资11亿元, 创近年芯片设计领域新纪录
  2. 修复十一个重要高危漏洞 苹果致谢滴滴美研
  3. 我是如何在六个月内学会 Python 的?
  4. 张亚勤退休百度,技术客回归学术
  5. 开发者强势围观!Gartner 发布 2020 年十大战略科技发展趋势
  6. 华为HMS核心服务全面开放 赋能开发者共筑智慧新生态
  7. 直接拿来用!Google 新推 AI 模型打破了现有 CNN 技术壁垒
  8. 用脚踹?地震火灾中,如何快速打开人脸识别闸机门?
  9. 东哥再见!我打算 6 月份离职
  10. 这才是你寻寻觅觅想要的 Python 可视化神器!