1. Devops/

管理集群服务网络

·243 字·2 分钟· loading
docker devops
demo007x
作者
demo007x

管理集群服务网络
#

集群的通信类型
#

Docker集群产生两种不同类型的流量:

  • 控制和管理通信流量:这包括集群管理消息,例如请求加入或离开集群。此通信始终是加密的。
  • 应用程序数据平面流量:这包括容器流量和往返外部客户端的流量。

关键网络概念
#

以下三个网络概念对集群服务很重要:

  • Overlay network:管理参与集群的Docker守护进程之间的通信。我们可以创建Overlay网络,就像独立容器的用户定义网络一样。也可以将服务附加到一个或多个现有的Overlay网络中,以启用服务到服务的通信。overlay网络是使用overlay网络驱动程序的Docker网络。

  • ingress network:是一个特殊的overlay网络,可促进服务节点之间的负载平衡。当任何群节点在已发布的端口上收到请求时,它会将该请求交给一个名为IPVS的模块。IPVS跟踪参与该服务的所有IP地址,选择其中一个,并将请求路由到它就是通过ingress网络。

    当初始化或加入蜂群时,会自动创建ingress网络。大多数用户不需要自定义其配置,但Docker允许我们自己使用网络配置。

  • docker_gwbridge:是一个桥接网络,将Overlay网络(包括ingress网络)连接到单个Docker守护进程的物理网络。默认情况下,服务运行的每个容器都连接到其本地Docker守护进程主机的docker_gwbridge网络。

    当初始化或加入集群时,会自动创建docker_gwbridge网络。大多数用户不需要自定义其配置,但我们也可以使用自定义配置 s。

防火墙注意事项
#

参与蜂群的Docker守护进程需要通过以下端口相互通信的能力:

  • Port 7946 TCP/UDP 容器网络发现能力.
  • Port 4789 UDP (configurable)

TODO: 在蜂群中建立网络时,应特别小心。有关概述,请参阅 教程

创建一个overlay网络
#

要创建overlay 网络,请在使用docker network create命令时指定overlay驱动程序:

 docker network create \
  --driver overlay \
  my-network

上述命令没有指定任何自定义选项,因此Docker分配了一个子网并使用默认选项。我们可以使用docker network inspect查看有关网络的信息。

 docker network inspect my-network

在上述输出中,请注意驱动程序是overlay的,范围是swarm,而不是在其他类型的Docker网络中看到的localhostglobal范围。此范围表明,只有参与蜂群的主机才能访问此网络。

当服务首次连接到网络时,网络的子网和网关是动态配置的。以下示例显示了与上述相同的网络,但与redis服务的三个容器相连。

 docker network inspect my-network

自定义网络
#

在某些情况下,我们可能不想使用overlay网络的默认配置。我们可以执行命令 docker network create --help 查看有关配置选项的完整列表,以下是一些最常见的选项。

配置子网和网关
#

默认情况下,当第一个服务连接到网络时,网络的子网和网关会自动配置。我们可以使用--subnet--gateway标志创建网络时配置这些。以下示例通过配置子网和网关。

 docker network create \
  --driver overlay \
  --subnet 10.0.9.0/24 \
  --gateway 10.0.9.99 \
  my-network
使用自定义默认地址池
#

要为您的Swarm网络自定义子网分配,您可以选择在swarm init期间配置。

例如,在初始化Swarm时使用以下命令:

 docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool-mask-length 26

每当用户创建网络,但不使用--subnet命令行选项时,该网络的子网将从池中的下一个可用子网中按顺序分配。如果指定的网络已经分配,则该网络将不会用于Swarm。

如果需要不连续的地址空间,可以配置多个池。但是,不支持从特定池进行分配。网络子网将从IP池空间中按顺序分配,子网将从已删除的网络中删除时重复使用。

默认的掩码长度可以配置,并且对所有网络都是一样的。默认情况下,它被设置为/24。要更改默认子网掩码长度,请使用--default-addr-pool-mask-length命令行选项。

注意:默认地址池只能在swarm init上配置,在集群创建后无法更改。

覆盖网络大小限制
#

Docker建议使用/24块创建overlay网络。/24overlay网络块将网络限制为256个IP地址。

配置应用程序数据的加密
#

默认情况下,群节点之间的应用程序数据不会加密。要在给定的覆盖网络上加密此流量,请使用--opt encrypted标志 network create。这在vxlan级别启用了IPSEC加密。这种加密施加了不可忽视的性能损失,因此您应该在生产中使用之前需要测试此选项,酌情使用。

将服务附加到overlay网络
#

要将服务附加到现有的overlay网络,请将--network选项传递给docker service create,或将--network-add标志传递给docker service update。比如下面的命令:

 docker service create \
  --replicas 3 \
  --name my-web \
  --network my-network \
  nginx

连接到overlay网络的服务容器可以通过他相互通信。

要查看服务连接到哪个网络,请使用docker service ls查找服务名称,然后使用docker service ps <service-name>列出网络。或者,要查看哪些服务的容器连接到网络,请使用docker network inspect <network-name>。我们可以从任何加入群并处于running状态的群节点运行这些命令。

配置服务发现
#

