Swarm Mode简介

Swarm Mode 是 Docker 1.12 版开始推出的新功能,它将 Docker Engine、Swarm 的集群管理和容器编排功能集成在一起,支持服务模型以及相应的扩容缩容、服务发现、滚动升级、路由和负载均衡等。

Swarm Mode关键术语

Node

Manager 节点用于cluster的管理,docker swarm子命令基本只能在manager节点执行。一个cluster可以有多个manager节点,但只有一个节点可以成为leader,leader选举通过raft协议实现。

Worker 节点负责执行task节点,manager将service下发至worker节点执行。Manager节点默认也作为worker节点。

Swarm Mode使用了Raft协议来保证多个Manager之间状态的一致性。基于Raft协议,Manager Node具有一定的容错功能,假设Swarm集群中有个N个Manager Node,那么整个集群可以容忍最多有(N-1)/2个节点失效。如果是一个三Manager Node的Swarm集群,则最多只能容忍一个Manager Node挂掉。

1
2
3
4
5
# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
lati2179dcwgkvvkc0qcieoim swarm-node2 Ready Active
pg6fteetxsezu2ygyd3b0joye * swarm-manager Ready Active Leader
y83k6khc3vxmch1qd3j8kl4ak swarm-node1 Ready Active

AVAILABILITY

  • Active:该Node可以被指派Task
  • Pause:该Node不可以被指派新的Task,但是其他已经存在的Task将保持运行
  • Drain:该Node不可以被指派新的Task,Swarm Scheduler停掉已经存在的Task,并将它们调度到可用的worker Node上

MANAGER STATUS

  • 空值:表示worker节点
  • Leader:表示主manager节点,负责swarm mode集群的管理和编排
  • Reachable: 表示manager节点并参与raft一致性算法的仲裁(如果leader不可用,该节点可被选举为新的leader)
  • Unavailable:表示该manager节点无法与其他manager节点进行交互(如果manager变成unavailable,必须加入新的manager节点到swarm mode集群或者将worker节点提升为manager)

Service && Task

Task是swarm中的最小原子调度单位;Services是指一组task的集合。

目前,services有两种模式:(通过--mode参数进行指定)

  • replicated:(默认模式)在worker node上运行指定个数的task;
  • global:在每个woker node上运行task,新加入的worker node也会自动运行。

service network

  • docker_gwbridge:bridge网络(172.18.0.2/16),初始化或加入swarm集群时将会在宿主机自动创建docker_gwbridge网卡并连接到容器的docker_gwbridge网络,使用overlay网络的容器默认会自动分配一个网卡连接到该网络(IP地址一致),用于容器与外部网络通信。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # ip add show docker_gwbridge
    8: docker_gwbridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:c7:89:29:42 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global docker_gwbridge
    valid_lft forever preferred_lft forever
    inet6 fe80::42:c7ff:fe89:2942/64 scope link
    valid_lft forever preferred_lft forever
    # docker network ls -f name=docker_gwbridge
    NETWORK ID NAME DRIVER SCOPE
    d4a764a07d6c docker_gwbridge bridge local
    # docker network inspect docker_gwbridge -f "{{with index .Containers \"ingress-sbox\"}}{{.IPv4Address}}{{end}}"
    172.18.0.2/16
  • ingress: 基于vxlan的特殊overlay网络(10.255.0.0/16),用于帮助服务节点之间的负载均衡(基于ipvs的四层代理),初始化或加入swarm集群时自动创建,当service设置端口映射时,swarm会为Service中的每个容器另外分配一块网卡,连接到docker_gwbridge网络。

    1
    2
    3
    4
    5
    # docker network ls -f name=ingress
    NETWORK ID NAME DRIVER SCOPE
    i6xug49nwdsx ingress overlay swarm
    # docker network inspect ingress -f "{{with index .Containers \"ingress-sbox\"}}{{.IPv4Address}}{{end}}"
    10.255.0.2/16

service discovery

Swarm Mode提供了基于DNS的服务发现机制,每个worker节点上都内置了DNS Server,会为每个连接到自定义网络的service提供DNS解析。Swarm Mode会为Service分配一个VIP(Virtual IP),并在内部DNS上建立一条VIP与service-name的映射记录。在每个容器的 network sandbox 中会配置相应的iptables规则和ipvs,同一个网络中每增加一个服务,会相应添加对应的iptables和ipvs规则,从而使得服务在整个网络内可访问。

Load balancing

internal load balancing

用于集群中容器之间的交互,其中可分为如下两种模式(通过endpoint-mode参数指定)

  • vip(ipvs):当service映射端口时swarm默认自动为其分配一个VIP,作为front end提供客户端进行访问;
  • dnsrr(DNS round-robin):通过--endpoint-mode=dnsrr参数进行指定,swarm将为service配置一个DNS,并解析到对应的IP,客户端可直接通过IP进行访问。
    设置了dnsrr的network不能再设置published port,即不能加入ingress network

    客户端容器通过service域名访问相应服务,节点docker的DNS server会round-robin各个后端容器的服务IP给Client container

ingress load balancing(routing mesh)

Swarm Manager通过暴露服务的端口提供给外部访问。

当创建服务时指定了--publish <TARGET-PORT>:[SERVICE-PORT]参数做端口映射后(未指定TARGET-PORT时将在30000~32767的范围内随机分配),如果swarm节点在暴露的端口上接收到请求时,ingress网络会将请求转发给IPVS,IPVS跟踪所有请求的IP,并将其路由到ingress网络。

坚持原创技术分享,您的支持将鼓励我继续创作!
0%