UDN-企业互联网技术人气社区

板块导航

浏览  : 1423
回复  : 0

[资源分享] Docker网络隔离初步设想

[复制链接]
呵呵燕的头像 楼主
发表于 2016-9-15 21:38:05 | 显示全部楼层 |阅读模式
  Docker网络现状

  目前Docker网络隔离是容器化方案中最薄弱的一环,无论是Docker引擎还是各大管理系统如Mesos和K8S都没有提供解决方案。但是如果不隔离,将存在一定的风险,因为如果一个容器的流量过大将占用完网卡,造成其它容器无法被使用。

  目前是否就有办法在目前的情况下做到网络隔离呢?其实有变通的方式的。

  PoC 思路和实践过程

  首先要找到一条思路能够手工做,然后再去考虑如何与容器管理系统集成的问题

  在Docker引擎无法提供相关的功能,难么只能从主机Linux系统开始入手

  网络模型是Bridge的方式,可以通过限制容器的虚拟网卡来限流

  目前在Linux上限制应用或者网卡已经有不少工具,在实践过程中,对比了一下几个:

  TC: Linux下的traffic control工具,不过设置太复杂,在一个崇尚简单的年代,这个简直就是虐心

  Trickle,这个命令主要是限制应用的网络流量,但是需要先流是网卡,这个就不合适了

  wondershaper,这个命令基于TC,但是简单很多,可以直接限制网卡,那就它了。可是由于这个工具有些老,也遇到了些坑,后面有提。

  安装wondershaper需要先安装Fedora repo (基于CentOS 7.x)

  然后 yum install wondershaper之行命令:wondershaper 来限制流量,单位是kbps

  有了工具,那么从限制容器网络入手,就需要通过容器id找到主机对应的虚拟网卡vethxxx。但是问题来了,从Docker自身的API和命令都无法找到容器映射到主机虚拟网卡。后来通过和熟人云老肖的交流,找到一个途径:

  第一步先通过Docker引擎(Docker inspect )获取到容器对应的SandboxKey,如/var/run/Docker/netns/5b0e87d40fad第二步,获取容器的peer_ifindex,即对应的容器的虚拟网卡的编号veth_id的值 nsenter --net=/var/run/Docker/netns/5b0e87d40fad ethtool -S eth0 |grep peer_ifindex ,记住前提是主机有安装nsenter,并且容器有ethtool工具,这里面又有个坑,后面有提

  第三步,获取容器在主机上获取对应的虚拟网卡 ip a|grep 第四部,这样就可以通过wondershaper来对容器限速了 wondershaper 第五步,测试效果, 为了简单,测试思路是在主机生成一个大文件如1G (dd if=/dev/zero of=hello.txt bs=1G count=1),然后在容器中通过wget获取这个文件查看速率 wget http://xxxx:8090/hello.txt (通过python来启动一个简单的http服务: python -m SimpleHTTPServer 8090)

  遇到的一些坑

  wondershaper在设置超过10000时不起效果,后来发现原因是wondershaper太旧了。不过还好,它是个脚本命令,编辑这个命令,找到10mbit地方,改成1000mbit(千兆网卡)或者10000mbit(万兆网卡)就可以了。

  执行上面nsenter命令总是报错,错误为’invalid parameter’,但是命令是对的。找了半天资料,发现这是旧版的Docker的systemd的配置有问题,需要修改/usr/lib/systemd/system/Docker.service文件,将MountFlags=slave去掉就好,然后需要重新启动Docker引擎。

  可行整体方案

  至此,我们可以通过手动的方式设置容器的网络的带宽了。但是在一个集成体系(Mesos/K8S),这个手动的方式是不现实的,所以需要设计一个方案做到简化、自动化

  在Mesos+Marathon上的设计思路:

  在每台主机上部署一个控制网络速率的agent

  容果Marathon部署容器,设置环境变量CONTAINER_UPLOAD_RATE, CONTAINER_DOWNLOAD_RATE,来设置容器的网路最好速率值

  Agent获取本机的Docker引擎的信息,当容器启动的时候,获取到容器的id,以及上面的速率的环境变量,然后执行像之前手动的方式用wondershaper去限速

  该方案的优势劣势:

  无法作为资源上报给Mesos做分配。换句话说,就算是主机的网络符合很高,Mesos还是会将容器部署到该主机上

  该方案至少做到了容期间的网络流量隔离

  先对简单

  这个Agent还可以开放端口给管理平台来控制容器的速率

  终极方案

  还是需要Mesos+Marathon来提供更为合适,就像CPU和Memory那样,网卡也应该是一种可管理资源

原文作者:了哥 来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部