• 浅析Docker Swarm集群管理:基本笔记、简介、集群演讲历史、常用命令、swarm工作模式、swarm的关键概念及调度策略、Cluster集群模式特性


    一、基础学习笔记

    1、工作模式是怎样的。

    2、有2种节点类型:管理节点、工作节点。其操作都在manager节点上

    3、Raft一致性算法是什么

    4、初始化节点:docker swarm init

      加入一个节点:docker swarm join

      获取令牌:docker swarm join-token manager(管理节点)、docker swarm join-token worker(工作节点)

      查看节点:docker node ls

    5、操作过程:(1)生成主节点 init;(2)加入(管理者、worker)。目标:双主双从。

    6、Raft协议

      双主双从:假设一个节点挂了,其他节点是否可用。

      Raft协议:保证大多数节点存活才可用,3台节点保证只要>1,集群至少大于3台

      实验:

      (1)将docker1机器停止,宕机,双主,另外一个主节点也不可用

      (2)可以让其他节点离开,离开之后变成down状态

      (3)worker节点就是工作的,管理节点是操作的,管理节点的命令只能在管理节点使用。3台机器设置为管理节点:一台宕机,其他2台还可用;2台宕机,则都不可用了。

      所以为了保证集群可用!需要保证3个主节点,且>1台管理节点存活。

      Raft协议:保证大多数节点存活,才可以使用  ——  高可用。

    7、弹性、集群、负载、扩缩容

      集群:swarm 

      docker service

      容器 - 服务 - 副本的概念

      redis服务 - 10个副本(同时开启10个redis容器)

    8、动态扩缩容:创建服务、动态扩展服务、动态更新服务

      灰度发布:金丝雀发布! —— 升级不影响使用

      docker run 容器启动!不具有扩缩容器

      docker service 服务!具有扩缩容器,滚动更新

      查看服务:docker service ps    其 REPLICAS 属性代表副本

      动态扩充3个节点:docker service update --replicas 3 my-nginx,或者:docker service scale my-nginx=5

      只要是一个服务,那么集群中任意的节点都可以访问,服务可以有多个副本,动态扩缩容器,实现高可用。

    9、概念总结

      swarm:集群的管理和编号,docker可以初始化一个 swarm 集群,其他节点可以加入(管理者、工作者)

      Node:就是一个docker节点、多个节点就组成了一个网络集群(管理者、工作者)

      Service:服务,可以再管理节点和工作节点来运行。核心,用户访问

      Task:容器内的命令,细节任务

    10、工作原理流程  ——  5步:命令 -> 管理节点 -> api -> 调度 -> 工作节点(创建Task容器,维护创建)

    二、Swarm 简介

      Docker Swarm 是 Docker 的集群管理工具。它将 Docker 主机池转变为单个虚拟 Docker 主机。 Docker Swarm 提供了标准的 Docker API,所有任何已经与 Docker 守护程序通信的工具都可以使用 Swarm 轻松地扩展到多个主机。

      Swarm几乎全部用GO语言来完成的开发的,代码开源在https://github.com/docker/swarm, 它是将一群Docker宿主机变成一个单一的虚拟主机,Swarm使用标准的Docker API接口作为其前端的访问入口,换言之,各种形式的Docker Client(compose,docker-py等)均可以直接与Swarm通信,甚至Docker本身都可以很容易的与Swarm集成,这大大方便了用户将原本基于单节点的系统移植到Swarm上,同时Swarm内置了对Docker网络插件的支持,用户也很容易的部署跨主机的容器集群服务。

      Docker Swarm 和 Docker Compose 一样,都是 Docker 官方容器编排项目,但不同的是,Docker Compose 是一个在单个服务器或主机上创建多个容器的工具,而 Docker Swarm 则可以在多个服务器或主机上创建容器集群服务,对于微服务的部署,显然 Docker Swarm 会更加适合。

      从 Docker 1.12.0 版本开始,Docker Swarm 已经包含在 Docker 引擎中(docker swarm),并且已经内置了服务发现工具。

      Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,他会收集重建集群信息。

    三、Swarm演讲历史

      以下来源于文章:从Docker到Docker-Swarm集群再到Java SpringBoot —— https://www.modb.pro/db/43996

    1、演进梳理

    (1)docker run:只能启动一台服务器一个contanner

      docker pull:只能使用提交到dockerhub上的镜像

      Dockerfile:定制特定的镜像

    (2)docker-stack  /  docker-compose:同时启动一台服务器多个service(一个compose里可以配置多个service,每个service可以有一个contanner的多个replicas)

    (3)docker-swarm:同时启动多台服务器多个service

    2、关系梳理

      Swarm:一个Swarm是一个集群,下面有多个node节点

      node:node分为manager和worker节点(一个node一个服务器)

      Stack:管理多个Service

      Service:每个服务有多个contanner

      Contanner:每个contanner对应多个replicas

      Replicas:每个replicas对应一个task(任务)被合理分配到不同的node上

    四、常用命令

    //  1、搭建集群生成manager
    docker swarm init // 搭建集群并指定当前服务器为集群manager节点
    docker swarm init --advertise-addr  192.168.1.10 // 搭建集群并指定ip为集群manager节点
    
    //  2、生成worker节点
    docker swarm join-token worker // 生成token,复制token,去worker服务区执行
    
    //  3、集群操作
        //  3.1、node操作
        docker node ls //查看节点信息(master上)
        docker node ps //查看节点上的Task任务
    
         //退出节点
        docker node update --availability drain ID // 放空指定节点(master上)
        docker node update --availability active <NODE-ID> // 恢复放空(master上)
        docker swarm leave // 节点退出(worker上)
        docker node rm ID //删除节点(master上)
          
         //节点变更
        docker node promote node2 // 将worker提升为manger
        docker node demote node1 // 将manger降级为worker
          
         // 节点分配
        docker node update —availability drain node1 //node1不分配节点
        docker node update —availability active node1 //恢复node1分配
    
        //  3.2、Stack操作
        // 部署
        docker stack deploy --compose-file docker-compose.yaml stack_name //启动stack
        docker stack down service_name //关闭stack
    
        docker stack ls // 查看stack下service列表
        docker stack services service_name  //查看指定service的所有容器
        docker stack ps service_name // 查看指定service的所有容器运行状态详情
    
         //  3.3、Service操作
         // 查看service
        docker service ls  //查看该服务下所有容器
        docker service ps 容器名 // 查看指定容器运行状态详情
        docker service logs 容器名 // 查看指定容器的运行日志
    
        //  3.4、Replicas操作
        // 控制容器副本数(重启stack后会失效)
        docker service scale 容器名=副本数量  // 增加/缩减副本数量
            
        // 在compose文件中设定(重启不会失效)
        deploy:
              mode: replicated
              replicas: 2

    五、Swarm工作原理

      下面来自官网文档:如下图所示,swarm 集群由管理节点(manager)和工作节点(work node)构成。

    • swarm mananger:负责整个集群的管理工作包括集群配置、服务管理等所有跟集群有关的工作。
    • work node:即图中的 available node,主要负责运行相应的服务来执行任务(task)。

    1、Node节点

    2、Service 服务

    3、任务与调度

    4、服务副本与全局服务

    六、Swarm的几个关键概念

    1、Swarm

      集群的管理和编排是使用嵌入docker引擎的SwarmKit,可以在docker初始化时启动swarm模式或者加入已存在的swarm

    2、Node

      一个节点就是docker引擎集群的一个实例。您还可以将其视为Docker节点。您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。

      要将应用程序部署到swarm,请将服务定义提交给管理器节点。管理器节点将称为任务的工作单元分派给工作节点。

      Manager节点还执行维护集群状态所需的编排和集群管理功能。Manager节点选择单个领导者来执行编排任务。

      工作节点接收并执行从管理器节点分派的任务。默认情况下,管理器节点还将服务作为工作节点运行,但您可以将它们配置为仅运行管理器任务并且是仅管理器节点。代理程序在每个工作程序节点上运行,并报告分配给它的任务。工作节点向管理器节点通知其分配的任务的当前状态,以便管理器可以维持每个工作者的期望状态

    3、Service

      一个服务是任务的定义,在管理机或工作节点上执行。它是群体系统的中心结构,是用户与群体交互的主要根源。创建服务时,你需要指定要使用的容器镜像。

    4、Task

      任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

    5、常见命令:

    docker swarm:集群管理,子命令有init, join, leave, update。(docker swarm --help查看帮助)

    docker service:服务创建,子命令有create, inspect, update, remove, tasks。(docker service--help查看帮助)

    docker node:节点管理,子命令有accept, promote, demote, inspect, update, tasks, ls, rm。(docker node --help查看帮助)

    6、node节点介绍

      node是加入到swarm集群中的一个docker引擎实体,可以在一台物理机上运行多个node,node分为:

      manager nodes,也就是管理节点

      worker nodes,也就是工作节点

    (1)manager node管理节点:执行集群的管理功能,维护集群的状态,选举一个leader节点去执行调度任务。

    (2)worker node工作节点:接收和执行任务。参与容器集群负载调度,仅用于承载task。

    (3)service服务:一个服务是工作节点上执行任务的定义。创建一个服务,指定了容器所使用的镜像和容器运行的命令。service是运行在worker nodes上的task的描述,service的描述包括使用哪个docker 镜像,以及在使用该镜像的容器中执行什么命令。

    (4)task任务:一个任务包含了一个容器及其运行的命令。task是service的执行实体,task启动docker容器并在容器中执行任务。

    七、Swarm的调度策略

      Swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread, binpack, random

    1、Random

      顾名思义,就是随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运行的容器的数量来计算应该运行容器的节点。

    2、Spread

      在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。

      使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。

    3、Binpack

      Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在一个节点上面。

    八、Swarm Cluster模式特性

    1、批量创建服务:建立容器之前先创建一个overlay的网络,用来保证在不同主机上的容器网络互通的网络模式

    2、强大的集群的容错性:当容器副本中的其中某一个或某几个节点宕机后,cluster会根据自己的服务注册发现机制,以及之前设定的值--replicasn,在集群中剩余的空闲节点上,重新拉起容器副本。整个副本迁移的过程无需人工干预,迁移后原本的集群的loadbalance依旧好使!不难看出,docker service其实不仅仅是批量启动服务这么简单,而是在集群中定义了一种状态。Cluster会持续检测服务的健康状态并维护集群的高可用性。

    3、服务节点的可扩展性:Swarm Cluster不光只是提供了优秀的高可用性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过scale参数即可复制出新的副本出来。仔细观察的话,可以发现所有扩展出来的容器副本都run在原先的节点下面,如果有需求想在每台节点上都run一个相同的副本,方法其实很简单,只需要在命令中将"--replicas n"更换成"--mode=global"即可!

    (1)复制服务(--replicas n):将一系列复制任务分发至各节点当中,具体取决于您所需要的设置状态,例如“--replicas 3”。

    (3)全局服务(--mode=global):适用于集群内全部可用节点上的服务任务,例如“--mode global”。如果大家在 Swarm 集群中设有 7 台 Docker 节点,则全部节点之上都将存在对应容器。

    4、调度机制:所谓的调度其主要功能是cluster的server端去选择在哪个服务器节点上创建并启动一个容器实例的动作。它是由一个装箱算法和过滤器组合而成。每次通过过滤器(constraint)启动容器的时候,swarm cluster 都会调用调度机制筛选出匹配约束条件的服务器,并在这上面运行容器。

    5、Swarm cluster的创建过程包含以下三个步骤:

    (1)发现Docker集群中的各个节点,收集节点状态、角色信息,并监视节点状态的变化

    (2)初始化内部调度(scheduler)模块

    (3)创建并启动API监听服务模块

      一旦创建好这个cluster,就可以用命令docker service批量对集群内的容器进行操作,非常方便!

      在启动容器后,docker 会根据当前每个swarm节点的负载判断,在负载最优的节点运行这个task任务,用"docker service ls" "docker service ps + taskID"可以看到任务运行在哪个节点上。容器启动后,有时需要等待一段时间才能完成容器创建。

    6、Docker Swarm基本结构图

      在结构图可以看出 Docker Client 使用 Swarm 对 集群(Cluster)进行调度使用。上图可以看出,Swarm是典型的master-slave结构,通过发现服务来选举manager。manager是中心管理节点,各个node上运行agent接受manager的统一管理,集群会自动通过Raft协议分布式选举出manager节点,无需额外的发现服务支持,避免了单点的瓶颈问题,同时也内置了DNS的负载均衡和对外部负载均衡机制的集成支持。

  • 相关阅读:
    java、javaw和javaws的区别
    Hibernate4教程二:基本配置(2)
    Maven入门指南10:Maven的生命周期和插件
    Java中的断言(assert)
    MySQL的数据类型:文本、数字、日期/时间
    面向对象的三大基本特征和五大基本原则
    高内聚低耦合的介绍
    9.7 模拟赛
    16-17学期计划(每周)
    JZOJ 5281 钦点
  • 原文地址:https://www.cnblogs.com/goloving/p/14988269.html
Copyright © 2020-2023  润新知