一、overlay
vxlan底层技术,vxlan有一个功能,他把二层的数据封装到udp里传输,跟connet有点相似,通过添加网卡的方式,内网一张网卡,外网一张网卡。
consul:数据中心的含义,可以将其当做数据库来理解,类似于Redis等非关系型数据库,采用的是键-值对的方式,存放着各个容器的IP及端口信息。
consul的功能很强大,可以以群集的方式运行,并且具备健康监测等功能。
需要有一个键值对,来保存我们的网络状态信息,比如:consul,etcd,zookeeper
1.环境部署
主机名 | IP地址 |
consul | 192.174.1.34 |
docker-host1 | 192.174.1.36 |
docker-hots2 | 192.174.1.38 |
2.下载镜像
docker search consul
docker pull progrium/consul
3.开启防火墙规则(每台都要做)
firewall-cmd --add-port={7946,4789,2733,2376}/tcp --permanent
firewall-cmd --add-port={7946,4789,2733,2376}/udp --permanent
firewall-cmd --reload
4.启动consul容器
docker run -d --restart always -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul -server -bootstrap -ui-dir /ui
可能会报如下错误,
原因是:docker服务启动时定义的自定义链docker由于某种原因被清掉
解决方法:重启docker
5.指定consul服务器
vim /etc/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
-H tcp://0.0.0.0:2376 --cluster-store=consul://192.174.1.24:8500 --cluster-advertise=ens33:2376 (指定consul位置)
查看网页
6.开启混杂模式
ifconfig ens33 promisc
7.创建overlay网络
docker network create -d overlay ov_net1
docker network ls
docker network inspect ov_net1
8.在两个节点闯将以overlay网络生成的容器,验证网络
docker run -dit --name test1 --network ov_net1 busybox
docker run -dit --name test2 --network ov_net1 busybox
验证结果:
二、macvxlan
Docker跨主机访问,可以使用部署consul服务来实现docker容器之间跨主机通信,也可以使用MacVlan网络来实现。
MacVlan工作原理:
MacVlan是Linux内核支持的网络接口。要求的Linux内部版本是v3.9-3.19和4.0+。
通过物理网卡创建MacVlan子接口,允许一块物理网卡拥有多个独立的MAC地址和IP地址。虚拟的子接口将直接暴露在相邻物理网络中。
当发送包时。物理网卡收到包后,会根据收到包的目的MAC地址判断这个包需要交给哪个其中的虚拟网卡。
本质上首先时宿主机物理网卡工作在“混杂模式”,这样物理网卡的MAC地址将会失效,所有二层网络中的流量物理网卡都能收到。接下来就是在这张物理网卡上创建虚拟网卡,并为虚拟网卡指定MAC地址,实现一卡多用,在物理网络看来,每张虚拟网卡都是一个单独的接口。
使用MacVlan需要注意的:
- 在使用MacVlan网络时,网络性能的问题,因为物理网卡中接入的主机变多,广播包占用比快速升高而引起的网络性能下降问题。
- 网卡需要工作在“混杂模式”下。
- 工作在“混杂模式”,物理网卡的MAC地址会失效,所以,运行的容器并不能与外网进行通信。
- 总体来说,bridge和overlay网络是更好的选择,因为虚拟网络应该与物理网络隔离而不是共享。
部署:
1.环境需求:
主机名 | ip地址 |
node1 | 192.174.1.40 |
node2 | 192.174.1.41 |
2.打开网卡混杂模式
ip link set ens33 promisc on
3.node1创建macvlan网络
docker network create -d macvlan --subnet 100.1.1.0/24 --gateway 100.1.1.1 -o parent=ens33 mac_net1 (两台节点应该是一样的属于同一个网络)
4.创建容器
docker run -dit --name box1 --ip 100.1.1.2 --network mac_net1 busybox
docker run -dit --name box2 --ip 100.1.1.4 --network mac_net1 busybox
5.结果验证:
三、基于machine搭建overlay
1.下载consul
docker pull progrium/consul
2.创建容器
docker run -d --restart always -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h node1 progrium/consul -server -bootstrap -ui-dir /ui
3.开启混杂模式:
ifconfig ens33 promisc
4.修改节点配置文件
vim /etc/systemd/system/docker.service.d/10-machine.conf
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver overlay2 --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic --cluster-store=consul://192.174.1.34:8500 --cluster-advertise=ens33:2376
Environment=
5.重新加载配置文件
systemctl daemon-reload
Systemctl restart docker
查看网页:
6.创建网卡
docker network create -d overlay ov_net1
7.运行容器
docker run -itd --name bbox1 --network ov_net1 busybox
docker run -itd --name bbox2 --network ov_net1 busybox
8.验证结果