多节点之间docker互联

夙愿已清 提交于 2020-01-08 19:37:10

多节点之间docker互联

docker原生态overlay模式

  • 内置跨主机的网络通信实现思路无非有两种二层VLAN网络Overlay网络
    • 二层VLAN网络解决跨主机通信的思路是把原先的网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信。(优点:传输效率比overlay高,缺点:vlan端口有限,通用性和灵活性欠缺)
    • Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。能够充分利用成熟的IP路由协议进程数据分发;在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。

      网卡设备

      ```
      Container eth0:eth0它是Overlay网络分配的唯一的IP地址,它是veth pair虚拟设备对,作用是实现点对点的通信,通过桥接到br0这个网桥中,可以实现不同 NameSwitch之间容器进行通信。

br0:它是Overlay默认创建的网桥。

VETP:对VXLAN数据包的封装与街封装。

Container eth1:eth1是容器主机的默认网络,主要提供容器访问外网所提供的服务,走的默认docker网络架构,只不过他创建了docker_gwbridge这个网桥。

docker_gwbridge:docker_gwbridge是容器所创建的网桥它替代了docker0的服务。

eth0:真机网卡与外界网卡连接得真机网卡,它用来转发,容器VXLAN与NAT两种网卡类型的数据包到指定的对端节点。

#### 发送数据包流程
容器Container1 发送数据包 到容器 Container2。

- 容器Container1会通过Container eth0 将这个数据包发送到 10.0.0.1 的网关。
- 网关将数据包发送出去后到达br0网桥。
- br0网桥针对VXLAN设备,主要用于捕获对外的数据包通过VETP进行数据包封装。
- 封装好将VXLAN格式数据包交给eth0,通过UDP方式交给Container2的eth0。
- Container2收到数据包后通过VETP将数据包解封装。
- 网桥通过网关将解封装的数据包转发给Container eth0,完毕通信

![发送数据包流程](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314164934.png)

### 多节点直接docker互联
#### 节点准备
hostname|ip
--|:--:|
node103|192.168.44.103
node104|192.168.44.104

#### 准备 overlay 环境

为支持容器跨主机通信,Docker 提供了 overlay driver。Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的 key-vlaue 软件,我们这里使用 Consul。(Etcd后续再补充)

- 在node103上面部署consul,命令如下:

docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap

容器启动后,可以通过:http:192.168.44.103:8500访问,如图:
![consul](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314165625.png)

- 分别在node103和node104上面修改docker.service的启动命令

vi /usr/lib/systemd/system/docker.service

在ExecStart一栏添加:

ExecStart=/usr/bin/dockerd-current -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://192.168.44.103:8500 --cluster-advertise=ens33:2376 - **注:node103和node104的--cluster-store的配置路径相同,都是192.168.44.103:8500**
--cluster-store 指定 consul 的地址。
--cluster-advertise 告知 consul 自己的连接地址。

![docker.service](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314170044.png)

- 在node103和node104上重启docker

systemctl daemon-reload

systemctl restart docker

- **注:node103重启服务之后,需要重新run consul服务**

此时,查看node103:8500 能够看到两个节点的信息

![consul](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314170550.png)


#### 启动服务
- 创建overlay网络

[root@node104 ~]# docker network create -d overlay ov_net1

![](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314171231.png)
- 注:docker network create -d overlay ov_net1 --subnet 10.10.10.0/24 (指定子网),这里默认是10.0.0.0

![](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314171553.png)
- 在node103和node104上面各启动一个centos:7.5.1804的服务

[root@node103 ~]# docker run -itd --privileged --name node2 --hostname node2 --net ov_net1 --rm big_computing /usr/sbin/init
root@node104 ~]# docker run -itd --privileged --name node1 --hostname node1 --net ov_net1 --rm big_computing /usr/sbin/init

- 进入node104上面的容器node1(10.0.0.2)

[root@node104 ~]# docker exec -it node1 /bin/bash

- ping node103上面的容器node2(10.0.0.3)

![](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314171059.png)

***同样的方法进去node2,也能够ping通node1***

![](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314171632.png)


#### 容器中安装htcondor(这一部分与docker的overlay无关)
- 选定node103上面的node2为主节点,修改/etc/condor/condor_config
![](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314173311.png)

同时,修改condor_config中添加:
ALLOW_WRITE =
ALLOW_READ =

- 修改node1上面的/etc/condor/condor_config
![](https://raw.githubusercontent.com/ThinkBlue1991/Images1991/master/img/20190314173212.png)

同时,修改condor_config中添加:
ALLOW_WRITE =
ALLOW_READ =

```

  • 查看htcondor的status

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!