docker swarm(一)简介

2024-01-10  本文已影响0人  偷油考拉

一、什么是 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:

  1. 创建一个 swarm
docker swarm init
  1. 加入一个 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.png
docker 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

上一篇 下一篇

猜你喜欢

热点阅读