云计算解决了基础资源层的弹性伸缩,却没有解决 PaaS(平台即服务) 层应用随基础资源层弹性伸缩而带来的批量、快速部署问题。于是,容器应运而生。

容器如何将应用打包?

1、隔离技术,相当于制造集装箱。

  • namespace,负责看起来隔离,即每个 namespace 中的应用看到的是不同的 IP 地址、用户空间、进程号等。
  • cgroup,负责用起来隔离,一个应用只能用机器中的一部分 CPU、内存。

2、将集装箱标准化。

  • 镜像,将某一刻的状态保存在一系列文件,无论在哪里运行该镜像,都能完整还原当时的情况。

命名空间(namespace)

当一台 Linux 上跑多个进程时,如果觉得使用不同的路由策略,这些进程可能会冲突,需将这个进程放在一个独立的 namespace 中,方便独立配置网络。

网络的 namespace 由 ip netns 命令操作,可创建、删除、查询 namespace。

下图中,路由除了通过创建一个 Router 虚拟机实现外,还可通过 namespace 实现。

  • 创建一个 routerns,产生一个独立的网络空间,可设置自己的规则。
ip nets add routerns
  • 设置路由可转发。
ip netns exec routerns sysctl -w net.ipv4.ip_forward=1
  • 初始化 iptables,以配置 NAT 规则。
ip netns exec routerns iptables-save -c
ip netns exec routerns iptables-restore -c
  • 作为路由器,需要一张网卡连接 到br0。创建网卡:
ovs-vsctl -- add-port br0 taprouter -- set Interface taprouter type=internal -- set Interface taprouter external-ids:iface-status=active -- set Interface taprouter external-ids:attached-mac=fa:16:3e:84:6e:cc
  • 网络创建完成,进入到 namespace。
ip link set taprouter netns routerns
  • 给网卡配置 IP,为虚拟机网络的网关地址。
ip netns exec routerns ip -4 addr add 192.168.1.1/24 brd 192.168.1.255 scope global dev taprouter
  • 为访问外网,需另一个网卡连接在外网网桥 br-ex 上,并塞在 namespace 中。
ovs-vsctl -- add-port br-ex taprouterex -- set Interface taprouterex type=internal -- set Interface taprouterex external-ids:iface-status=active -- set Interface taprouterex external-ids:attached-mac=fa:16:3e:68:12:c0ip link set taprouterex netns routerns
  • 为该网卡分配一个与物理外网网络在一个网段的 IP。
ip netns exec routerns ip -4 addr add 16.158.1.100/24 brd 16.158.1.255 scope global dev taprouterex
  • 配置路由表。默认路由是去物理外网的;去虚拟机私网,走下面的网卡;去物理外网,走上面的网卡。
ip netns exec routerns route -n
Kernel IP routing table
Destination   Gateway     Genmask     Flags Metric Ref  Use Iface
0.0.0.0     16.158.1.1  0.0.0.0     UG  0   0    0 taprouterex
192.168.1.0    0.0.0.0     255.255.255.0  U   0   0    0 taprouter
16.158.1.0  0.0.0.0     255.255.255.0  U   0   0    0 taprouterex
  • 配置 NAT 规则。虚拟机为外界提供服务,客户端访问进来时,在外网网口 NAT 成虚拟机私网 IP。
ip netns exec routerns iptables -t nat -nvL
Chain PREROUTING
target  prot opt  in  out  source  destination
DNAT  all  --  *  *  0.0.0.0/0 16.158.1.103 to:192.168.1.3
Chain POSTROUTING
target  prot opt  in  out  source   destination
SNAT  all  --  *  *  192.168.1.3  0.0.0.0/0 to:16.158.1.103

至此,基于网络 namespace 的路由器实现完毕。

机制网络(cgroup)

全称 control groups,Linux 内核提供的一种可以限制、隔离进程使用的资源机制。

cgroup 子系统:

  • CPU 子系统,使用调度呈现为进程控制 CPU 的访问;
  • cpuset,如果时多核心的 CPU,为进程分配单独的 CPU 和内存;
  • memory 子系统,设置进程的内存限制及产生内存资源报告;
  • blkio 子系统,设置限制每个块设备的输入输出控制;
  • net_cls,使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序 tc 识别从具体 cgroup 中生成的数据包。

