一、什么是 swarm ?
Docker Engine 内嵌集群管理和编排功能,由 swarmkit 构建。Swarmkit是一个独立项目,实现了Docker的编排层,在Docker中直接使用。
一个 swarm 由多个运行在 Swarm mode 的Docker主机组成。Docker主机可以是manager(管理成员资格和委派),或worker,或both。
创建服务时,需要定义状态:副本的数量
、可用的网络和存储资源
、服务的外部发布端口
等。Docker将维持该状态。例如,如果某worker节点不可用,Docker会将该节点的任务安排到其他节点。任务是一个正在运行的容器,它是swarm service的一部分,由swarm manager管理,但不是一个独立容器。
swarm services 相对于独立容器的一大关键优势是,可以修改服务配置而不需要重启服务,甚至是网络和存储卷。Docker会更新配置,停止过期任务,创建新任务。
当Docker在Swarm模式下运行时,该主机仍然可以运行独立容器。独立容器和swarm service之间的一个关键区别是,只有swarm manager才能管理 swarm,而独立容器可以在任何守护进程上启动。Docker守护进程可以作为manager、worker或both。
Docker Compose 可以定义和运行容器,也可以定义和运行Swarm service stacks。
Docker swarm services相关概念:nodes, services, tasks, and load balancing。
二、创建一个 swarm 集群
Docker 默认 disable swarm mode。有两种方式运行于 swarm mode:
- 创建一个 swarm
docker swarm init
- 加入一个 swarm
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.99.100:2377
添加一个 manager,运行 docker swarm join-token manage
。
通过 docker info
查看集群状态,docker node ls
查看节点信息。
高级配置1:自定义 ip 地址池
swarm 默认使用 10.0.0.0/8
作为ip地址池。
docker swarm init --default-addr-pool <IP range in CIDR> [--default-addr-pool <IP range in CIDR> --default-addr-pool-mask-length <CIDR value>]
docker swarm init --default-addr-pool 10.20.0.0/16
docker swarm init --default-addr-pool 10.20.0.0/16 --default-addr-pool 10.30.0.0/16 --default-addr-pool-mask-length 26
高级配置2:自定义 advertise address
advertise address 即 manager 地址,默认 2377 端口。
docker swarm init --advertise-addr <MANAGER-IP>
三、服务编排
1.、部署服务
部署服务需要在 manager node 执行。
docker service create --replicas 1 --name helloworld alpine ping docker.com
docker service ls
docker service ps helloworld
docker service inspect --pretty helloworld
2、横向扩容
docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>
docker service scale helloworld=5
3、删除服务
docker service rm helloworld
4、滚动升级
docker service create \
--replicas 3 \
--name redis \
--update-delay 10s \
redis:3.0.6
docker service inspect --pretty redis
docker service update --image redis:3.0.7 redis
docker service update redis
5、卸载节点
docker node update --availability drain worker1
docker node update --availability active worker1
docker node inspect --pretty worker1
6、Swarm mode routing mesh
Swarm 可以轻松发布服务端口,使其可以被Swarm之外的资源访问。
所有节点都会加入 ingress routing mesh
。该 routing mesh
使swarm中的每个节点,都可以接受服务端口的连接,即便节点上没有运行任务。
该 routing mesh
将所有可用节点服务端口的传入请求,路由到活动容器上。
四、routing mesh 路由网格
1. 发布服务端口
image.pngdocker service create \
--name my-web \
--publish published=8080,target=80 \
--replicas 2 \
nginx
仅发布 TCP 端口
docker service create --name dns-cache \
-p 53:53 \
dns-cache
发布 TCP and UDP 端口
docker service create --name dns-cache \
-p 53:53 \
-p 53:53/udp \
dns-cache
仅发布 UDP 端口
docker service create --name dns-cache \
-p 53:53/udp \
dns-cache
2. 不使用 routing mesh
即将端口绑定到主机。该服务需要运行于 host 模式。
docker service create --name dns-cache \
--publish published=53,target=53,protocol=udp,mode=host \
--mode global \
dns-cache
3. 使用外部负载均衡
1)使用 routing mesh
image.png即通过负载均衡将请求转发到各节点的服务端口上。
global
log /dev/log local0
log /dev/log local1 notice
...snip...
# Configure HAProxy to listen on port 80
frontend http_front
bind *:80
stats uri /haproxy?stats
default_backend http_back
# Configure HAProxy to route requests to swarm nodes on port 8080
backend http_back
balance roundrobin
server node1 192.168.99.100:8080 check
server node2 192.168.99.101:8080 check
server node3 192.168.99.102:8080 check
2)不使用 routing mesh
https://docs.docker.com/engine/swarm/networking/#configure-service-discovery
网友评论