• Docker Swarm 集群


    Swarm 是 Docker 公司推出的用来管理docker集群的平台,Swarm 是 Docker 官方容器编排项目,可以在多个服务器或主机上创建容器集群服务,Swarm 自己不运行容器,它只是接受 Docker 客户端发来的请求,调度适合的节点来运行容器,

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

    2、概念
    swarm:集群管理和编排
    node:节点,一个节点就是docker集群中的一个实例,我们可以在单台服务器上运行一个或多个节点。
    service:应用编排,一个服务是任务的定义,管理机或工作节点上执行。
    task:应用实例,任务是在docekr容器中执行的命令,Manager节点根据指定数量的任务副本分配任务给worker节点

    # 使用方法
    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查看帮助)

    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容器并在容器中执行任务。
    *
    3、Swarm的调度策略
    swarm在调度(scheduler)节点(leader节点)运行容器的时候,会根据指定的策略来计算最适合运行容器的节点,目前支持的策略有:spread,binpack,random
    *
    1)Random
    随机选择一个Node来运行容器,一般用作调试用,spread和binpack策略会根据各个节点的可用的CPU, RAM以及正在运
    行的容器的数量来计算应该运行容器的节点。
    *
    2)Spread
    在同等条件下,Spread策略会选择运行容器最少的那台节点来运行新的容器,binpack策略会选择运行容器最集中的那台机器来运行新的节点。
    使用Spread策略会使得容器会均衡的分布在集群中的各个节点上运行,一旦一个节点挂掉了只会损失少部分的容器。
    *
    3)Binpack
    Binpack策略最大化的避免容器碎片化,就是说binpack策略尽可能的把还未使用的节点留给需要更大空间的容器运行,尽可能的把容器运行在
    一个节点上面。
    *
    *
    Swarm Manager:
    ● API:接受命令并创建 service 对象(创建对象)
    ● orchestrator:为 service 对象创建的 task 进行编排工作(服务编排)
    ● allocater:为各个 task 分配 IP 地址(分配 IP)
    ● dispatcher:将 task 分发到 nodes(分发任务)
    ● scheduler:安排一个 worker 节点运行 task(运行任务)

    Worker Node:
    ● worker:连接到调度器,检查分配的 task(检查任务)
    ● executor:执行分配给 worker 节点的 task(执行任务)

    4、Docker Swarm集群部署
    机器环境(三台机器,centos系统)
    IP:192.168.31.43 主机名:manager43 担任角色:swarm manager
    IP:192.168.31.188 主机名:node188 担任角色:swarm node
    IP:192.168.31.139 主机名:node139 担任角色:swarm node

    修改主机名,关闭防火墙

    1. #修改主机名
    2. hostnamectl set-hostname manager43
    3. hostnamectl set-hostname node188
    4. hostnamectl set-hostname node139
    5. #关闭三台服务器上的防火墙
    6. systemctl stop firewalld.service
    7. systemctl disable firewalld.service

    创建 Swarm 集群

    1. # Step 1: 在 192.168.31.43 主服务器上创建 Swarm 集群
    2. docker swarm init --advertise-addr 192.168.31.43
    3.      # 这就是添加节点的方式(要保存初始化后token,因为在节点加入时要使用token作为通讯的密钥)
    4.      docker swarm join --token SWMTKN-1-4kdb7ysckerhxc6gxc3bpltkxtm8o45yq1ikyv1kie825zibhh-bhwazb9y8i3s92v8mpv5c06so 192.168.31.43:2377
    5.      # 可能会遇到一个小小的问题:提示This node is already part of a swarm. Use "docker swarm leave" to leave this swarm and join another one.
    6.      # 解决方法,这里的leave就是在集群中删除节点,-f参数强制删除,执行完在重新执行OK
    7.      docker swarm leave -f
    8.      docker swarm init --advertise-addr 192.168.31.43
    9. # Step 2: 查看集群相关信息
    10. docker info
    11. # Step 3: 查看集群节点信息,集群中的机器
    12. docker node ls
    13. # Step 4: 添加节点主机到Swarm集群
    14. # 在 192.168.31.188 主机上执行
    15. docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
    16. # 在 192.168.31.139 主机上执行
    17. docker swarm join --token SWMTKN-1-2lefzq18zohy9yr1vskutf1sfb2a590xz9d0mjj2m15zu9eprw-2938j5f50t35ycut0vbj2sx0s 192.168.31.43:2377
    18. # 查看集群节点信息,集群中的机器
    19. docker node ls
    20. # 参数说明
    21. active状态下,node可以接受来自manager节点的任务分派;
    22. drain状态下,node节点会结束task,且不再接受来自manager节点的任务分派(也就是下线节点)
    23. # Step 5: 在Swarm中部署服务(nginx为例)
    24. # 创建网络
    25. docker network create -d overlay nginx_net
    26. docker network ls | grep nginx_net
    27. # 部署服务
    28. # 创建一个具有一个副本(--replicas 1 )的nginx服务,使用镜像nginx
    29. docker service create --replicas 1 --network nginx_net --name my_nginx -p 80:80 nginx
    30. # 参数说明
    31. --replicas 参数指定服务由几个实例组成
    32. # 查看正在运行服务的列表
    33. docker service ls
    34. # 查询Swarm中服务的信息
    35. docker service inspect --pretty my_nginx
    36. # 查询到哪个节点正在运行该服务
    37. docker service ps my_nginx
    38. # 在Swarm中动态扩展服务(scale)
    39. docker service scale my_nginx=4
    40. docker service ps my_nginx

    *
    *
    *

  • 相关阅读:
    HTML渲染过程
    SpringMVC之CRUD和文件上传下载
    公有云容灾,中小企业最具性价比的选择
    网络安全渗透测试之pingtunnel使用实验
    Redis 访问控制列表(ACL)
    Docker中安装并配置redis
    传统直线检测算法与基于深度学习的直线检测算法
    微信小程序服务通知(订阅消息)定时推送消息功能
    Redis持久化策略
    MySQL、Oracle、SQL Server / MS Access 中的 NULL函数用法
  • 原文地址:https://blog.csdn.net/KingCruel/article/details/128165154