1 docker-tc

实现上可参考github上的 lukaszlach/docker-tc。lukaszlach/docker-tc 提供了一个通过监听 docker event 来为对应容器做限速的方法,但是只支持 bridge 模式下的下行限速。
本方案采用 golang 来是实现容器限速和流量采集,支持对 bridge host模式下容器限速,支持上行和下行限速,支持多网口限速。用户只需要在需要限速的容器配置对应的 --label "com.docker-tc.enabled=1" 启动参数即可。支持 NetworkModehostbridge 两种网络模式;支持配置限速的基础速率 rate 和最高速率 ceil ;支持对于配置了限速的容器做流量采集。

2 技术方案

2.1 主要技术栈

  • 使用 docker golang sdk 来获取容器相关信息并且监听容器的事件(主要关注create 和 die 事件)
  • 使用 tc-traffic control 来进行限速,使用 tchtb 策略进行限速。对应到容器的不同网络模式采用不同的限速方法。对于 net=host, 需要借助 cgroup 来区别不同的容器,并且在 WAN 接口上进行限速,对于 net=bridge ,找出容器对应的 veth,对 veth 接口进行限速。
  • 使用 ifb-Intermediate Functional Block 来将某个端口的流量 ingressifb 接口,然后对 ifb 接口做限速,从而实现下行速率的限制
  • 使用 netlink 来实现各种网络相关的操作
  • 使用 prometheus 来暴露流量的 metric

2.2 数据流

  1. 程序启动后,首先检查所有 running 状态的容器,并且根据 --label "com.docker-tc.enabled=1"label 来确定是否要对这些容器配置限速策略。
  2. 启动一个循环,一直监听容器的事件,对于 create 事件,需要对容器应用限速策略;对于 die 事件,需要删除容器的限速策略。
  3. 对于容器的限速需要区分 net=hostnet=bridge,使用对应的限速方式来实现。
  4. 下行流量限速借助配置 ifb 接口来实现。

2.3 限速策略

bridge 模式下容器限速

# bridge 模式容器下行限速,veth6552aeb 是容器对应的 veth 接口
tc qdisc del dev veth6552aeb root
tc qdisc add dev veth6552aeb root handle 1: htb default 1
tc class add dev veth6552aeb parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit prio 2tc class add dev veth6552aeb parent 1:1 classid 1:10 htb rate 4Mbit ceil 8Mbit prio 1 burst 96kbit
tc qdisc add dev veth6552aeb parent 1:10 handle 10: sfq perturb 10
tc filter add dev veth6552aeb protocol ip parent 1: prio 2 u32 match ip src 0.0.0.0/0 match ip dst 0.0.0.0/0 flowid 1:10# bridge 模式容器上行限速,veth6552aeb 是容器对应的 veth 接口, ss是 container name,用 container name 起一个 ifb 接口
ip link add ss type ifb
ip link set ss uptc qdisc add dev veth5d3d1d6 handle ffff: ingress
tc filter add dev veth5d3d1d6 parent ffff: protocol ip u32 match u32 0 0 action mirred egress redirect dev sstc qdisc add dev ss root handle 1: htb default 1
tc class add dev ss parent 1: classid 1:1 htb rate 1000mbit ceil 1000mbit prio 2tc class add dev ss parent 1:1 classid 1:10 htb rate 8Mbit ceil 12Mbit prio 1 burst 96kbit
tc qdisc add dev ss parent 1:10 handle 10: sfq perturb 10
tc filter add dev ss protocol ip parent 1: prio 2 u32 match ip src 0.0.0.0/0 match ip dst 0.0.0.0/0 flowid 1:10

