跨主机网络
host网络
none 无外部网络
host 共享主机网路
bridge 桥接网络
joiend容器 共享另一个容器的网络
解决了单的host上容器的通信问题
跨主机网络
1、docker 原生的overlay、macvlan
2、第三方方案flannel、weave、calico
libnetwork&CNM
libnetwork是docker容器网络库,定义了container network model,CNM 这个模型对容器网络进行了抽象
- sandbox 是容器的网络栈 包含容器的intreface、路由表、dns sandbox可以包含来自不同network的endpoint
- endpoint 的作用是将sandbox接入network。endpoint的典型实现是 veth pair 一个endpoint只能属于一个网络,也只能属于一个sandbox
- network 包含一组endpoint,同一network的endpoint可以直接通信
两个 Network:默认网络 “bridge” 和自定义网络 “my_net2”。实现方式是 Linux Bridge:“docker0” 和 “br-5d863e9f78b6”。
三个 Enpoint,由 veth pair 实现,一端(vethxxx)挂在 Linux Bridge 上,另一端(eth0)挂在容器内。
三个 Sandbox,由 Network Namespace 实现,每个容器有自己的 Sanbox。
docker overlay
为了支持容器跨host通信,docker原生提供了 overlay driver网络 ,使用户可以创建基于VxLAN的overlay网络
VxLAN可以将二层的数据封装到UDP进行传输 提供与VLAN相同的以太网二层服务,但是拥有更强的扩展性和灵活性
docker overlay 需要一个key-value 的数据库保存网络状态信息 包括 network、endpoint、ip
cunsul
etcd
zookeeper
tcp 2377 集群管理通信
t/u7946 节点之间通信
udp 4789 覆盖网络流量
在创建覆盖网络之前,需要将docker守护进程初始化为swarm管理器
\# docker swarm init
或者连接到现有的swarm
\# docker swarm join
swarm
Docker swarm 提供docker 容器集群服务,使用它用户可以将多个docker主机封装为单个大型的虚拟docker主机,快速打造一套容器云平台
swarm 内置了对docker 网络插件的支持 ,用户可以 很容易的的部署跨主机的容器集群服务
swarm 是典型的 master-slave 主从结构
通过发现服务来选举manager 管理节点 各个节点上运行agent接受manager的统一管理
swarm v2中集群会通过raft协议分布式选举出manager节点,无需额外的发现服务,避免了单点瓶颈
swarm v2 中内置了基于dns的负载均衡和对外部负载均衡机制的集成支持
macvlan
macvlan本身是linux kernel 内核的模块 允许在物理网卡上添加多个mac地址,即多个interface 每个interface可以配置一个IP
macvlan其实是一种网卡虚拟化技术
# ip link set eno16777728 promisc on
打开网卡混杂模式(关键)(虚拟机设置也要开启)
# ip link show eno16777728
# docker network create -d macvlan --subnet=172.16.86.0/24 --gateway=172.16.86.1 -o parent=eno16777728 mac_net
在不同的host上建立相同网络 通过指定的interface互相通信
1、-d macvlan 指定网络驱动
2、macvlan是local网络,为保证相互通信必须要用户自己管理IP subnet
3、docker 不会为macvlan创建网关,这里的网关应该是真实存在的
4、-o parent 指定使用的网络interface
- macvlan 不依赖 linux bridge 容器的网卡通过macvlan虚拟出来的interface
容器的interface接口直接与物理机连接 在网络上与其他主机没有区别
macvlan 会独占主机的网卡,也就是说一个网卡只能创建一个 macvlan 网络,macvlan也可以连接到sub-interface
不同 macvlan 网络不能 在二层上 通信。在三层上可以通过网关将 macvlan 连通
macvlan 网络的连通和隔离完全依赖 VLAN、IP subnet 和路由,docker 本身不做任何限制,用户可以像管理传统VLAN 网络那样管理 macvlan
flannet
flannet 是由CoreOS开发 flannet为每一个host主机分配一个subnet 容器从subnet 中分配ip 这些ip可以在主机之间路由
flannel 会在每个主机上运行一个叫 flanneld 的 agent,其职责就是从池子中分配 subnet。为了在各个主机间共享信息,flannel 用 etcd(与 consul 类似的 key-value 分布式数据库)存放网络配置、已分配的 subnet、host 的 IP 等信息
数据包如何在主机间转发是由 backend 实现的。flannel 提供了多种 backend,最常用的有 vxlan 和 host-gw
weave
weave 创建的虚拟网络可以将部署在不同host上的容器连接起来 weave 的dns模块还支持 容器之间 hostname 访问
weave 不依赖分布式数据库交换网络信息 每个主机上都只需运行weave 组件就能建立容器跨主机网络
# curl -L git.io/weave -o /usr/local/bin/weave
下载脚本
# chmod a+x /usr/local/bin/weave
赋权
# weave launch
运行脚本 启动weave服务 容器化
- weave主程序建立网络、收发数据、提供dns
- weaveplugin network driver
- weaveproxy 代理 启动容器时将容器添加到weave网络
# docker network ls
weave会创建一个weave网络
weave 网络包含两个虚拟交换机:Linux bridge weave 和 Open vSwitch datapath,veth pair vethwe-bridge 和 vethwe-datapath 将二者连接在一起。weave 和 datapath 分工不同,weave 负责将容器接入 weave 网络,datapath 负责在主机间 VxLAN 隧道中并收发数据。
网络模型
跨主机网络意味着将不同网络上的容器用同一个虚拟网络连接起来
- docker overlay 在主机之间建立VxLAN隧道,原始数据包在发送端被封装成VxLAN数据包,到达目的后接受端解包
- macvlan 在二层上通过VLAN连接容器,在三层上依赖外部网关连接不同macvlan 数据包直接发送,underlay网络
- flannel 两种backend vxlan与docker overlay类似,属于overlay网络 host-gw 将主机作为网关,依赖三层IP转发,不需要进行包封装,underlay网络
- weave 是VxLAN的实现,属于overlay网络
IP管理
- docker overlay 网络中所有主机共享同一个sybnet,容器启动时会顺序分配,可以通过—subnet指定
- macvlan 需要用户自己管理subnet,为容器分配ip,不同sybnet 通信依赖外部网关
- flannet 为每个主机自动分配独立的subnet,不同subnet之间的路由信息也由flannel自动生成和配置
- weave 的默认配置下所有容器使用 10.32.0.0/12 subnet 可以通过--ipalloc-range 分配特定的subnet
连通和隔离
- 同一docker overlay 网络中的容器可以通信,但不同网络之间无法通信,要实现跨网络访问,只有将容器加入多个网络。与外网通信可以通过docker_gwbridge网络
- macvlan 网络的连通或隔离完全取决于二层vlan和三层路由
不同flannel网络中的容器直接就可以通信,没有隔离,与外网通信可以通过bridge网络- weave 默认配置下所有容器在一个大的subnet中,可以自由通信,如果要实现隔离,需要为容器指定不同的subnet或ip。与外网通信 将主机加入到weave网络,并把主机当作网关
性能
- underlay网络性能优于overlay网络
- overlay网络利用隧道技术,将数据包封装到UDP中进行传输。因为涉及数据包的封装解封,存在额外的cpu和网络开销
- overlay较underlay可以支持更多的二层网络,更好的利用已有网络,以及有效的避免物理交换机MAC表耗尽等优势
网友评论