docker网络模式之 overlay模式

         Overlay网络模式,在多个docker daemon 主机之间穿件一个分布式的网络,该网络(overlay)位于docker主机层次之上,允许容器(同一集群服务的容器)之间加密通讯,因此,docker需要处理每一个主机(docker daemon)和每个分布的容器之间的包路由。

      每当初始化一个集群或者添加一个docker主机到集群时,则在该主机上创建两个网络,

             一个称为覆盖网络的ingress,该网络处理集群服务间的控制和数据信息。当创建一个集群服务、但未指定用户自定义网络时,该服务上的节点默认连接到ingree网络。

            一个桥接网络(docker_gwbridge),该网络,连接单个主机的守护进程(docker daemon)与其他主机的守护进程,参与集群服务。

        覆盖网络(ovlerlay network)的创建,与 用户自定义网络(used-defined nework)创建方式一直,采用指令 docker network create.  服务和容器,可同时连接多个网络,服务或者容器他们之间通讯的通讯前提是,他们都连接在同一个网络上。

docker network create -d overlay my-overlay

     尽管我们可以使用覆盖网络(overlay network)连接集群服务的容器,和单个独立的容器,但是,针对这两种不同的容器,默认的行为和配置关注点是不同的。下面分布介绍集群服务下、独立容器下的不同的操作过程。

  一、overlay netwrok 操作

预备知识:

      集群服务,主机网关规则,(集群服务下,各主机的网关应该处于关闭状态)

     覆盖网络下,各主机之间的部分端口需要开发,保证各主机将的通讯的畅通。

            2377 tcp端口,集群管理通讯

           tcp  和 udp端口 7496 结点间的通讯

            UDP端口 4789 覆盖网的流量交互(例如密钥交互等)

   创建覆盖网络(overlay network)的之前,必须调用 docker swarm init 将当前的docker 主机初始化成一个管理结点,或者将当前主机 通过  docker swarm join 添加到一个已存在的集群中,上述两操作 都会使得 集群服务默认创建 覆盖网络 ingress.  即使不从不打算使用集群服务,他们都会默认执行这些操作(默认创建一个覆盖网络ingress)。后续,我们可用创建自动定义的覆盖网络。 查看当前网络。

[root@localhost hadoop]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
722e7f4ef7f3        bridge              bridge              local
44f25836fb69        docker_gwbridge     bridge              local
168341f8d4c7        host                host                local
ijcf9vo1wn50        ingress             overlay             swarm
39aff7551ffa        my-net              bridge              local
5f7c097a7d11        none                null                local
[root@localhost hadoop]# 

1.1 创建 overlay network 

创建一个覆盖网络

[root@localhost hadoop]# docker network create -d overlay  my-overlay 
xbqlms0g39gknsebdxowdjetk

  如果需要创建一个,允许集群服务间的容器交互连接或者独立的容器之间能够连接,需要加 标记 --attachable

[root@localhost hadoop]# docker network create -d overlay --attachable my-overlay 

其他参数,例如IP地址变化,子网地址,网关等参数可 调用 docker network create --help 查看

[root@localhost hadoop]# docker network create --help

Usage:  docker network create [OPTIONS] NETWORK

Create a network

Options:
      --attachable           Enable manual container attachment
      --aux-address map      Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
      --config-from string   The network from which copying the configuration
      --config-only          Create a configuration only network
  -d, --driver string        Driver to manage the Network (default "bridge")
      --gateway strings      IPv4 or IPv6 Gateway for the master subnet
      --ingress              Create swarm routing-mesh network
      --internal             Restrict external access to the network
      --ip-range strings     Allocate container ip from a sub-range
      --ipam-driver string   IP Address Management Driver (default "default")
      --ipam-opt map         Set IPAM driver specific options (default map[])
      --ipv6                 Enable IPv6 networking
      --label list           Set metadata on a network
  -o, --opt map              Set driver specific options (default map[])
      --scope string         Control the network's scope
      --subnet strings       Subnet in CIDR format that represents a network segment
[root@localhost hadoop]# 

 

1.2 覆盖网络(overlay network)的加密通讯配置

     所有docker 集群服务的流量管理默认采用加密传输,加密算法使用ACE算法,使用最大公约数模式(GCM Mode), 集群服务中的管理结点每12个小时,更新一次密钥。

    启动加密,仅需要在创建网络是,添加  --opt encrypted 选项配置即可,这在虚拟扩展局域网层启用安全协议,这种加密带来不可忽视的性能损失。因此,在适用于生产之前,必须进行测试,

   当启动覆盖加密时,docker在每个工作结点之间创建 网络通道。通道使用在 GCM模式上使用ACE算法,并且每12个小时,旋转密钥(修改密钥)。

    注意:  目前window上暂不知此,覆盖加密网络,如果试图将一个window的工作结点,添加到一个覆盖加密网络,并不会报错,该是该节点无法通讯。

  2、 集群服务网络和独立容器

    一起使用 --opt encrypted  和 --atachable, 创建一个加密网络,连接未管理的容器

docker network create --opt encrypted --attachable -d overlay my-attachable-multi-host-network

