Docker Swarm管理

一、Docker Swarm群集部署

        Docker 自诞生以来,其容器特性以及镜像特性给 DevOps 爱好者带来诸多方便。然而在很长一段时间内,Docker 只能在单机上运行,其跨主机部署、运行与管理能力颇受外界诟病。跨主机能力薄弱,导致 Docker 容器与主机的形成高度耦合,降低了 Docker 容器的灵活性,难以实现容器的迁移、分组等功能。

1.Docker Swarm概述

        Docker Swarm 是 Docker 社区提供的基于 Docker 的集群管理调度工具,能够将多台主机构建成一个 Docker 集群,用户通过 API来管理多个主机上的 Docker,并结合 Overlay 网络实现容器的调度与相互访问。
        Docker Swarm 默认对外提供两种 API。
        标准的 DockerAPl:包括 Docker Client、Dokku、Compose、DockerUl、Jenkins 等,它们可以通过 Swarm 工具与 Docker 集群进行通信:
        集群管理 API:用于集群的管理。

2.基本特性

        Docker 集群管理和编排的特性是通过 SwarmKit 进行构建的, 其中 Swarm 模式是Docker Engine 内置支持的一种默认实现。Docker 1.12 以及更新的版本,都支持 Swarm 模式。用户可以基于 Docker Engine 构建 Swarm 集群,然后就可以将应用服务(ApplicationService)部署到 Swarm 集群中。
        Docker Swarm 具有如下基本特性:
        集群管理集成进 Docker Engine:使用内置的集群管理功能,可以直接通过 Docker CLl命令来创建 Swarm 集群,并部署应用服务,而不需要其它外部软件来创建和管理Swarm 集群。
        去中心化设计:Swarm 集群中包含管理节点(Manager)和工作节点(Worker)两类,可以直接基于 Docker Engine 来部署任何类型的节点。在 Swam 集群运行期间,可以对其作出任何改变,实现对集群的扩容和缩容等,如添加与删除节点。而做这些操作时不需要暂停或重启当前的 Swarm 集群服务。
        声明式服务模型:在实现的应用栈中,Docker Engine 使用了一种声明的方式,可以定义各种所期望的服务状态。
        缩放:对于每个服务,可以声明要运行的任务数。向上或向下扩展时,Swarm集群会通过添加或删除任务来自动调整以维持所需的状态。
        协调预期状态与实际状态的一致性:管理节点会不断地监控并协调集群的状态,使得Swarm 集群的预期状态和实际状态保持一致。例如启动一个应用服务,指定服务副本为 10,则会启动 10 个 Docker 容器去运行。如果某个工作节点上面运行的2个 Docker容器挂掉了,管理节点会在 Swarm 集群中其它可用的工作节点上创建2个服务副本,使得实际运行的 Docker 容器数保持与预期的 10 个一致。
        多主机网络:Swarm集群支持多主机网络,可以为服务指定覆盖网络。管理节点在初始化或更新应用程序时自动为覆盖网络上的容器分配地址。
        服务发现:管理节点会给Swarm 集群中每一个服务分配一个唯一的 DNS 名称,对运行中的 Docker 容器进行负载均衡。可以通过 Swarm 内置的 DNS 服务器,查询 Swarm集群中运行的 Docker 容器状态。
        负载均衡:在 Swarm 集群中,可以指定如何在各个Node 之间分发服务容器(ServiceContainer),实现负载均衡。如果想要使用 Swarm 集群外部的负载均衡器,可以将服务容器的端口暴露到外部。
        默认安全:Swarm 集群中的每个节点都强制执行TLS 相互身份验证和加密,以保护自身与所有其他节点之间的通信。用户可以选择使用自签名根证书或自定义根CA的证书。
        滚动更新:对于服务需要更新的场景,可以在多个节点上进行增量部署更新,在 Swarm管理节点使用 Docker CLl设置一个 delay(延迟)时间间隔,实现多个服务在多个节点上依次进行部署,这样可以非常灵活地控制。如果有一个服务更新失败,则暂停后面的更新操作,重新回滚到更新之前的版本。

3.关键概念

        下面是 Docker Swarm 中主要的关键概念。

(1)节点

        每个参与到 Swarm 集群中的 Docker Engine 都称之为一个节点。在单个物理计算机或云服务器上运行一个或多个节点,但是生产环境下的集群部署通常包括分布在多个物理和云机器上的 Docker节点。集群中节点主要分为管理节点与工作节点。
        若要将应用程序部署到集群中,则需要将服务定义提交给管理节点。管理节点将被称为任务的工作单元分派给工作节点。为了维持Swarm 集群的目标状态,管理节点还将承担编排和集群管理的功能。一旦存在多个管理节点时,会选出一个领导来进行任务编排。
        工作节点用于接收并执行来自管理节点分发的任务。默认情况下,管理节点也是工作节点,也可以把它配置成只充当管理节点的角色。工作节点将所负责任务的当前状态通知给管理节点,以便管理节点可以维护每个工作节点的期望状态。

