【docker系列】解决阿里云多主机服务器,docker overlay 跨主机网络通信环境

实现docker 容器跨主机互通。 推荐使用 overlay 网络类型。

什么是overlay网络

overlay网络驱动程序会在多个Docker守护进程主机之间创建一个分布式网络。这个网络位于特定于主机的网络之上,允许连接到它的容器(包括群集服务容器)安全地通信。Docker透明地处理每个包与正确的Docker守护进程主机和正确的目标容器之间的路由。

当你初始化一个群或加入一个Docker主机到一个现有的群,将在该Docker主机上创建两个新网络

  • 称为ingress的overlay网络,用于传递集群服务的控制或是数据消息,若在创建swarm服务时没有指定连接用户自定义的overlay网络,将会加入到默认的ingress网络。
  • 一个名为的桥接网络docker_gwbridge,它将各个Docker守护程序连接到该集群中的其他守护程序。

可以使用docker network create创建自定义的overlay网络,容器以及服务可以加入多个网络,只有同一网络中的容器可以相互交换信息,可以将单一容器或是swarm服务连接到overlay网络中。

环境:
华东二区(上海)二台为:11.11.11.11 和  11.11.11.22

华东一区(杭州)一台为:11.11.11.33

在 搭建 阿里云dcoker 跨主机通信前。已在物理机集群上使用 docker swarm + overlay 成功解决了跨主机访问的问题。 本以为直接在阿里云上,再搭一次,应该不会有什么问题。 可事与愿违,最终无法在 阿里云集群服务器上,搭建docker 跨主机互通。

然后各种找资料, 使用了 consul + overlay ,也无法互通。

最后终于找到答案:


阿里云售后工程师 :    您好,vpc网络不支持自建vxlan,跟底层有冲突。

不推荐您自建集群,一是难度很高花费时间很大,二是自建有很多兼容性问题。而且自建的容器集群没有阿里云容器服务官方技术支持,只能自己在网上找资料解决。
建议您考虑用阿里云提供的容器服务来搭建集群,容器服务本身是免费的,只是集群关联的云资源是付费的,您可以建个免费的集群,把现有的ECS加到集群的节点里面直接使用,省去了您搭建、调试集群的步骤。  


截图:
在这里插入图片描述

阿里员工 明确回答:vpc网络不支持的自建vxlan, 而docker overlay用了vxlan!

另外其他各大云服务器应该也是不行,有人测过腾讯云服务器也不行(这个我没验证!)。

docker swarm集群可以使用阿里云提供的容器服务(阿里云容器服务提供了docker swarm或k8s的集群服务),或者自己机房搭建!
至于自建k8s还没弄过暂时不清楚。

到此,我本以为,自建应该束手无策了。

但是,无意中,看到了阿里云一篇内网的 说明:
 

如果两台同地域的ECS实例之间需要传输数据,建议使用内网连接。云服务器ECS与云数据库、负载均衡以及对象存储之间也可以使用内网相互连接使用。

云服务器ECS内网间,非I/O优化的实例为千兆共享带宽,I/O优化的实例为万兆或25G共享带宽。由于是共享网络,因此无法保证带宽速度是不变的。

对于内网中的ECS实例:

  • ECS实例的网络类型、所属账号、地域、安全组等都会影响内网通信。具体信息,如下表所示。
     
    网络类型 所属账号 地域 安全组 如何实现内网互通
    VPC(同一VPC) 同一账号或不同账号 同一地域 同一安全组 默认互通,也可以实现安全组内网络隔离。详情请参见安全组内网络隔离
    不同安全组 安全组授权实现内网互通,详情请参见安全组应用案例
    VPC(不同VPC) 同一账号或不同账号 同一地域 不同安全组 通过高速通道实现网络互通,详情请参见使用场景
    不同地域
    经典网络 同一个账号 同一地域 同一安全组 默认互通。
    不同账号 同一地域 同一安全组或不同安全组 安全组授权实现内网互通,详情参见安全组应用案例
  • 专有网络的私网IP地址可以修改。具体操作,请参见修改私有IP地址。不能修改或更换经典网络类型的ECS实例的私网IP地址。
  • 您可以使用专有网络VPC的ClassicLink功能,使经典网络类型的ECS实例通过私网访问VPC网络内的云资源。详情请参见ClassicLink

以上说的很清楚。 同一个VPC、同一账号、同一地域、同一安全组、网络默认是互通的。 

