Docker之Docker Swarm管理

Docker之 Docker Swarm管理


容器编排部署工具除 Google 推出的 Kubernetes 之外,还有 Docker 发布的 Swarm 与 Mesos 推出的 Marathon。本章将从基本概念、工作原理与安装部署及管理等方面介绍 Docker 官方推出的 Docker Swarm。

目录

一、案例一 Docker Swarm 群集部署

1.1、案例概述 

1.2、案例前置知识点 

1)Docker Swarm 概述 

2)基本特性 

3)关键概念 

4)工作原理 

1.3、案例环境 

1)案例环境 

2)案例需求 

3)案例实现思路 

二、案例一实施 

2.1、配置 Docker Swarm 部署环境 

1)主机配置 

2)安装 Docker 

2.2、部署 Docker Swarm 群集 

1)创建 Docker Swarm 群集 

2)添加 worker 节点到 Swarm 集群 

3)查看 Swarm 集群中 Node 节点的详细状态信息 

三、案例二 Docker Swarm 管理 

3.1、案例概述 

3.2、案例前置知识点 

1)Docker Swarm 中的节点 

2)服务和任务 

3.3、案例环境 

1)本案例实验环境 

2)案例需求 

3)案例实现思路 

四、案例二实施 

4.1、Docker Swarm 节点管理 

1)节点状态变更管理 

2)添加标签元数据 

3)节点提权 / 降权 

4)退出 Swarm 集群 

4.2、Docker Swarm 服务管理 

1)创建服务 

2)显示服务详细信息 

3)服务的扩容与缩容 

4)删除服务 

5)滚动更新 

6)添加自定义 Overlay 网络 

7)数据卷创建与应用 

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

1.1、案例概述 
创鑫公司给云计算工程师提出新的要求,可将集群中所有 Docker Engine 整合进一个虚拟的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。 

1.2、案例前置知识点 
1)Docker Swarm 概述 
Docker Swarm 是 Docker 社区提供的基于 Docker 的集群管理调度工具,能够将多台主机构建成一个 Docker 集群,用户通过 API 来管理多个主机上的 Docker,并结合 Overlay 网络实现容器的调度与相互访问。 

Docker Swarm 默认对外提供两种 API。 

标准的 Docker API:包括 Docker Client、Dokku、Compose、DockerUI、Jenkins 等,它们可以通过 Swarm 工具与 Docker 集群进行通信;
集群管理 API:用于集群的管理。
2)基本特性 
Docker 集群管理和编排的特性是通过 SwarmKit 进行构建的, 其中 Swarm 模式是 Docker Engine 内置支持的一种默认实现。Docker 1.12 以及更新的版本,都支持 Swarm 模式。用户可以基于 Docker Engine 构建 Swarm 集群,然后就可以将应用服务(Application Service)部署到 Swarm 集群中。 

Docker Swarm 具有如下基本特性:

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

节点 
每个参与到 Swarm 集群中的 Docker Engine 都称之为一个节点。在单个物理计算机或云服务器上运行一个或多个节点,但是生产环境下的集群部署通常包括分布在多个物理和云机器上的 Docker 节点。集群中节点主要分为管理节点与工作节点。 

若要将应用程序部署到集群中,则需要将服务定义提交给管理节点。管理节点将被称为任务的工作单元分派给工作节点。为了维持 Swarm 集群的目标状态,管理节点还将承担编排和集群管理的功能。一旦存在多个管理节点时,会选出一个领导来进行任务编排。 

工作节点用于接收并执行来自管理节点分发的任务。默认情况下,管理节点也是工作节点,也可以把它配置成只充当管理节点的角色。工作节点将所负责任务的当前状态通知给管理节点,以便管理节点可以维护每个工作节点的期望状态。

服务与任务
服务定义了需要在工作节点上执行的任务。它是 Swarm 系统的中心结构,也是用户和 Swarm 交互的主要根源。 

创建服务时,可以指定要使用的容器镜像以及在运行容器中执行的命令。

在复制服务模型中,Swarm 管理器根据所需状态中设置的比例在节点之间分配特定数量的副本任务。

任务是 Swarm 集群中最小的调度单位,每个任务都包含一个容器和需要在容器中执行的指令。管理器根据服务中定义的副本数量将任务分配给工作节点。一旦某个任务被分配到某个节点,就不能再移动到其他节点。它只能在分配的节点上运行或者失败。

负载均衡
集群管理器使用负载均衡入口来公开对外提供的服务。集群管理器可以自动为 PublishedPort(对外发布的端口)分配服务,也可以为服务配置 PublishedPort。部署服务时可以指定任何未使用的端口为服务端口;如果部署服务时未指定端口,Swarm 管理器会为服务自动分配 30000-32767 范围内的端口。 

外部组件(例如云负载均衡器)可以访问集群中任何节点的 PublishedPort 上的服务,无论该节点当前是否正在运行该服务的任务。集群中的所有节点都将入口连接到正在运行的任务实例。

Swarm 模式有一个内部 DNS 组件,可以自动为 Swarm 中的每个服务分配一个 DNS 条目。集群管理器使用内部负载均衡来根据服务的 DNS 名称在集群内的服务之间分发请求。