(2)服务与任务

        服务定义了需要在工作节点上执行的任务。它是Swarm 系统的中心结构,也是用户和 Swarm 交互的主要根源。
        创建服务时,可以指定要使用的容器镜像以及在运行容器中执行的命令。
        在复制服务模型中,Swarm 管理器根据所需状态中设置的比例在节点之间分配特定数量的副本任务
        任务是 Swarm 集群中最小的调度单位,每个任务都包含一个容器和需要在容器中执行的指令。管理器根据服务中定义的副本数量将任务分配给工作节点。一旦某个任务被分配到某个节点,就不能再移动到其他节点。它只能在分配的节点上运行或者失败。

(3)负载均衡

        集群管理器使用负载均衡入口来公开对外提供的服务。集群管理器可以自动为PublishedPort(对外发布的端口)分配服务,也可以为服务配置 PublishedPort。部署服务时可以指定任何未使用的端口为服务端口;如果部署服务时未指定端口,Swarm 管理器会为服务自动分配 30000-32767 范围内的端口。
        外部组件(例如云负载均衡器)可以访问集群中任何节点的PublishedPort 上的服务,无论该节点当前是否正在运行该服务的任务。集群中的所有节点都将入口连接到正在运行的任务实例。
        Swarm 模式有一个内部 DNS 组件,可以自动为 Swarm 中的每个服务分配一个 DNS条目。集群管理器使用内部负载均衡来根据服务的 DNS名称在集群内的服务之间分发请求。

 4.工作原理

        在 Swarm 集群中部署镜像创建一个服务时。在一些大的应用上下文环境中需要各种服务配合工作,这样的服务通常称之为微服务。微服务可能是一个 HTTP 服务器、数据库、或者分布式环境中运行的任何其他可执行的程序。
        在创建服务时,可以指定要使用的容器镜像以及容器中要运行的命令。服务还可以定义下面选项:
        集群要对外服务的端口:
        在集群中用于服务之间相连的 Overlay 网络:
        滚动更新策略;
        集群总运行的副本数量。
        下面从以下几个方面具体介绍服务、任务与容器的具体工作方法。

(1)服务、任务与容器

        当服务部署到集群时,Swarm 管理节点会将服务定义作为服务所需状态。然后将服务调度为一个或多个副本任务。这些任务在集群节点上彼此独立运行。
        容器是一个独立的进程。在 Swarm 集群中,每个任务都会调用一个容器。一旦容器运行,调度程序认为该任务处于运行状态。如果容器健康监测失败或者终止,那么任务也终止。

(2)任务与调度

        任务是集群内调度的原子单位。当创建或者更新服务来声明所需的服务状态时,协调器通过调度任务来实现所需的状态。
        任务是单向的机制,它通过一系列状态单独进行:分配、准备、运行等操作。如果任务失败,协调器将删除任务与容器,然后根据服务指定的所需状态创建一个新的任务来代替它。

(3)待处理的服务

        配置服务时,若集群中当前没有可用的节点。在这种情况下,也可以成功配置服务,但所配置服务会处于待处理状态(挂起状态)。以下是服务可能处于待处理状态的几个示例。
        如果在集群中所有节点被暂停或耗尽时,创建了一个服务,服务则被挂起,直到节点可用。实际上,当节点恢复时,第一个可用的节点将会获得所有的任务,这在生产环境中并不是一件好事。
        配置服务时可以为服务预留特定数量的内存。如果集群中没有节点满足所需的内存量,服务则被挂起,直到有可用的节点运行其任务。如果指定了非常大的内存值(如 500G),任务将永久挂起,除非确实有一个满足该条件的节点。
        配置服务时可以对服务施加约束,并且可能无法在给定时间履行约束,服务则被挂起

(4)副本和全局服务

        服务部署分为两种类型:副本服务和全局服务。
        副本服务:指定要运行的相同任务的数量,每个副本都是相同的内容。
        全局服务:是在每个节点上运行一个任务的服务。不需要预先指定任务数量。每当将一个节点添加到集群中,调度器将创建一个任务,并且调度器将任务分配给新加入的节点。全局服务最好是监控代理、反病毒扫描程序等等想要在集群中每个节点上运行的容器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值