Docker Swarm:打造高效、可扩展的容器编排引擎,引领微服务新纪元(上)

  • 作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注
  • 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元
  • 个人主页: 团儿.-CSDN博客

前言:

在云计算和容器技术飞速发展的今天,Docker Swarm作为Docker原生支持的容器编排引擎,正逐渐成为企业构建云原生应用的重要选择。Docker Swarm不仅提供了强大的容器管理功能,还具备高度的可扩展性和灵活性,使得企业能够轻松应对各种复杂的业务场景。

本文旨在深入剖析Docker Swarm的核心原理和实践应用,帮助读者全面了解和掌握这一技术。我们将从Docker Swarm的基本概念入手,逐步深入其架构设计、部署配置、服务管理、网络与安全等关键领域。同时,我们还将结合丰富的实战案例,展示Docker Swarm在微服务架构、持续集成/持续部署(CI/CD)、资源调度与优化等方面的应用实践。


正文:

一、什么是Docker Swarm

Swarm是Docker公司推出的用来管理docker集群的平台,几乎全部用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),并且已经内置了服务发现工具,我们就不需要像之前一样,再配置 Etcd 或者 Consul 来进行服务发现配置了。 Swarm deamon只是一个调度器(Scheduler)加路由器(router),Swarm自己不运行容器,它只是接受Docker客户端发来的请求,调度适合的节点来运行容器,这就意味着,即使Swarm由于某些原因挂掉了,集群中的节点也会照常运行,当Swarm重新恢复运行之后,他会收集重建集群信息。

二.Docker Swarm 基本结构

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


三.Swarm的几个关键概念

1.Swarm

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

2.Node

一个节点是docker引擎集群的一个实例,可以将其视为Docker节点。

您可以在单个物理计算机或云服务器上运行一个或多个节点,但生产群集部署通常包括分布在多个物理和云计算机上的Docker节点。

要将应用程序部署到swarm,请将服务定义提交给管理器节点。

管理器节点将称为任务的工作单元分派给工作节点。

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

worker工作节点接收并执行从管理器节点分派的任务。

3.Service

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

4.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容器并在容器中执行任务。


四、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会根据自己的服务注册发现机制,以及之前设定的值--replicas n,在集群中剩余的空闲节点上,重新拉起容器副本。整个副本迁移的过程无需人工干预,迁移后原本的集群的load balance依旧好使!

不难看出,docker service其实不仅仅是批量启动服务这么简单,而是在集群中定义了一种状态。Cluster会持续检测服务的健康状态并维护集群的高可用性。

3)服务节点的可扩展性

Swarm Cluster不光只是提供了优秀的高可用性,同时也提供了节点弹性扩展或缩减的功能。当容器组想动态扩展时,只需通过scale参数即可复制出新的副本出来。

仔细观察的话,可以发现所有扩展出来的容器副本都run在原先的节点下面,如果有需求想在每台节点上都run一个相同的副本,方法其实很简单,只需要在命令中将"--replicas n"更换成"--mode=global"即可!

复制服务(--replicas n)

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

全局服务(--mode=global)

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

4. 调度机制

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

------------------Swarm cluster的创建过程包含以下三个步骤----------------------

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

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

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

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

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


期待您的关注~

相关推荐
亚历克斯神18 小时前
Java 安全最佳实践:构建安全的 Java 应用
java·spring·微服务
身如柳絮随风扬18 小时前
使用 Docker 部署禅道并实现自动化部署——从项目搭建到运维自动化的完整指南
运维·docker·自动化
eRTE XFUN19 小时前
docker下搭建redis集群
redis·docker·容器
一只小bit20 小时前
Docker 存储卷:本地文件与容器内部文件建立绑定关系
运维·docker·容器
都在酒里20 小时前
在公共服务器上构建 RK3588 SDK 的纯净 Docker 方案
运维·服务器·docker
jeCA EURG20 小时前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
budingxiaomoli21 小时前
SpringCloud概述
java·spring cloud·微服务
身如柳絮随风扬21 小时前
使用 Docker 部署 Jenkins 并实现自动化部署 —— 从零到一的 CI/CD 实践指南
docker·自动化·jenkins
就叫飞六吧21 小时前
docker快速启动sqlserver实例并自动测试shell脚本
docker·容器·sqlserver
知兀21 小时前
【微服务/nacos】Nacos注册中心原理;配置服务发现中间、配置中心
java·微服务·架构