注意事项

  • 需要处理 docker-tc 容器异常关闭、重启等场景
  • 删除 tc 策略的顺序应该跟添加 tc 策略的顺序相反,应该先删除 filter,再删除 class,不然可能出现 RTNETLINK answers: Device or resource busy 的错误
  • 为了配置下行限速,给对应网口配置了 ingress mirror,比如 ppp4014 的流量 mirror 到了 ifbppp4014,如果直接删除 ifbppp4014,会导致 ppp4014 的网络不通,需要有一个协程定期清理 filternetlink.U32.RedirIndex == 0 的网口的 ingress 策略
  • 需要处理 WAN 口重启或删除导致 tc 策略丢失问题,所以需要监听网口up/down 等事件,并配置对应的 tc 策略。

3 使用说明

3.1 部署和启动该服务

在需要进行容器限速的每台服务器上部署该服务,可以使用 systemd 来启动服务,或者使用 docker 来部署该服务。如果使用 docker 来部署该服务,启动脚本如下:

docker run -d \--name docker-tc \--network host \--privileged \--pid=host \--restart always \-v /var/run/docker.sock:/var/run/docker.sock \-v /var/docker-tc:/var/docker-tc \-v /opt/docker-tc/config:/docker-tc/config \-v /sys/fs/cgroup/net_cls:/sys/fs/cgroup/net_cls \docker-tc

由于 docker-tc 需要操作网络接口,需要配置 --network host--cap-add NET_ADMIN 。另外 docker-tc 需要监听 docker 事件,所以需要配置 -v /var/run/docker.sock:/var/run/docker.sock

3.2 限速容器的配置

如果需要对某个容器做限速,需要配置对应的 label 参数, docker-tc 相关的 label 参数 如下:

  • com.docker-tc.enabled 配置该值=1时应用限速策略,其他值或者没有配置该 label 值将不应用限速策略。
  • com.docker-tc.down.rate 下行限速的基础速率,这个速率范围的的带宽不会拿来跟其他容器的限速共享,但是当某个接口上所有限速策略的技术速率总和超过接口的总速率时,无法保证容器能够达到这个速率。速率单位参考 tc 速率单位如下:
    • 以bit为单位:bit, kbit, mbit, gbit, tbit
    • 以btye为单位: bps, kbps, mbps, gbps, tbps
  • com.docker-tc.down.ceil 下行限速的最高速率。
  • com.docker-tc.up.rate 上行限速的基础速率,这个速率范围的的带宽不会拿来跟其他容器的限速共享,但是当某个接口上所有限速策略的技术速率总和超过接口的总速率时,无法保证容器能够达到这个速率。
  • com.docker-tc.up.ceil 上行限速的最高速率。
  • com.docker-tc.up.cgroup cgroup id,用于关联限速策略
  • com.docker-tc.biz 该容器的业务id,暴露流量采集 metric 时会用到该标签

3.3 测试

3.3.1 启动一个限速的容器

docker run -it --name xxxx \--label "com.docker-tc.enabled=1" \--label "com.docker-tc.cgroup=65552" \--label "com.docker-tc.down.rate=2mbps" \--label "com.docker-tc.down.ceil=10mbps" \--label "com.docker-tc.up.rate=20mbps" \--label "com.docker-tc.up.ceil=30mbps" \--label "com.docker-tc.biz=test" \nettool-centos7 bash

3.3.2 速率测试

docker exec 进入容器使用 wgetiperf 测试一下限速策略是否生效。