也就是说,我至少有两台服务器,目前网络是互通的。 (即华东二区的),然后我就 尝试的,使用 consul + overlay ,来测试,这两台服务器上,的容器。能不能互相ping 通。 幸运的是。能正常ping通。  但是在 华东一区。肯定就不行了。 因此,我在华东二区上,又买了一台。 同时不再续费 华东一区的了。

接下来,详细说明。如果 搭建 consul+overlay 环境。

一、搭建consul 集群环境


 1、拉取 consul镜像并运行容器

[root@master /]# docker pull consul
Using default tag: latest
latest: Pulling from library/consul
Digest: sha256:a167e7222c84687c3e7f392f13b23d9f391cac80b6b839052e58617dab714805
Status: Image is up to date for consul:latest
docker.io/library/consul:latest
[root@master /]# docker run -dit \
--network host \
--privileged=true \
--restart=always  \
--hostname=master_consul \
--name=master-consul \
-v /etc/localtime:/etc/localtime \
-e CONSUL_BIND_INTERFACE=eth0 \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true}' \
consul:latest \
agent -server \
-bind=172.18.18.11 \
-advertise=11.11.11.11 \
-bootstrap-expect=3 -ui -node=master-consul \
-data-dir=/tmp/consul -client 0.0.0.0 

说明:
-e CONSUL_BIND_INTERFACE=eth0   使用 eth0 网卡
-bind=172.18.18.11  表示 bind 这个服务器的 内网ip地址。 即 网卡 eth0 的地址
-advertise=11.11.11.11  表示通告地址,使用的是 公网Ip

2、进入容器,加入集群

a、进入容器
docker exec -it master-consul  sh

b、 加入 consul 集群
consul join 11.11.11.11

3、剩余的两台 服务器,也是同样的步骤。

注: 11.11.11.22 和 11.11.11.33 都是 consul join 11.11.11.11 

二、创建 overlay 网络

# 创建 overlay 网卡,用于 集群服务的网卡设置(只需要在 master 节点上创建,从节点自然会获取)

docker network create --driver overlay  --subnet=20.0.0.0/24 --gateway=20.0.0.254 --attachable cluster-overlay-sub

三、使用nginx 做 consul 的负载均衡,

1、运行nginx 容器

docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.247 \
--privileged=true \
--restart=always  \
--name=keda-master-nginx \
--hostname=master_nginx \
-p 80:80 \
-p 443:443 \
-p 18500:8500 \
-v /usr/docker/software/nginx/html/:/usr/share/nginx/html/ \
-v /usr/docker/software/nginx/conf/:/etc/nginx/ \
-v /usr/docker/software/nginx/home/:/home/ \
-v /usr/docker/software/nginx/data/:/data/ \
-v /usr/docker/software/nginx/logs/:/var/log/nginx/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
nginx:latest

2、配置 nginx 的 upstream

#consul集群负载均衡
upstream consul {
     server 11.11.11.11:8500;
     server 11.11.11.22:8500;   
     server 11.11.11.33:8500;
}
#监听本机8500端口,转发到upstream consul下
server {
    listen 8510;
    location / {
       include /etc/nginx/conf.d/proxy.conf;  
       proxy_pass http://consul;
    }
}

四、更改 docker.service 配置

[root@master /]# vim /lib/systemd/system/docker.service 

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
#ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:12375 -H unix://var/run/docker.sock -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://11.11.11.11:18510 --cluster-advertise=172.18.18.11:12375  -H tcp://0.0.0.0:12375 -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes

# kill only the docker process, not all processes in the cgroup
KillMode=process

[Install]
WantedBy=multi-user.target

主要:
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://11.11.11.11:18510 --cluster-advertise=172.18.18.11:12375  -H tcp://0.0.0.0:12375 -H unix://var/run/docker.sock

--cluster-store=consul://11.11.11.11:18510 

表示:nginx的地址。 通过nginx 来负载 consul 集群

 --cluster-advertise=172.18.18.11:12375

表示:本机内网Ip地址+docker 通信端口 12375(默认是2375,尽量改成别的。不然容易被 攻击)

剩余的两台 服务器,也是同样的步骤。
 

五、重启 docker 

sudo systemctl daemon-reload & sudo systemctl restart docker

六、在三台服务器上,分别创建一个基于 overlay 网络的容器。 如之前的 “cluster-overlay-sub”


1、创建容器

master:

docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.3 \
--privileged=true \
--restart=always  \
--name=springCloud-master-eureka \
--hostname=master_eureka \
-v /usr/docker/springCloud/eureka-dockerfile/eureka/:/var/local/eureka/ \
-v /data/springCloud/eureka/:/data/springCloud/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-p 20000:9800 \
seowen/eureka:latest \