服务发现是Docker用于将服务外部客户端的请求路由到单个群节点的机制,而客户端不需要知道有多少节点参与服务或其IP地址或端口。我们无需发布同一网络上服务之间使用的端口。例如,如果有一个WordPress服务将其数据存储在MySQL服务中,并且它们连接到相同的overlay网络,则无需将MySQL端口发布到客户端,只需将WordPress HTTP端口。

服务发现可以通过两种不同的方式工作:使用嵌入式DNS和虚拟IP(VIP)在第3层和第4层进行内部基于连接的负载平衡,或者使用DNS循环(DNSRR)在第7层进行外部和自定义的基于请求的负载平衡。我们可以为每项服务配置此选项。

  • 默认情况下,当我们将服务附加到网络并且该服务发布一个或多个端口时,Docker会为该服务分配一个虚拟IP(VIP),即客户端访问服务的“前端”。Docker保留服务中所有工作节点的列表,并在客户端和其中一个节点之间路由到请求。来自客户端的每个请求都可能被路由到不同的工作节点。

  • 如果我们将服务配置为使用DNS循环(DNSRR)服务发现,则没有一个虚拟IP。相反,Docker为服务设置DNS条目,以便服务名称的DNS查询返回IP地址列表,客户端直接连接到其中一个。

    我们在想要使用自己的负载均衡器(如HAProxy)的情况下,DNS循环非常有用。要将服务配置为使用DNSRR,请在创建新服务或更新现有服务时使用标志--endpoint-mode dnsrr

自定义ingress网络
#

大多数用户从不需要配置ingress网络,但是我们也可以使用自定义的配置。如果自动选择的子网与网络上已经存在的子网冲突,或者我们需要自定义其他低级网络设置(如MTU),这对我们很有帮助。

自定义ingress网络涉及删除和重新创建它。这通常是在群中创建任何服务之前完成的。如果我们有发布端口的现有服务,则需要先删除这些服务,然后才能删除ingress网络。

在没有ingress网络存在期间,不发布端口的现有服务继续运行,但负载不平衡。这会影响发布端口的服务,例如发布端口80的WordPress服务。

  1. 使用docker network inspect ingress命令检查ingress网络,并删除所有与其连接的容器服务。这些服务是发布端口的服务,例如发布80端口的WordPress服务。如果所有此类服务没有停止,下一步将失败。

  2. 使用下面的命令删除现有的ingress网络:

     docker network rm ingress
    
  3. 使用--ingress标志以及要设置的自定义选项创建一个新的覆盖网络。下面的示例将MTU设置为1200,将子网设置为10.11.0.0/16,并将网关设置为10.11.0.2

     docker network create \
      --driver overlay \
      --ingress \
      --subnet=10.11.0.0/16 \
      --gateway=10.11.0.2 \
      --opt com.docker.network.driver.mtu=1200 \
      my-ingress
    

    注意:您可以将ingress网络命名为ingress以外的其他东西,但您只能有一个。尝试创建第二个失败。

  4. 重新启动我们在第一步中停止的服务。

自定义docker_gwbridge
#

docker_gwbridge是一个虚拟桥,将overlay网络(包括ingress网络)连接到单个Docker守护进程的物理网络。当我们在初始化集群或将Docker主机加入蜂群时,Docker会自动创建它,但它不是Docker设备。它存在于Docker主机的内核中。如果您需要自定义其设置,您必须在将Docker主机加入集群之前或暂时将主机从集群中移除后进行自定义配置。

我们需要在操作系统上安装brctl应用程序才能删除现有网桥。软件包名称是bridge-utils

  1. 停止Docker。

  2. 使用brctl show docker_gwbridge命令检查是否存在名为docker_gwbridge的桥接设备。如果是这样,请使用brctl delbr docker_gwbridge删除它。

  3. 启动Docker。不要加入或初始化集群。

  4. 使用我们的自定义设置创建或重新创建docker_gwbridge网桥。此示例使用子网10.11.0.0/16

     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. 初始化或加入集群。

使用单独的界面进行控制数据流量
#

默认情况下,所有集群流量都通过同一接口发送,包括用于维护群本身的控制和管理流量以及进出服务容器的数据流量。

我们可以在初始化或加入集群时通过传递--data-path-addr选项来分离此流量。如果有多个接口,则必须明确指定--advertise-addr,如果未指定,则--data-path-addr默认为--advertise-addr。有关加入、离开和管理群的流量通过--advertise-addr接口发送,服务容器之间的流量通过--data-path-addr接口发送。这些选项表示可以采用IP地址或网络设备名称,例如eth0

此示例使用单独的--data-path-addr初始化一个群。它假设您的Docker主机有两个不同的网络接口:

  • 10.0.0.1应用于控制和管理流量

  • 192.168.0.1应用于与服务相关的流量。

 docker swarm init --advertise-addr 10.0.0.1 --data-path-addr 192.168.0.1

此示例加入了由主机192.168.99.100:2377管理的群,并将--advertise-addr标志设置为eth0,将--data-path-addr标志设置为eth1

 docker swarm join \
  --token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2d7c \
  --advertise-addr eth0 \
  --data-path-addr eth1 \
  192.168.99.100:2377

Related

锁定集群以保护加密文件
docker devops
锁定集群以保护加密文件
使用Docker secret 管理敏感数据
docker devops
使用Docker secret 管理敏感数据
使用Docker config 存储数据
docker devops
使用Docker config 存储数据