设为首页 收藏本站
查看: 1656|回复: 0

[经验分享] Docker实践(4)—network namespace与veth pair

[复制链接]

尚未签到

发表于 2015-4-17 10:24:13 | 显示全部楼层 |阅读模式
network?namespace
创建network namespace
  #?ip?netns?add blue
  #?ip?netns?list
  blue
  
添加网口到namespace
  先创建veth
  #?ip?link add veth0 type?veth?peer name veth1
  在当前namespace可以看到veth0和veth1

#?ip?link list
1: lo: ?mtu?65536?qdisc?noqueue?state UNKNOWN
????link/loopback 00:00:00:00:00:00?brd?00:00:00:00:00:00
2: eth0: ?mtu?1500?qdisc?pfifo_fast?state UP?qlen?1000
????link/ether 00:0c:29:b2:cf:72?brd?ff:ff:ff:ff:ff:ff
3:?veth1: ?mtu?1500?qdisc?noop?state DOWN?qlen?1000
????link/ether ae:0d:00:e1:11:38?brd?ff:ff:ff:ff:ff:ff
4:?veth0: ?mtu?1500?qdisc?noop?state DOWN?qlen?1000
????link/ether 42:e7:50:d4:bb:c5?brd?ff:ff:ff:ff:ff:ff
  ?
  将veth1加到namespace “blue”
  #?ip?link set veth1?netns?blue
  此时,当前namepapce只能看到veth0。
DSC0000.png
  通过如下命令可以查看blue namespace的网口
  #?ip?netns?exec blue?ip?link list
   DSC0001.png
?
配置network namespace的网口
  通过ip?netns?exec可以配置namespace的网口
  #?ip?netns?exec blue?ifconfig?veth1 172.17.42.2/16 up
DSC0002.png
network namespace的网口与物理网卡的通信
  通过bridge来实现。参见veth?pair一节。
  ?
  主要参考
  [0]Introducing Linux Network Namespaces
?
veth?pair
  veth?pair是用于不同network namespace间进行通信的方式,veth?pair将一个network namespace数据发往另一个network namespace的veth。如下:
   DSC0003.png
  ?

#?add?the namespaces
ip?netns?add ns1
ip?netns?add ns2
#?create?the?veth?pair
ip?link add tap1 type?veth?peer name tap2
#?move?the interfaces to the namespaces
ip?link set tap1?netns?ns1
ip?link set tap2?netns?ns2
#?bring?up the links
ip?netns?exec ns1?ip?link set?dev?tap1 up
ip?netns?exec ns2?ip?link set?dev?tap2 up
  ?
  如果多个network namespace需要进行通信,则需要借助bridge:
   DSC0004.png

#?add?the namespaces
ip?netns?add ns1
ip?netns?add ns2
#?create?the switch
BRIDGE=br-test
brctl?addbr?$BRIDGE
brctl?stp???$BRIDGE off
ip?link set?dev?$BRIDGE up
#
#### PORT 1
#?create?a port pair
ip?link add tap1 type?veth?peer name br-tap1
#?attach?one side to?linuxbridge
brctl?addif?br-test br-tap1
#?attach?the other side to namespace
ip?link set tap1?netns?ns1
#?set?the ports to up
ip?netns?exec ns1?ip?link set?dev?tap1 up
ip?link set?dev?br-tap1 up
#
#### PORT 2
#?create?a port pair
ip?link add tap2 type?veth?peer name br-tap2
#?attach?one side to?linuxbridge
brctl?addif?br-test br-tap2
#?attach?the other side to namespace
ip?link set tap2?netns?ns2
#?set?the ports to up
ip?netns?exec ns2?ip?link set?dev?tap2 up
ip?link set?dev?br-tap2 up
#
  ?
  内核实现
  veth的实现与loopback interface类似,比较简单:
  //drivers/net/veth.c
  static netdev_tx_t veth_xmit(struct sk_buff *skb, struct net_device *dev)
  {
  struct net_device *rcv = NULL;
  struct veth_priv *priv, *rcv_priv;
  ?
  priv = netdev_priv(dev);
  rcv = priv->peer;
  rcv_priv = netdev_priv(rcv);
  ?
  stats = this_cpu_ptr(priv->stats);
  ?
  length = skb->len;
  ? ?//转发给peer
  if (dev_forward_skb(rcv, skb) != NET_RX_SUCCESS)
  ?
  goto rx_drop;
?
NETIF_F_NETNS_LOCAL
  NETIF_F_NETNS_LOCAL是网络设备的一个特性,设置该特性的网络设备,不允许在不同network namespace间移动。这类设备也叫做本地设备(local devices)。
  Loopback,VXLAN,PPP,bridge都是这类设备。可以通过ethtool?-k,或者ethtool?–show- features查看该值:
  #?ethtool?-k br0
  netns-local: on [fixed]
  ?
  如果对这类设备network namespace,会报下面的错误:
  #?ip?link set br0?netns?ns1
  RTNETLINK answers: Invalid argument
  ?
  参考《Resource?management:Linux?kernel Namespaces and?cgroups》
  主要参考
  [0]Linux Switching – Interconnecting Namespaces
  

作者:YY哥?
出处:http://www.iyunv.com/hustcat/?
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  ?

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58065-1-1.html 上篇帖子: 建立docker私有hub 下篇帖子: Docker实践(5)—资源隔离
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表