2.1 自定义 覆盖网络 ingress network

  一般,用户在使用过程中,不需要配置 ingress网络,但是docker  17.05 或者更高版本,允许用户配置默认的ingress网络。一般修改的基本条件如下:

      1、自动配置的子网与与存在的某个网络存在冲突

      2、修改低级网络配置,例如MTU等。

   自定义 ingreess 网络,需要删除它,然后重新新建。而且,这一步必须要在集群服务创建之前完成。如果集群中有一个需要开放端口的服务,在删除 ingress服务之前,必须先删除该服务。

    在没有ingress 网络期间,那些不需要对外开放端口的服务仍然继续运行,但是无均衡负载。自定义覆盖网络 ingree 需要发布端口的服务,例如 依赖于开放端口80的 WordPress 服务。

  •   调用 docker network inspect ingress 查看该网络信息,停止运行于链接该网络容器上的需要开放端口的服务,例如开放端口为80的WorkPress服务,
  •  删除网络 ingress .  docker network rm ingress  如果上一次未执行,则该步骤将失败
[root@localhost hadoop]# docker network rm ingress
WARNING! Before removing the routing-mesh network, make sure all the nodes in your swarm run the same docker engine version. Otherwise, removal may not be effective and functionality of newly create ingress networks will be impaired.
Are you sure you want to continue? [y/N]
  • 使用参数 --ingress 新建一个信息的 覆盖网络,并修改配置
$ docker network create \
  --driver overlay \
  --ingress \
  --subnet=10.11.0.0/16 \
  --gateway=10.11.0.1 \
  --opt com.docker.network.driver.mtu=1500 \
  my-ingress

    可以修改 自己的ingress名称,但是只能新建一个该网络(--ingress)。

  • 重启之前停止的服务

2.2 修改默认的桥接网络  docker_gwbridge

  docker-gwbridge 是一个虚拟网桥,连接覆盖网络(overlay network ,包含 ingress网络)和docker主机的实际物理网络。当主机调用 docker swarm init 初始化集群服务,或者 docker swarm join 添加到一个集群时,docker主机自动创建该网桥,但是它不是一个docker的设备,存在于docker主机所在的内核上,如果需要配置该网桥参数,需要停止docker. 且在集群初始化前,或者添加到集群前,或者在主机迁出集群后,具体步骤如下:

   (1) stop docker

   (2)删除已经存在网桥接口   docker_gwbridge

             

$ sudo ip link set docker_gwbridge down

$ sudo ip link del dev docker_gwbridge

   (3) 启动docker  但,不要进行集群初始化,或者添加主机到集群

(4)调用 docker network create 手动新建虚拟网桥接口,并配置参数 ,

$ docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

  (5) 执行集群初始化,或者添加结点到集群,由于这里已经存储 网络接口docker_gwbridge。 因此无法自动创建。

2.3 集群服务操作

     1、 发布覆盖网端口

     集群中的所有容器之前的端口是全部公开的,但是对于端口需要公开,则需要使用参数  -p  或者  --publish 。一般在创建服务或者更新服务 调用指令  docker service create / docker service update 修改发布端口。同时支持冒号分割法,和逗号分割描述法。更长的语法是首选,因为它在某种程度上是自文档化的。

 

2、为集群服务绕过路由格网

          默认情况下,docker  集群服务使用路由格网发布端口,当连接集群服务已发布的端口时(无论是运行或者未运行服务的容器),请求都将被重定向到一个正在运行服务的工作结点。很明显地,Docker实际上扮演者集群服务的均衡负载器,采用路由格网运行服务,容器服务已虚拟IP模式运行。当使用标记  --global 使得服务运行于所有结点,其也是采用虚拟IP模式。当使用路由格网运行服务时,无法保存哪个结点处理客户端的请求。

       如需绕过路由格网,你可以在服务启动时,修改标记  --endpoint-mode 为 dnsrr , 使用dns轮训(DNSRR)模式,但是你必须在服务启动前,运行自己的均衡负载器, docker主机针对一个DNS查询(根据服务器名称)需要返回一个当前运行该具体服务所有结点的ip列表,配置此均衡负载器,并使用此列表平衡结点间的流量。

3、独立控制和数据流量

默认情况下,流量控制与同一网络下的集群管理和运行应用程序的容器间交互相关,虽然集群流量控制是加密的,但也可以通过配置docker,使得针对两种不同类型的流量使用不同网络接口,在节点初始化,或者加入集群时,分开指定参数 --advertise-addr 和 --datapath-addr ,但注意,集群中每个结点均需要指定这两参数。

2.4 独立容器间的覆盖网络操作

1、 关联独立容器到覆盖网络

        默认创建的ingress网络,不带有--attachable标记,因此,只有集群服务的节点才可以用它,独立的容器节点不能够被添加到该网络。独立的容器可添加到一个用户自定义的、带有--attachable的覆盖网络,这使得在不同Docker守护进程上运行的独立容器能够通信,而不需要在单个Docker守护进程主机上设置路由。

2、 发布端口

3、发现容器方法

  大多数情况下,首先必须连接到服务(通过服务名称),服务名称通常被用来均衡复杂各容器,以及作为容器的“任务"标示,在容器内运行。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值