跨namespace通信
1、net namespace :
可以做到容器的网络隔离,不同的namespace网络协议栈(网络设备、路由表、iptables/netfilter等)是各自 独立的。
用到的命令:ip netns (管理namespace),ip link (网络设备),ip addr (设备上的协议地址)
在namespace 中操作每次需要加前缀:“ip netns exec + namespace名”再加相对应操作的命令。也可以用:ip netns exec namespace名 bash,来进入相对应的命名空间,以后每次操作就不需要加“ip netns exec + namespace名”这个前缀,但是缺点是没有提示,你最后可能会无法知道自己到底在哪个命名空间。
- namespace有六种:网络、进程(同一个进程,在不同的命名空间进程号不同)、挂载(隔离文件目录)、ipc(隔离进程间通信:进程间交互方法)、UTS(让容器拥有独立的主机名和域名)、用户命名空间
2、veth pair:
可以让两个不同的net namespace之间通信。veth(veth0)有两端,一端连接协议栈,另一端连接设备(veth1)。
它的报文流动方向是:用ping来举例子,ping目的ip是会有一个ARP请求,先去协议栈选择一条合适的路由,然后从源网卡发到目的网卡。目的网卡接收到请求后,发到协议栈看能否匹配到本地路由表,如果可以的话会返回一个回复报文。
创建veth pair
[root@localhost zh]# ip link add veth0 type veth peer name veth1
创建net namespace
[root@localhost zh]# ip netns add ns2
[root@localhost zh]# ip netns add ns1
将veth添加到net namespace中去:
[root@localhost zh]# ip link set veth0 netns ns1
[root@localhost zh]# ip link set veth1 netns ns2
在namespcae中启动新创建的veth pair 否则不能用,在ns2中也是同样操作
[root@localhost zh]# ip netns exec ns1 ip link set veth0 up
[root@localhost zh]# ip netns exec ns1 ifconfig //查看namespace中的vethveth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500ether 12:6a:2e:c7:62:c0 txqueuelen 1000 (Ethernet)RX packets 8 bytes 656 (656.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 8 bytes 656 (656.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
给veth配置ip
[root@localhost zh]# ip netns exec ns2 ip addr add 192.168.2.10/24 dev veth0
[root@localhost zh]# ip netns exec ns1 ip addr add 192.168.2.11/24 dev veth1
然后再ping,ping成功之后,两个不同namespace之间就可以通信了
[root@localhost zh]# ip netns exec ns2 ping 192.168.2.10
PING 192.168.2.10 (192.168.2.10) 56(84) bytes of data.
64 bytes from 192.168.2.10: icmp_seq=1 ttl=64 time=0.236 ms
64 bytes from 192.168.2.10: icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from 192.168.2.10: icmp_seq=3 ttl=64 time=0.074 ms
64 bytes from 192.168.2.10: icmp_seq=4 ttl=64 time=0.073 ms
^C
--- 192.168.2.10 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5005ms
rtt min/avg/max/mdev = 0.073/0.101/0.236/0.060 ms
如果要namespace能ping通宿主机,需要在veth pair(veth0,veth1)中间加bridge。veth0接入bridge,veth1接入namespace。如果ping不通,可通过"route -n"查看路由表,看有没有通往目的ip的路由表项,如果没有就不能ping通,需要手动添加(ip route add 目的ip dev 网卡)
ping通宿主机的重点是路由表,可以不加bridge, veth pair可以做到
[root@localhost zh]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.250.2 0.0.0.0 UG 100 0 0 ens33
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 veth0//看有没有本条路由[root@localhost zh]# ip netns exec ns1 route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 veth1//这儿也一样,是否存在这条记录
3、bridge:
和veth pair一起解决多个namespace之间的通信
bridge有多个端口,其中一端连接协议栈,其余的连接设备。它的从设备没有mac和ip,被弱化成了端口,数据包在bridge中进行转发等操作,选择数据包从哪个端口(网卡)流出。
创建bridge:
[root@localhost zh]# ip link add br0 type bridge
并启动:
[root@localhost zh]# ip link set br0 up
将veth pair其中的一个关联到bridge上,将veth启动起来,并配置ip
移除添加到bridge的网卡:brctl delif br0 veth
[root@localhost zh]# ip link set veth0 master br0
可以通过“bridge link”查看bridge上关联的设备
[root@localhost zh]# bridge link
4: virbr0-nic state DOWN : <BROADCAST,MULTICAST> mtu 1500 master virbr0 state disabled priority 32 cost 100
11: veth0 state DOWN @(null): <BROADCAST,MULTICAST> mtu 1500 master br0 state disabled priority 32 cost 2
创建一个namespace,将veth pair的另一个添加到这个空间,启动起来,并配置ip,就可以ping成功了 。上面演示的是两个namespace可以ping成功,多个namespace通信就是创建namespace将veth pair的一个添加到命名空间,将另一个添加到bridge,在进行上述同样的一系列操作,就能多个namespace之间通信。
4.让命名空间能够访问外网
[root@localhost zh]# ip netns exec ns1 route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 veth1
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 veth1//查看有没有这两条路由,192.168.2.1是网桥ip(veth添加到网桥上就失去了ip,所以直接将ip配置在网桥上)
在宿主机添加iptables规则:
sudo iptables -t filter -A FORWARD -i br0 ! -o br0 -j ACCEPT
sudo iptables -t filter -A FORWARD -i br0 -o br0 -j ACCEPT
sudo iptables -t filter -A FORWARD -o br0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/16 ! -o br-demo -j MASQUERADE
添加完了之后 就ping 外网了
5.跨主机访问命名空间
在192.168.250.148这台开启一个简单的httpserver
[root@localhost zh]# python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
[root@localhost zh]#curl -I 192.168.2.2:8000//在本机上就可以访问了
从别的机器访问本机namespace需要在本机设置
sudo iptables -t nat -A PREROUTING -p tcp -m tcp --dport 8088 -j DNAT --to-destination 192.168.2.2:8000
sudo iptables -t filter -A FORWARD -p tcp -m tcp --dport 8000 -j ACCEPT(这样设置之后,DNAT做目的IP转换,从192.168.250.148:8088转换成192.168.2.2:8000)
//这是在另一台[root@localhost zh]# curl -I 192.168.250.148:8088HTTP/1.0 200 OKServer: SimpleHTTP/0.6 Python/2.7.5Date: Thu, 10 Jan 2019 09:36:35 GMTContent-type: text/html; charset=UTF-8Content-Length: 1074
=
跨namespace通信相关推荐
- Docker的网络模式和跨主机通信
文章转载自:http://www.a-site.cn/article/169899.html Docker的四种网络模式Bridge模式 当Docker进程启动时,会在主机上创建一个名为docker0 ...
- 052、overlay如何实现跨主机通信?(2019-03-19 周二)
参考https://www.cnblogs.com/CloudMan6/p/7305989.html 今天开始学习 overlay 网络跨主机通信的原理 root@host01:~# ufw al ...
- 50-overlay 如何实现跨主机通信?
上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ...
- overlay 如何实现跨主机通信?- 每天5分钟玩转 Docker 容器技术(52)
上一节我们在 host1 中运行了容器 bbox1,今天将详细讨论 overlay 网络跨主机通信的原理. 在 host2 中运行容器 bbox2: bbox2 IP 为 10.0.0.3,可以直接 ...
- Kubernetes K8S之Pod跨namespace名称空间访问Service服务
Kubernetes的两个Service(ServiceA.ServiceB)和对应的Pod(PodA.PodB)分别属于不同的namespace名称空间,现需要PodA和PodB跨namespace ...
- 聊聊C++跨类通信机制之消息总线及其实现
如果没有怎么写过项目,更确切地说是没有用面向对象的语言写过项目.就不会明白跨类通信这个需求是多么刚需. 为什么要跨类通信?把所有的逻辑都写在一个类中,都是一家人,那就不需要通信了啊.是,确实是这样,当 ...
- 跨进程通信,到底用长连接还是短连接
一个完整的软件系统大多数情况下是由多个进程共同协作进行的,哪怕它们在同一台服务器上.所以,进程之间如何进行高效的通信至关重要. 单个应用程序+单个数据库这套基础开发套餐我相信每个人都经历过,甚至在初期 ...
- ZeroMq实现跨线程通信
ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...
- 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP、jQuery 和 Yahoo! 查询语言构建 mashup...
使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP.jQuery 和 Yahoo! 查询语言构建 mashup 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP.jQue ...
最新文章
- 精通Spring Boot —— 第十五篇:使用@ControllerAdvice处理异常
- 分区供水条件口诀_口诀记忆 | 消防给水和消火栓系统的“月检”(重点学习)...
- POJ2481-Cows【树状数组】
- 中国的电商发展迅速,有了取代实体的趋势
- 内涵! 程序员才懂的动图(太 TM 形象了)
- 转一段群里看到的小诗,银才啊银才!
- LQR 的直观推导及简单应用
- 搭建网站基本步骤(搭建一个网站的步骤)
- 增量型编码器与绝对值编码器
- APMSERV 配置失败 或80端口被占用最全解决办法 100%解决
- 如何在NLP领域做成一件事by周明ACL计算语言学会候任主席(附PDF公号发“NLP做事”下载rar讲座PPT等10文件)...
- 编写程序实现以下功能:计算1~n之间的素数并输出
- NOIP2009 普及组 复赛 poly 多项式输出
- 形式逻辑三大基本要素-推理的本质
- 苹果库乐队怎么玩_手机版决战万圣夜游戏下载了怎么玩?(安卓/苹果)
- 油门刹车标定表的制作
- python php java地铁站自动售票系统nodejs+vue+elementui
- 神舟z7m安装Linux,神舟战神Z7M U盘装系统win8教程
- 鸿蒙发布会在哪里看,华为新品发布会抢先看:Mate40+鸿蒙2.0系统齐亮相!
- Navicat导出数据库结构(不含数据)
热门文章
- php 检测英文字符,php正则验证中英文字符串 - 小俊学习网
- CAD梦想画图中的“阵列命令”
- 一张图看懂offsetX, clientX, pageX, screenX的区别
- java pkcs8格式的私钥_RSA加密解密中pkcs1与pkcs8格式私钥互相转换
- 计算机弹出虚拟U盘,怎么设置vmware虚拟机U盘启动
- Ryu环境搭建(Ubuntu20)
- Java体系知识之ElementUI
- 学术期刊数据库---EBSCO
- oracle truncate可以恢复吗,恢复truncate表
- 「来道题」Redis的Gossip协议