美文网首页
docker swarm(一)简介

docker swarm(一)简介

作者: 偷油考拉 | 来源:发表于2024-01-10 15:56 被阅读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

    相关文章

      网友评论

          本文标题:docker swarm(一)简介

          本文链接:https://www.haomeiwen.com/subject/shdbndtx.html