cgroup 提供了一个虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。cgroup 文件系统一般挂载在 /sys/fs/cgroup 目录下。

挂载 net_cls 的文件系统:

mkdir /sys/fs/cgroup/net_cls
mount -t cgroup -onet_cls net_cls /sys/fs/cgroup/net_cls

配置 TC,可按照 cgroup 设定规则:

  • 从 1.2.3.4 来,发送给 port 80 的包,从第一个分支 1:10 走;其他从 1.2.3.4 发送来的包从第二个分支 1:11 走;其他走默认分支。
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1: cgroup

假设有两个用户 a、b,要进行带宽限制。

  • 创新两个 net_cls。
mkdir /sys/fs/cgroup/net_cls/a
mkdir /sys/fs/cgroup/net_cls/b
  • 制定流表规则。net/cls/a/net_cls.classid 中放 flowid 1:10;net/cls/b/net_cls.classid 中放 flowid 1:11。0x00010010 = 0x0001 0010,0x00010011 = 0x0001 0011。
echo 0x00010010 > /sys/fs/cgroup/net_cls/a/net_cls.classid
echo 0x00010011 > /sys/fs/cgroup/net_cls/b/net_cls.classid

容器中的网络如何融入物理网络?

一、容器外的网卡连 docker0 网桥,实现一台物理机上的容器间互相访问。

虚拟机中,有虚拟化软件,可通过 TUN/TAP 设备虚拟一张网卡,但容器中无虚拟化软件,可创建一对 veth pair 的网卡,从一边发包,另一边收包。

1、创建 veth pair 网卡。

ip link add name veth1 mtu 1500 type veth peer name veth2 mtu 1500

2、一边打到 docker0 网桥。

ip link set veth1 master testbr
ip link set veth1 up

3、另一边放入容器。

  • 获取 namespace 的名字。一个容器的启动对应一个 namespace,对于 docker,pid 是 namespace 的名字,假设结果是 12065。
docker inspect '--format={{ .State.Pid }}' test
  • 默认 docker 创建的网络 namespace 不在默认路径下,ip netns 看不到,需 ln 软连接。
rm -f /var/run/netns/12065
ln -s /proc/12065/ns/net /var/run/netns/12065
  • 将另一端 veth2 塞到 namespace 中。
ip link set veth2 netns 12065
  • 将容器内的网卡重命名。
ip netns exec 12065 ip link set veth2 name eth0
  • 给容器内网卡设置 IP。
ip netns exec 12065 ip addr add 172.17.0.2/24 dev eth0
ip netns exec 12065 ip link set eth0 up

二、容器如何访问外网?

宿主机上,有一条 iptables 规则:

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

容器内发出的包,源 IP 转换为物理网卡的 IP。多个容器共享一个外网 IP,在 conntrack 表中,会记录出去的连接。

如果容器内是一个服务,需通过 Docker 的端口映射技术,将内部端口映射到物理机。

如 docker run 命令中的参数 -p 10080:80,将物理机的 10080 端口与容器的 80 端口映射起来。

docker 有两种转换端口的方式:

  • 通过一个进程 docker-proxy,监听 10080,转换为 80 端口。
/usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 10080 -container-ip 172.17.0.2 -container-port 80
  • 通过 DNAT 方式,在 -A PREROUTING 阶段增加一个规则,将端口 10080 的 IP DNAT 成容器的私网。
-A DOCKER -p tcp -m tcp --dport 10080 -j DNAT --to-destination 172.17.0.2:80

