zoukankan      html  css  js  c++  java
  • Docker Swarm集群部署

    一、系统环境

      1)服务器环境

    节点名称 IP 操作系统 内核版本
    manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64
    node-01 172.16.60.96 CentOs7 4.16.1-1.el7.elrepo.x86_64
    node-02 172.16.60.97 CentOs7 4.16.1-1.el7.elrepo.x86_64
    node-03 172.16.60.98 CentOs7 4.16.1-1.el7.elrepo.x86_64

      2)前提条件

    • Docker版本1.12+
    • 集群节点之间保证TCP 2377、TCP/UDP 7946和UDP 4789端口通信   

        TCP端口2377集群管理端口

        TCP与UDP端口7946节点之间通讯端口

        TCP与UDP端口4789 overlay网络通讯端口

    二、集群部署

      1)master创建Swarm(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)  

    [root@master ~]# docker swarm init --advertise-addr 172.16.60.95
    Swarm initialized: current node (kfi2r4dw6895z5yvhlbyzfck6) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
        docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 

      注:上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。 其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输出包含了其它节点如何加入集群的命令。

      使用docker info 或者 docker node ls 查看集群中的相关信息 

    docker info 
    
    .......
    Swarm: active
     NodeID: kfi2r4dw6895z5yvhlbyzfck6
     Is Manager: true
     ClusterID: y2zgs373cg0y6559t675yexcj
     Managers: 1
     Nodes: 1
     Orchestration:
      Task History Retention Limit: 5
    
    .......
    

      

      2)添加节点到swarm集群中

      所有节点执行 

    docker swarm join --token SWMTKN-1-3fzyz5knfbhw9iqlzxhb6dmzdtr0izno9nr7iqc5wid09uglh8-0mocmawzvm3xge6s37n5a48fw 172.16.60.95:2377
    

      在master上查看集群节点的状态

      

       到此Swarm集群就创建好了

      3)docker  node 命令 

    [root@master ~]# docker node --help
    
    Usage:    docker node COMMAND
    
    Manage Swarm nodes
    
    Options:
    
    
    Commands:
      demote      Demote one or more nodes from manager in the swarm
      inspect     Display detailed information on one or more nodes
      ls          List nodes in the swarm
      promote     Promote one or more nodes to manager in the swarm
      ps          List tasks running on one or more nodes, defaults to current node
      rm          Remove one or more nodes from the swarm
      update      Update a node
    
    
    # demote
       将管理节点降级为普通节点
    # inspect
        查看节点的详细信息
    # ls
       列出节点
    # promote
       将普通节点升级为管理节点
    # ps
       查看运行的任务
    # rm
       从swarm集群中删除节点
    # update
       改变集群节点状态
    docker node 命令
    [root@master ~]# docker node update --help
    
    Usage:    docker node update [OPTIONS] NODE
    
    Update a node
    
    Options:
          --availability string   Availability of the node ("active"|"pause"|"drain")
          --label-add list        Add or update a node label (key=value)
          --label-rm list         Remove a node label if exists
          --role string           Role of the node ("worker"|"manager")
    
    
    # 主要使用availability string
    
    # active
        节点状态正常
    # pause
        节点挂起、暂停
    # drain
        排除节点,比如将master节点排除,不分配任务,只作为管理节点
        
    node update命令

    三、在Swarm中部署服务

      1)创建服务 

    [root@master ~]# docker service --help
    
    Usage:    docker service COMMAND
    
    Manage services
    
    Options:
    
    
    Commands:
      create      Create a new service
      inspect     Display detailed information on one or more services
      logs        Fetch the logs of a service or task
      ls          List services
      ps          List the tasks of one or more services
      rm          Remove one or more services
      rollback    Revert changes to a service's configuration
      scale       Scale one or multiple replicated service
    docker service 
    [root@master ~]# docker service create --replicas 1 --name hello busybox
    
    #  --replicas : 副本集个数
    
    # --name:服务名称
    

      2)查看服务信息

    [root@master ~]# docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    kosznwn4ombx        hello               replicated          0/1                 busybox:latest 
    

      从REPLICAS中能看出这个 hello服务并没有启动起来,0/1 表示 1计划启动的副本数,0实际启动的数量。所以启动失败  

      

      3)添加参数

      在hello服务中busybox只是一个基础镜像,并没有一个持续运行的任务,所以manager会不断重启hello这个服务,所以有好多shutdown的记录。但是可以为其添加一个任务。 

    [root@master ~]# docker service update --args "ping www.baidu.com" hello
    hello
    overall progress: 1 out of 1 tasks 
    1/1: running   [==================================================>] 
    verify: Service converged
    
    
    # update:更新状态
    
    # --args:增加参数
    

      再次查看状态:

      

      过滤不正常的状态: 

    [root@master ~]# docker service ps -f "desired-state=running" hello
    ID                  NAME                IMAGE               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
    yxyivio4mzlg        hello.1             busybox:latest      master              Running             Running 4 minutes ago  
    
    
    # -f "desired-state=running" : 状态为runngin的服务
    

      4)为服务扩容(缩融)scale

      刚才设置的replicas=1,可以增加副本数量

    [root@master ~]# docker service scale hello=4
    
    hello scaled to 4
    overall progress: 4 out of 4 tasks 
    1/4: running   
    2/4: running   
    3/4: running   
    4/4: running   
    verify: Service converged 
    
    
    # scale : 指定服务的数量
    

      

      5)工作节点排除manager,manager只作为管理节点

      上图中manager也运行了一个服务,将manager排除在外

    [root@manager ~]# docker node update --availability drain manager
    
    # node update : 更改节点状态
    
    # --availability : 三种状态
        
       active: 正常
       pause:挂起
       drain:排除
    

      排除manager后,其上面运行的服务会转移到其他节点 

      

     四、滚动更新服务

      例如升级服务的镜像版本 

    [root@manager ~]# docker service create 
    > --replicas 3 
    > --name redis 
    > --update-delay 10s 
    > redis:3.0.6
    
    
    # 启动3个副本集的redis
    
    # update-delay 10s :每个容器依次更新,间隔10s
    

      滚动更新:

    docker service update --image redis:3.0.7 redis
    
    # --image : 指定版本
    

      更新完成后新版本和历史记录都能查看

      

      查看配置信息:

      

     五、服务更新和回滚策略

      1)设置策略  

    [root@manager ~]# docker service create 
    --name my-web 
    --replicas 10 
    --update-delay 10s 
    --update-parallelism 2 
    --update-failure-action continue 
    --rollback-parallelism 2 
    --rollback-monitor 20s 
    --rollback-max-failure-ratio 0.2 
    nginx:1.12.1
    
    
    # --update-parallelism 2  : 每次允许两个服务一起更新
    
    #--update-failure-action continue : 更新失败后的动作是继续
    
    # --rollback-parallelism 2  :  回滚时允许两个一起
    
    # --rollback-monitor 20s  :回滚监控时间20s
    
    # --rollback-max-failure-ratio 0.2 : 回滚失败率20%
    

      如果执行后查看状态不是设置的,可以在update一下,将服务状态设置为自己想要的

    docker service update --rollback-monitor 20s  my-web
    
    docker service update --rollback-max-failure-ratio 0.2 my-web
    
    # 有两个地方设置数值没有成功,手动设置
    

      查看状态:

      

      

      2)服务更新

    [root@manager ~]# docker service update --image nginx:1.13.5 my-web

      和上述策略一致,两两更新

      

       更新完成:

      

      3)手动回滚(策略是失败会回滚,现在没有失败)

      刚才nginx版本已经是1.13.5了,现在将其还原到1.12.1 

    [root@manager ~]# docker service update --rollback my-web
    

      

      手动回滚成功

  • 相关阅读:
    习题4.7利用vector实现数据复制
    习题4.18
    4.8编写一小段程序实现两vector是否相等的比较
    关于野指针
    学习c++的50条忠告
    c++头文件
    习题4.14
    容器和迭代器
    Android上C++对象的自动回收机制分析
    Windows下载Android源码
  • 原文地址:https://www.cnblogs.com/bigberg/p/8761226.html
Copyright © 2011-2022 走看看