4)工作原理 
在 Swarm 集群中部署镜像创建一个服务时。在一些大的应用上下文环境中需要各种服务配合工作,这样的服务通常称之为微服务。微服务可能是一个 HTTP 服务器、数据库、 或者分布式环境中运行的任何其他可执行的程序。 

在创建服务时,可以指定要使用的容器镜像以及容器中要运行的命令。服务还可以定义下面选项:

集群要对外服务的端口;
在集群中用于服务之间相连的 Overlay 网络;
滚动更新策略;
集群总运行的副本数量。 
下面从以下几个方面具体介绍服务、任务与容器的具体工作方法。

服务、任务与容器 
当服务部署到集群时,Swarm 管理节点会将服务定义作为服务所需状态。然后将服务调度为一个或多个副本任务。这些任务在集群节点上彼此独立运行。 

容器是一个独立的进程。在 Swarm 集群中,每个任务都会调用一个容器。一旦容器运行,调度程序认为该任务处于运行状态。如果容器健康监测失败或者终止,那么任务也终止。

任务与调度 
任务是集群内调度的原子单位。当创建或者更新服务来声明所需的服务状态时,协调器通过调度任务来实现所需的状态。

任务是单向的机制,它通过一系列状态单独进行:分配、准备、运行等操作。如果任务失败,协调器将删除任务与容器,然后根据服务指定的所需状态创建一个新的任务来代替它。 

待处理的服务
配置服务时,若集群中当前没有可用的节点。在这种情况下,也可以成功配置服务,但所配置服务会处于待处理状态(挂起状态)。以下是服务可能处于待处理状态的几个示例。 

如果在集群中所有节点被暂停或耗尽时,创建了一个服务,服务则被挂起,直到节点可用。实际上,当节点恢复时,第一个可用的节点将会获得所有的任务,这在生产环境中并不是一件好事。

配置服务时可以为服务预留特定数量的内存。如果集群中没有节点满足所需的内存量, 服务则被挂起,直到有可用的节点运行其任务。如果指定了非常大的内存值(如 500G), 任务将永久挂起,除非确实有一个满足该条件的节点。 
配置服务时可以对服务施加约束,并且可能无法在给定时间履行约束,服务则被挂起。
副本和全局服务 
服务部署分为两种类型:副本服务和全局服务。 

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

 
主机
操作系统
主机名 / IP 地址
主要软件
服务器
 CentOS 7.9  
manager / 192.168.23.212 
Docker-ce-19.03.15
服务器 
CentOS 7.9  
worker01 / 192.168.23.213  
Docker-ce-19.03.15
服务器 
 CentOS 7.9  
 worker02 / 192.168.23.214
 Docker-ce-19.03.15

 实验环境
案例实验环境的网络拓扑如下图所示。 
 实验网络拓扑
2)案例需求 
本案例的需求如下:
部署 Docker Swarm 集群,要求集群中包含一个管理节点(manager)和两个工作节点 (worker01、worker02)。 
3)案例实现思路 
本案例的实现思路如下: 
准备 Docker Swarm 部署环境;
部署 Docker Swarm 集群。 
二、案例一实施 
2.1、配置 Docker Swarm 部署环境 
在部署 Docker Swarm 之前需要先对服务器进行基础的环境配置。 
1)主机配置 
设置主机名 
在三台主机上分别设置主机名。 
[root@centos7-12 ~]# hostnamectl set-hostname manager
[root@centos7-12 ~]# bash
[root@manager ~]# 
 
[root@centos7-13 ~]# hostnamectl set-hostname worker01
[root@centos7-13 ~]# bash    
bash
[root@worker01 ~]#
 
[root@centos7-14 ~]# hostnamectl set-hostname worker02
[root@centos7-14 ~]# bash
bash
[root@worker02 ~]#
修改 hosts 文件 
在所有主机的 hosts 文件中添加地址解析记录,下面以 manager 主机为例进行操作。 
[root@manager ~]# vim /etc/hosts
......//省略部分内容
192.168.23.212 manager
192.168.23.213 worker01
192.168.23.214 worker02
关闭防火墙 
[root@manager ~]# systemctl stop firewalld
禁用 Selinux 
[root@manager ~]# getenforce
Disabled
2)安装 Docker 
在所有主机上安装并配置 Docker。下面以 manager 主机为例进行操作。 
[root@manager ~]# yum install -y yum-utils device-mapper-persistent-data lvm2  //安装一些必要的系统工具
[root@manager ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  //添加 Docker 源地址
[root@manager ~]# yum -y install docker-ce-19.03.15 docker-ce-cli-19.03.15  //安装 Docker
[root@manager ~]# mkdir /etc/docker
[root@manager ~]# vim /etc/docker/daemon.json  //配置 Docker 镜像加速
{
  "registry-mirrors": ["https://z1qbjqql.mirror.aliyuncs.com"]
}
[root@manager ~]# systemctl daemon-reload
[root@manager ~]# systemctl enable --now docker
2.2、部署 Docker Swarm 群集 
安装完 Docker 后,可以使用 docker swarm 命令创建 Docker Swarm 集群。 
1)创建 Docker Swarm 群集 
创建 Docker Swarm 集群命令格式为:
docker swarm init --advertise-addr <MANAGER-IP> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux运维老纪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值