容器限速和流量采集03-golang实现相关推荐

  1. 容器限速和流量采集02-TC-Traffic Control

    1 应用场景 tc(Traffic Control) 顾名思义主要用来做流量控制的,linux 内核支持的 Traffic Control 主要包括:流量整形(SHAPING).流量调度(SCHEDU ...

  2. 管道流量采集实验指导书

    管道流量采集实验指导书 项目较大,是我毕业设计的成果之一,完成整个项目需要的时间大概为8小时(1天,非常熟悉MFC编程),24小时(3天,熟悉MFC编程),48小时(6天,较熟悉),2周(只懂得语法) ...

  3. routerOS限速限流量

    routerOS限速限流量 一个一个限制用simple queue / queue simple add name="queue1" target-address=192.168. ...

  4. 运维之眼——流量采集网络

    相信很多做运维的小伙伴在工作过程中不免会碰到以下尴尬的情况: (1)当生产网络发生大流量传输引起带宽瞬间拥堵丢包.应用系统交易缓慢或系统交易成功率降低,需要用抓包手段来分析原因,但是由于一些网络部署架 ...

  5. 网络分流器|高速骨干网流量采集与分流实现方案

    网络分流器|高速骨干网流量采集与分流实现方案 1 流量采集|网络分流器 所谓流量采集,就是将网络流量通过物理层.数据链路层的信号解析和解帧,实现IP原始报文的获取.骨干网流量采集系统是一种对骨干网进行 ...

  6. 网络流量采集(二)——基于硬件探针的流量采集网络

    目录 引言 分光器 SPAN(镜像) 网络分流器(TAP) 引言 网络流量采集分析是获得第一手网络用户行为指标和参数的最有效手段.随着数据中心运维精细化要求不断提高,网络流量采集分析已经成为数据中心基 ...

  7. 《Cisco QoS认证考试指南(第2版)》——6.3节流量限速和流量整形概念

    本节书摘来自异步社区<Cisco QoS认证考试指南(第2版)>一书中的第6章,第6.3节流量限速和流量整形概念,作者 [美]Wendell Odom , Michael J. Cavan ...

  8. 《Cisco QoS认证考试指南(第2版)》一6.3 流量限速和流量整形概念

    本节书摘来自异步社区<Cisco QoS认证考试指南(第2版)>一书中的第6章,第6.3节,作者 [美]Wendell Odom , Michael J. Cavanaugh,更多章节内容 ...

  9. 网络分流器-网络分流器-高速网络流量采集方案

    网络分流器是网络安全领域监控前端重要的基础装备,对于整个网络安全起到关键作用! 戎腾网络分流器 首先讲一下 流量采集 流量采集,主要就是将网络流量通过物理层.数据链路层的信号解析和解帧,实现对IP原始 ...

最新文章

  1. 微软亚洲研究院副院长刘铁岩:AI如何助力节能减排?
  2. Computer Systems A Programmer’s Perspective ----阅读翻译日志
  3. Tomcat一些小事
  4. Hutool Java 工具类库导出 Excel,超级简单!
  5. Spring 5 新增全新的reactive web框架:webflux
  6. GTK+与QT的对比
  7. 核心组件:IRule
  8. 图论——Tarjan 初步 DFS序+时间戳+欧拉序
  9. 洛谷P1801 黑匣子 双堆套路的使用
  10. 自动发卡企业商户运营版带WAP手机端+多种主题
  11. 决策树的python实现
  12. [转载]Netvault:操作Informix APM将A机备份的数据恢复到B机
  13. SQLi LABS Less-11 联合注入+报错注入
  14. linux挂载硬盘_Linux把内存挂载成硬盘提高读写速度-内存虚拟盘
  15. TransE模型的简单介绍TransE模型的python代码实现
  16. MSOCache是什么?
  17. python游戏寻路_游戏服务端寻路的思路与实现
  18. 极狐GitLab硬实力助力中国开源生态建设
  19. asp.net实现识别客户端浏览器或操作系统
  20. Python Pygame制作简单五子棋游戏(详细代码+解释)

热门文章

  1. 企业建网站,这几种域名注定要错过
  2. torch.unsqueeze
  3. 写出求三个数最大值的流程图
  4. 雷文-武汉科技大学-软件工程-本科-20111020(2011年校园招聘找工作时的简历)
  5. 蜂食记小程序:“吃货们”你们的福利来啦!
  6. 修改informix服务器端密码,window下安装informix
  7. 子系统拆分的一点总结
  8. 计算机策略更新失败怎么办,Win10系统自动更新失败 步骤 1、首先要停止Windows update服务...
  9. 内部类简介 如何创建内部类(Java)
  10. 报告解读下载 | 9月《中国数据库行业分析报告》发布,精彩抢先看