zoukankan      html  css  js  c++  java
  • docker 实践九:docker swarm

    介绍了 docker 三剑客中的 docker-machine 和 docker-compose 之后,就剩下一个 docker swarm 了。那本篇的主角就是它了。

    注:环境为 CentOS7,docker 19.03。

    docker-compose 为用户提供单节点中多容器的创建,docker-machine 让用户管理不同的 docker 环境。而 docker swarm 则帮助用户实现 docker 的集群管理。从单机走向集群。

    Swarm 的简介

    Swarm 的前身是Beam项目和libswarm项目,2014年12月推出 Swarm。之后又在2016年2月整合到 docker engine 1.12 中。使用命令 docker swarm 可以直接使用 swarm(之前是单独的命令 swarm),并支持超过 1K 个的节点。

    Swarm 采用“主从”结构,通过Raft协议来在多个管理节点(Manager)中实现共识。⼯作节点(Worker) 上运⾏agent接受管理节点的统⼀管理和任务分配。 ⽤户提交服务请求只需要发给管理节点即可, 管理节点会按照调度策略在集群中分配节点来运⾏服务相关的任务。

    在Swarm V2中, 集群中会⾃动通过Raft协议分布式选举出Manager节点, ⽆须额外的发现服务⽀持, 避免了单点瓶颈。 同时, V2中内置了基于DNS的负载均衡和对外部负载均衡机制的集成⽀持。

    Swarm 基本概念

    swarm 集群

    Swarm集群(Cluster) 为⼀组被统⼀管理起来的Docker主机。 集群是Swarm所管理的对象。 这些主机通过Docker引擎的Swarm模式相互沟通,其中部分主机可能作为管理节点(manager) 响应外部的管理请求, 其他主机作为⼯作节点(worker) 来实际运⾏Docker容器。 当然, 同⼀个主机也可以即作为管理节点, 同时作为⼯作节点。

    当⽤户使⽤Swarm集群时, ⾸先定义⼀个服务(指定状态、 复制个数、 ⽹络、 存储、 暴露端口等) , 然后通过管理节点发出启动服务的指令, 管理节点随后会按照指定的服务规则进⾏调度, 在集群中启动起来整个服务, 并确保它正常运⾏。

    节点

    节点(Node) 是Swarm集群的最⼩资源单位。 每个节点实际上都是⼀台Docker主机。通过命令 docker node [COMMAND] 可以管理节点。

    Swarm集群中节点分为两种:

    • 管理节点(manager node) : 负责响应外部对集群的操作请求, 并维持集群中资源, 分发任务给⼯作节点。 同时, 多个管理节点之间通过Raft协议构成共识。 ⼀般推荐每个集群设置5个或7个管理节点;
    • ⼯作节点(worker node) : 负责执⾏管理节点安排的具体任务。 默认情况下, 管理节点⾃⾝也同时是⼯作节点。 每个⼯作节点上运⾏代理(agent) 来汇报任务完成情况。⽤户可以通过docker node promote命令来提升⼀个⼯作节点为管理节点; 或者通过docker node demote命令来将⼀个管理节点降级为⼯作节点。

    服务

    服务(Service) 是Docker⽀持复杂多容器协作场景的利器。docker service [COMMAND],该命令可以用来操作服务。

    ⼀个服务可以由若⼲个任务组成, 每个任务为某个具体的应⽤。 服务还包括对应的存储、 ⽹络、 端口映射、 副本个数、 访问配置、 升级配置等附加参数。

    ⼀般来说, 服务需要⾯向特定的场景, 例如⼀个典型的Web服务可能包括前端应⽤、 后端应⽤, 以及数据库等。 这些应⽤都属于该服务的管理范畴。

    Swarm集群中服务类型也分为两种(可以通过-mode指定) :

    • 复制服务(replicated services) 模式: 默认模式, 每个任务在集群中会存在若⼲副本, 这些副本会被管理节点按照调度策略分发到集群中的⼯作节点上。 此模式下可以使⽤ --replicas 参数设置副本数量;
    • 全局服务(global services) 模式: 调度器将在每个可⽤节点都执⾏⼀个相同的任务。 该模式适合运⾏节点的检查, 如监控应⽤等。

    任务

    任务是Swarm集群中最⼩的调度单位, 即⼀个指定的应⽤容器。 例如仅仅运⾏前端业务的前端容器。 任务从⽣命周期上将可能处于创建(NEW) 、 等待(PENDING) 、 分配(ASSIGNED) 、 接受(ACCEPTED) 、 准备(PREPARING) 、 开始(STARTING) 、 运⾏(RUNNING) 、 完成(COMPLETE) 、 失败(FAILED) 、 关闭(SHUTDOWN) 、 拒绝(REJECTED) 、 孤⽴(ORPHANED) 等不同状态。

    Swarm集群中的管理节点会按照调度要求将任务分配到⼯作节点上。例如指定副本为2时, 可能会被分配到两个不同的⼯作节点上。 ⼀旦当某个任务被分配到⼀个⼯作节点, 将⽆法被转移到另外的⼯作节点, 即Swarm中的任务不⽀持迁移。

    swarm 外部访问

    Swarm集群中的服务要被集群外部访问, 必须要能允许任务的响应端⼜映射出来。 Swarm中⽀持⼊⼜负载均衡(ingress load balancing) 的映射模式。 该模式下, 每个服务都会被分配⼀个公开端⼜(PublishedPort) ,该端⼜在集群中任意节点上都可以访问到, 并被保留给该服务。

    当有请求发送到任意节点的公开端口时, 该节点若并没有实际执⾏服务相关的容器, 则会通过路由机制将请求转发给实际执⾏了服务容器的⼯作节点。

    使用 docker swarm

    环境上使用的 docker 版本为 19.03,已经集成了 swarm,所以直接使用 docker swarm

    准备三台机器,配置如下:

    • manager:CentOS7 192.168.10.10 docker19.03
    • work1:CentOS7 192.168.10.11 docker19.03
    • work2:CentOS7 192.168.10.12 docker19.03

    创建 docker swarm 集群

    docker 集群的操作命令如下:

    • swarm init: 在管理节点上创建⼀个集群;
    • node list: 列出集群中的节点信息;
    • swarm join: 加⼊⼀个新的节点到已有集群中;
    • swarm update: 更新⼀个Swarm集群;
    • swarm leave: 离开⼀个Swarm集群。

    1.创建 swarm 集群

    # docker swarm init
    Swarm initialized: current node (64ziftvcc42jes9rjjln3gj3o) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-05ti4zj7p0jnhxl26m3tlk48aazl3ts3jkhari0c4oyaoxk1rb-bb3dkm45d9m0ikaoxuhgwtgve 192.168.10.10:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    

    2.在两台 work 节点上执行如下命令

    # docker swarm join --token SWMTKN-1-05ti4zj7p0jnhxl26m3tlk48aazl3ts3jkhari0c4oyaoxk1rb-bb3dkm45d9m0ikaoxuhgwtgve 192.168.10.10:2377
    

    这样,就完成了 docker swarm 集群的创建了,还是很简单的

    # docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    64ziftvcc42jes9rjjln3gj3o *   centos1             Ready               Active              Leader              19.03.1
    60xwt9dr0znx5qnjhvjqj9c7w     centos2             Ready               Active                                  19.03.1
    h7zaxx1bxzw33mp8ze6lumj4f     centos3             Ready               Active                                  19.03.1
    

    注意:如果 CentOS7 上防火墙没有配置的话,集群中的节点状态可以会为 down,请先关闭或开放端口2377

    使用 docker swarm 集群

    创建集群使用命令 docker swarm [COMMAND],管理集群使用docker node [COMMAND],利用集群管理服务则是命令 docker service [COMMAND]

    1.创建一个服务

    # docker service create --replicas 2 --name ping debian:jessie ping docker.com    
    skyaj8ukmi8t42c05qba3k6rm
    overall progress: 2 out of 2 tasks 
    1/2: running   [==================================================>] 
    2/2: running   [==================================================>] 
    verify: Service converged 
    

    2.查看一个服务

    # docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    skyaj8ukmi8t        ping                replicated          2/2                 debian:jessie       
    # docker service ps ping
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE                ERROR               PORTS
    x02dsx5to2xq        ping.1              debian:jessie       centos1             Running             Running about a minute ago                       
    3od5f9rzjjzt        ping.2              debian:jessie       centos2             Running             Running about a minute ago                       
    # docker service inspect --pretty ping
    
    ID:             skyaj8ukmi8t42c05qba3k6rm
    Name:           ping
    Service Mode:   Replicated
     Replicas:      2
    Placement:
    UpdateConfig:
     Parallelism:   1
     On failure:    pause
     Monitoring Period: 5s
     Max failure ratio: 0
     Update order:      stop-first
    RollbackConfig:
     Parallelism:   1
     On failure:    pause
     Monitoring Period: 5s
     Max failure ratio: 0
     Rollback order:    stop-first
    ContainerSpec:
     Image:         debian:jessie@sha256:c72197393c39c05e19c8ef3388af53a6daa2baa0bed6111b09e40a298d9f7eca
     Args:          ping docker.com 
     Init:          false
    Resources:
    Endpoint Mode:  vi
    

    3.扩展服务

    # docker service scale ping=1
    ping scaled to 1
    overall progress: 1 out of 1 tasks 
    1/1: running   [==================================================>] 
    verify: Service converged 
    # docker service scale ping=3
    ping scaled to 3
    overall progress: 3 out of 3 tasks 
    1/3: running   [==================================================>] 
    2/3: running   [==================================================>] 
    3/3: running   [==================================================>] 
    verify: Service converged 
    

    4.使用外部端口

    # docker service create --replicas 2 --name nginx -p 8080:80 nginx
    

    或者

    # docker service create --replicas 2 --name nginx --publish published=8080,target=80 nginx
    

    注:docker swarm 内部已经实现负载均衡,访问 swarm 集群任意节点的地址都有效,即使该节点没有运行该服务。

    5.service 子命令

    swarm 节点管理

    管理 swarm 集群节点的命令是 docker node,支持以下选项

    • demote:从管理节点切换为工作节点
    • inspect:查看节点
    • ls:输出所有节点
    • promote:从工作节点切换为管理节点
    • ps:输出节点上的任务信息
    • rm:从集群中删除节点
    • update:更新节点信息

    swarm 部署多任务

    之前我们已经使用过 docker-compose,它能在一次部署多个容器,现在 docker engine 中集成了同样的能,而且能在 swarm 集群环境下部署多个任务。

    命令docker stack [command]命令支持以下选项:

    • deploy:部署一个 stack
    • ls:输出所有的 stack
    • ps:输出 stack 中的任务
    • rm:删除一个stack
    • services:输出stack中所有服务

    1.创建 docker-compose.yml

    docker stack 直接支持 docker-compose 格式的配置文件

    version: "3"
    
    services:
      nginx:
        image: nginx:latest
        ports:
          - 8088:80
        deploy:
          mode: replicated
          replicas: 4
    

    2.部署 stack

    # docker stack deploy -c docker-compose.yml web
    Creating service web_nginx
    # docker stack ls
    NAME                SERVICES            ORCHESTRATOR
    web                 1                   Swarm
    # docker stack ps web
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
    q34tk96cssvp        web_nginx.1         nginx:latest        centos1             Running             Running 6 seconds ago                       
    k6p4iol3vs0v        web_nginx.2         nginx:latest        centos2             Running             Running 7 seconds ago                       
    hen5phupzow4        web_nginx.3         nginx:latest        centos2             Running             Running 7 seconds ago                       
    ugr8sgg6lpv9        web_nginx.4         nginx:latest        centos3             Running             Running 6 seconds ago                       
    # docker stack services web
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    hf5dbvn0a8ww        web_nginx           replicated          4/4                 nginx:latest        *:8088->80/tcp
    

    3.删除 stack

    # docker stack rm web
    Removing service web_nginx
    Removing network web_default
    
  • 相关阅读:
    Case用法
    SQL 常用函数及示例
    ms-SQL 递归调用
    office2003 下载地址 及密码
    [LeetCode] 697. Degree of an Array 数组的度
    [LeetCode] 58. Length of Last Word 求末尾单词的长度
    [LeetCode] 288.Unique Word Abbreviation 独特的单词缩写
    [LeetCode] 287. Find the Duplicate Number 寻找重复数
    [LeetCode] 350. Intersection of Two Arrays II 两个数组相交II
    [LeetCode] 349. Intersection of Two Arrays 两个数组相交
  • 原文地址:https://www.cnblogs.com/xingyys/p/11443629.html
Copyright © 2011-2022 走看看