趣谈网络协议---容器网络:来去自由的日子,不买公寓去合租相关推荐

  1. 网络笔记(29) 容器网络:来去自由的日子,不买公寓去合租

    如果说虚拟机是买公寓,容器则相当于合租,有一定的隔离,但是隔离性没有那么好.云计算解决了基础资源层的弹性伸缩,却没有解决 PaaS 层应用随基础资源层弹性伸缩而带来的批量.快速部署问题.于是,容器应运 ...

  2. 热门技术中的应用:容器技术中的网络-第29讲-容器网络:来去自由的日子,不买公寓去合租

    如果说虚拟机是买公寓,容器则相当于合租,有一定的隔离,但是隔离性没有那么好.云计算解决了基础资源层的弹性伸缩,却没有解决PaaS层应用随基础资源层弹性伸缩而带来的批量.快速部署问题.于是,容器应运而生 ...

  3. 【网络协议趣谈】什么是网络协议

    下面是一段经典的Hello World!代码 public class HelloWorld {public static void main(String[] args){System.out.pr ...

  4. 数据中心网络vs云网络vs容器网络

    1. 数据中心网络 1.1 接入+汇聚+核心 数据中心往往有非常多的机器,当塞满一机架的时候,需要有交换机将这些服务器连接起来,可以互相通信.这些交换机往往是放在机架顶端的,所以经常称为 TOR(To ...

  5. kubernetes不同的命名空间下的容器能通信吗_深入浅出聊聊Kubernetes网络:容器网络初探...

    前 言 随着云计算的兴起,各大平台之争也落下了帷幕,Kubernetes作为后起之秀已经成为了事实上的PaaS平台标准,而网络又是云计算环境当中最复杂的部分,总是让人琢磨不透.本文尝试着围绕在Kube ...

  6. 软件网络协议测试,网络协议测试方法是什么

    在计算机网络的发展历程中,协议一直处于核心地位.从ARPAnet发展到Internet,其关键环节就是形成了国际标准化的协议.协议是计算机网络和分布式系统中各种通信实体之间相互交换信息所必须遵守的一组 ...

  7. 【计算机网络】——通信协议综述(网络协议、网络分层、ifconfige命令行、DHCP与PXE)

    一.为什么学习网络协议 协议三要素: 人类和计算机之间需要沟通的协议,只有通过这种协议,计算机才知道我们想让它做什么. 可以看得出,计算机语言作为程序员控制一台计算机工作的协议,具备了协议的三要素. ...

  8. 九、网络协议和网络编程

    1.TCP建立连接的过程. 在谈及TCP建立连接和释放连接过程,先来简单认识一下TCP报文段首部格式的的几个名词(这里只是简单说明,具体请查看相关教程)  序列号seq:占4个字节,用来标记数据段的顺 ...

  9. 常见的网络协议与网络要素的介绍

    常用的网络协议有 TCP/IP 协议.IPX/SPX 协议.NetBEUI 协议.HTTP 协议.FTP 协议等.网络通信协议是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络提供通信 ...

最新文章

  1. EOS能不能囤?一篇文章搞懂EOS优缺点
  2. 教你打造优秀IT博文
  3. 荒谬而可信的Docker数据中心商业案例
  4. 六层感知神经网络系统
  5. Khronos 在GDC上的信息汇总:Vulkan,OpenXR,WebGL,glTF
  6. python 删除链表中的重复元素
  7. 牛客题霸 [二进制中1的个数] C++题解/答案
  8. sleep( ) 和 wait( ) 的这 5 个区别,你知道几个
  9. Bulk处理文档大小的最佳值
  10. php 参数 问号_php获取不到url问号之后的参数
  11. 转:error LNK2001 错误
  12. idea重写接口没有@override_1.重载和重写的区别
  13. 探索App保活黑科技
  14. GNS3(1.下载与安装)
  15. Exception Details: System.Data.OleDb.OleDbException: 操作必须使用一个可更新的查询。
  16. Linux 创建.sh脚本文件
  17. 分词:词性标注北大标准
  18. LINK : fatal error LNK1561和LINK : fatal error LNK1168:解决方法
  19. python编程用什么软件-python用什么软件编写
  20. 【智联沙龙活动】混合云云平台PaaS技术分享

热门文章

  1. win10由%AppData%、path引申出来对环境变量的探究,与修改注册表的一些血的教训
  2. mysql 五舍六入_sql的四舍六入五成双的函数 (1)
  3. 作业4 | Lloyd-Max标量量化器DCMP基本原理
  4. mysql查询补齐12个月_MySQL查询12个月数据,无数据补0
  5. 电子设计大赛-电源电路
  6. 张艾迪(创始人):解码互联网天才
  7. Mac修改iPhone备份到移动硬盘或其他位置,避免备份空间不足
  8. An adaptive gamma correction for image enhancement 低照度图像自适应gamma矫正
  9. TCP扫描增强器实现65000端口,10S完成,快准狠(Go语言编程)
  10. 大学计算机基础python第二次作业_python第二次作业