Docker多主机网络
网络术语概念
二层交换技术:工作在OSI七层网络模型的第二层,通过MAC地址进行帧转发 三层交换技术:也称为IP交换技术,工作在OSI七层网络模型的第三层,通过IP地址进行包转发。它解决了局域网中网段规划之后,网段中子网必须依赖路由器进行管理的局面 网桥(Brideg):工作在OSI七层网络模型的第二层,根据MAC地址转发,类似于二层交换机。Linux网桥将不同的网络接口连接起来,连接的网络接口可以来自不同的局域网,网桥决定了接收的数据包是转发给同一个局域网内逐级还是别的网络上 VLAN(虚拟局域网):在物理网络(通常是路由器接口)基础上建立一个或多少逻辑子网,将一个大广播域切分成多个小的广播域。一个VLAN就是一个广播域,VLAN之间通信通过三层路由器或者交换机来完成。
Overlay Network
覆盖网络,在基础网络上叠加一种虚拟网络技术模式,该网络中的主机通过虚拟链路连接起来 Overlay网络有以下三种实现方式: VXLAN(Virtual Extensible Local Area Network,虚拟可扩展局域网),通过将物理服务器或虚拟机发出的数据包封装到UDP中,并使用物理网络的IP/MAC作为外层报文头进行封装,然后在IP网络上传输,到达目的地后由隧道端点解封装并将数据发送给目标物理服务器或虚拟机,扩展了大规模虚拟机网络通信。 由于VLAN Header头部限制长度是12bit,导致只能分配4095个VLAN,也就是4095个网段,在大规模虚拟网络。VXLAN标准定义Header限制长度24bit,可以支持1600万个VLAN,满足大规模虚拟机网络需求。 VXLAN有以下核心技术组成: NVE(Network Vritual Endpoint,网络虚拟端点):实现网络虚拟化功能。报文经过NVE封装转换后,NVE间就可基于三层基础网络建立二层虚拟化网络。 VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端点):封装在NVE中,用于VXLAN报文的封装和解封装。 VNI(VXLAN Network Identifier,VXLAN网络标识ID):类似于VLAN ID,用于区分VXLAN段,不同的VXLAN段不能直接二层
其他两种实现方式
NVGRE(Network Virtual using Generic Routing Encapsulation,使用GRE虚拟网络):与VXLAN不同的是,NVGRE没有采用标准传输协议(TCP/UDP),而是借助通用路由封装协议(GRE)。采用24bit标识二层网络分段,与VXLAN一样可以支持1600万个虚拟网络。 STT(Stateless Transport Tunneling,无状态传输隧道):模拟TCP数据格式进行封装,改造了TCP传输机制,不维护TCP状态信息。 Overlay Network 讲
Docker主机之间容器通信解决方案
桥接宿主机网络 端口映射 Docker网络驱动 - Overlay:基于VXLAN封装实现原生Overlay网络 - Macvlan: Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一个VLAN。容器接口直接连接Docker主机网卡接口,通过路由策略转发到另一台Docker主机 第三方网络项目 隧道方案 - Flannel:支持UPD和VXLAN封装传输方式 - Weave: 支持UDP(sleeve模式)和VXLAN(优先fastdp模式) - OpenSwitch: 支持VXLAN和GRE协议 路由方案 - CAlico: 支持BGP协议和IPIP隧道。每台宿主机作为虚拟路由,通过BGP谢谢实现不同主机容器间通信
部署前提
Docker通过overlay网络驱动程序支持多主机容器网络通信。 要想使用Docker原生Overlay网络,需要满足以下任意条件: Docker运行在Swarm模式 使用键值存储的Docker主机集群 我们这里演示第二种,需要满足以下条件: 1.集群中主机连接到键值存储,Docker支持Consul、Etcd和Zookeeper; 2.集群中主机运行一个Docker守护进程; 3.集群中主机必须具有唯一的主机名,因为键值存储使用主机名来标识集群成员; 4.集群中Linux主机内核版本3.12+,支持VXLAN数据包处理,否则可能无法通信。
部署
节点1 192.168.56.128 主机名 docker1 节点2 192.168.56.129主机名docker2
查看内核版本大于3.12即可
uname -r
安装只需要在一个节点安装即可(是一个命令直接可以使用)
wget https://releases.hashicorp.com/consul/0.9.2/consul_0.9.2_linux_amd64.zip unzip consul_0.9.2_linux_amd64.zip mv consul /usr/bin/consul && chmod +x /usr/bin/consul
启动
nohup consul agent -server -bootstrap -ui -data-dir /var/lib/consul -client=192.168.56.128 -bind=192.168.56.128 &>/var/log/consul.log &
日志跟踪
tail -f /var/log/consul.log
节点配置守护进程连接consul
vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --cluster-store consul://192.168.56.128:8500 --cluster-advertise 192.168.56.128:2375
访问consul的web页面 http://192.168.56.128:8500
重启docker 修改了配置文件需要加载一下在重启
systemctl daemon-reload service docker restart
修改节点2的配置
/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 --cluster-store consul://192.168.56.128:8500 --cluster-advertise 192.168.56.129:2375
重启docker
PS:如果节点加入到swarm模式需要删除
docker swarm leave
查看
节点2上创建overlay网络
docker network create -d overlay multi_host
在节点1再次创建会报错,网络已经同步了
Error response from daemon: network with name multi_host already exists
查看网络
docker network ls
查看网络属性信息
network inspect dc4cc9130f97
[ { "Name": "multi_host", "Id": "dc4cc9130f971707d833450e87d93433029b97fcc0541bfbf7ae15a4db8293a5", "Created": "2018-12-21T18:22:05.983865969+08:00", "Scope": "global", "Driver": "overlay", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "10.0.0.0/24", "Gateway": "10.0.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]
测试互通
节点1创建容器指定overlay网络
docker run -it --net=multi_host busybox
节点2创建
正常可以ping通 本次测试没有通
Overlay工作流程
安装查看桥接的工具
apt-get install bridge-utils
使用命令查看
brctl show
命名空间管理overlay网络
ln -s /var/run/docker/netns/ /var/run/netns
启动的容器busybox不退出另外打开一个终端输入命令ip netns ls
带-的是创建overlay网络时候创建的网络
显示的IP和容器内是完全一样的