slave1:

docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.4 \
--privileged=true \
--restart=always  \
--name=springCloud-slave1-eureka \
--hostname=salve1_eureka \
-v /usr/docker/springCloud/eureka-dockerfile/eureka/:/var/local/eureka/ \
-v /data/springCloud/eureka/:/data/springCloud/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-p 20000:9800 \
seowen/eureka:latest \

slave2:

docker run -dit \
--net cluster-overlay-sub \
--ip 20.0.0.5 \
--privileged=true \
--restart=always  \
--name=springCloud-slave2-eureka \
--hostname=salve2_eureka \
-v /usr/docker/springCloud/eureka-dockerfile/eureka/:/var/local/eureka/ \
-v /data/springCloud/eureka/:/data/springCloud/ \
-v /etc/localtime:/etc/localtime \
-e TZ='Asia/Shanghai' \
-e LANG="en_US.UTF-8" \
-p 20000:9800 \
seowen/eureka:latest \

2、进入容器,ping 

[root@master opt]# clear
[root@master opt]# docker exec -it e03b31f2c8b6 bash
[root@master_eureka eureka]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1450
        inet 20.0.0.2  netmask 255.255.255.0  broadcast 20.0.0.255
        ether 02:42:14:00:00:02  txqueuelen 0  (Ethernet)
        RX packets 1110  bytes 81148 (79.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.2  netmask 255.255.0.0  broadcast 172.18.255.255
        ether 02:42:ac:12:00:02  txqueuelen 0  (Ethernet)
        RX packets 3181102  bytes 810628239 (773.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2869065  bytes 791404615 (754.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 31  bytes 2392 (2.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 31  bytes 2392 (2.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@master_eureka eureka]# ping 20.0.0.3
PING 20.0.0.3 (20.0.0.3) 56(84) bytes of data.
64 bytes from 20.0.0.3: icmp_seq=1 ttl=64 time=1003 ms
64 bytes from 20.0.0.3: icmp_seq=2 ttl=64 time=3.22 ms
64 bytes from 20.0.0.3: icmp_seq=3 ttl=64 time=1.79 ms
64 bytes from 20.0.0.3: icmp_seq=4 ttl=64 time=1.79 ms
64 bytes from 20.0.0.3: icmp_seq=5 ttl=64 time=1.77 ms
64 bytes from 20.0.0.3: icmp_seq=6 ttl=64 time=1.77 ms


3、查看 network 

[root@slave2 ~]# docker network inspect cluster-overlay-sub
[
    {
        "Name": "cluster-overlay-sub",
        "Id": "26db25278114e2cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxca1f2eddba1cf38add952b0",
        "Created": "2019-12-25T18:29:51.325915414+08:00",
        "Scope": "global",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "20.0.0.0/24",
                    "Gateway": "20.0.0.254"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "48f2da4eaa2c693939d6xxxxxxxxxxxxxxxxxxxxxxxxxxxx7c58669a4b464ad493f73": {
                "Name": "springCloud-slave2-eureka",
                "EndpointID": "2d2c68a17e0b27915e52xxxxxxxxxxxxxxxxxxxxxxxxxxx467f0eb1f7bda9",
                "MacAddress": "02:42:14:00:00:04",
                "IPv4Address": "20.0.0.4/24",
                "IPv6Address": ""
            },
            "ep-2b407f01d38b6cb1dc247xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa068040be6ded8": {
                "Name": "keda-master-nginx",
                "EndpointID": "2b407f01d38b6cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx68040be6ded8",
                "MacAddress": "02:42:14:00:00:f7",
                "IPv4Address": "20.0.0.247/24",
                "IPv6Address": ""
            },
     
            "ep-732b41808e90ce0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxe149c0eec41": {
                "Name": "springCloud-slave1-eureka",
                "EndpointID": "732b41808e90ce0xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx149c0eec41",
                "MacAddress": "02:42:14:00:00:03",
                "IPv4Address": "20.0.0.3/24",
                "IPv6Address": ""
            },
            "ep-7609e871f68fe5bc6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5e0573fc30d73f": {
                "Name": "springCloud-master-eureka",
                "EndpointID": "7609e871f68fe5bxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx573fc30d73f",
                "MacAddress": "02:42:14:00:00:02",
                "IPv4Address": "20.0.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]
[root@slave2 ~]#

至此,阿里云多主机,docker 容器跨主机网络通信,搭建完毕




 

发布了111 篇原创文章 · 获赞 28 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_42697074/article/details/103858196