引言
-
容器编排部署工具—— Google 的 Kubernetes 、Docker 的 Swarm 、Mesos 的 Marathon
一、了解 Docker Swarm 工具
1.1 容器编排工具的产生
-
Docker 只能在单机上运行,其跨主机部署、运行与管理能力颇受外界诟病
-
跨主机能力薄弱,导致 Docker 容器与主机的形成高度耦合,降低了 Docker 容器的灵活性,难以实现容器的迁移、分组等功能
1.2 什么是Docker Swarm
-
Docker Swarm是Docker公司2014年出品的基于Docker的集群管理调度工具,能够将多台主机构建成一个Docker集群,并结合Overlay网络实现容器调度和互访
-
用户可以只通过Swarm API来管理多个主机上的Docker
-
Swarm集群包含Manager和Worker两类工作节点,基于Docker Engine可以部署任何类型的工作节点
1.3 Docker Swarm 集群基本特性
-
集群管理集成进 Docker Engine:使用内置的集群管理功能,可以直接通过 Docker CLI 命令来创建 Swarm 集群,并部署应用服务,而不需要其它外部软件来创建和管理Swarm 集群。
-
去中心化设计: Swarm 集群中包含管理节点(Manager)和工作节点(Worker)两类, 可以直接基于 Docker Engine 来部署任何类型的节点。在 Swarm 集群运行期间,可以对其作出任何改变,实现对集群的扩容和缩容等,如添加与删除节点。而做这些操作时不需要暂停或重启当前的 Swarm 集群服务。
-
声明式服务模型:在实现的应用栈中,Docker Engine 使用了一种声明的方式,可以定义各种所期望的服务状态。
-
缩放:对于每个服务,可以声明要运行的任务数。向上或向下扩展时,Swarm 集群会通过添加或删除任务来自动调整以维持所需的状态。
-
协调预期状态与实际状态的一致性:管理节点会不断地监控并协调集群的状态,使得Swarm 集群的预期状态和实际状态保持一致。
-
多主机网络:Swarm 集群支持多主机网络,可以为服务指定覆盖网络。管理节点在初始化或更新应用程序时自动为覆盖网络上的容器分配地址。
-
服务发现:管理节点会给 Swarm 集群中每一个服务分配一个唯一的 DNS 名称,对运行中的 Docker 容器进行负载均衡。可以通过 Swarm 内置的 DNS 服务器,查询 Swarm 集群中运行的 Docker 容器状态。
-
负载均衡:在 Swarm 集群中,可以指定如何在各个 Node 之间分发服务容器(Service Container),实现负载均衡。如果想要使用 Swarm 集群外部的负载均衡器,可以将服务容器的端口暴露到外部。
-
安全策略:Swarm 集群中的每个节点都强制执行 TLS 相互身份验证和加密,以保护自身与所有其他节点之间的通信。用户可以选择使用自签名根证书或自定义根 CA 的证书。
-
滚动更新:对于服务需要更新的场景,可以在多个节点上进行增量部署更新,在 Swarm 管理节点使用 Docker CLI 设置一个 delay(延迟)时间间隔,实现多个服务在多个节点上依次进行部署,这样可以非常灵活地控制。如果有一个服务更新失败,则暂停后面的更新操作,重新回滚到更新之前的版本。
1.4 Docker Swarm 集群架构
-
Docker Swarm提供了基本的集群能力,能够使多个Docker Engine组合成一个group,提供多容器服务
-
Swarm使用标准的Docker APl
1.5 Docker Swarm 集群工作原理
-
在Swarm集群中部署镜像创建一个服务时,一些大的应用上下文环境中需要各种服务配合工作,这样服务通常称之为微服务
-
创建服务时,可以指定要使用的容器镜像以及容器中要运行的命令,同时还可以定义以下选项:
-
群集要对外服务的端口
-
在群集中用于服务之间相连的overlay网络
-
滚动更新策略
-
群集总运行的副本数量
-
1.5.1 服务、任务与容器的具体工作方法
(1)服务、任务与容器
当服务部署到集群时,Swarm 管理节点会将服务定义作为服务所需状态。然后将服务调度为一个或多个副本任务,即一组任务的集合。这些任务在集群节点上彼此独立运行。 任务是swarm集群中最小的调度单位,所对应的就是容器。容器是一个独立的进程。在 Swarm 集群中,每个任务都会调用一个容器。一旦容器运行,调度程序认为该任务处于运行状态。如果容器健康监测失败或者终止,那么任务也终止。 (2)任务与调度
任务是集群内调度的原子单位。当创建或者更新服务来声明所需的服务状态时,协调器通过调度任务来实现所需的状态。 任务是单向的机制,它通过一系列状态单独进行:分配、准备、运行等操作。如果任务失败,协调器将删除任务与容器,然后根据服务指定的所需状态创建一个新的任务来代替它。
(3)待处理的服务
配置服务时,若集群中当前没有可用的节点。在这种情况下,也可以成功配置服务,但所配置服务会处于待处理状态(挂起状态)。
-
配置服务时可以为服务预留特定数量的内存。如果集群中没有节点满足所需的内存量, 服务则被挂起,直到有可用的节点运行其任务。如果指定了非常大的内存值(如 500G),任务将永久挂起,除非确实有一个满足该条件的节点。
-
配置服务时可以对服务施加约束,并且可能无法在给定时间履行约束,服务则被挂起。
(4)副本服务和全局服务
服务工作模式分为两种类型:副本服务和全局服务。
-
副本服务:指定要运行的相同任务的数量,每个副本都是相同的内容。默认是副本服务,可以使用 -mode 指定。
-
全局服务:是在每个节点上都运行一个任务的服务。不需要预先指定任务数量。每当将一个节点添加到集群中,调度器将创建一个任务,并且调度器将任务分配给新加入的节点。全局服务最好是监控代理、反病毒扫描程序等等想要在集群中每个节点上运行的容器。
二、docker swarm 集群相关管理操作
资源列表
操作系统 | 配置 | 主机名/IP |
---|---|---|
Centos 7.9 | 2G2C | manager/172.16.10.10 |
Centos 7.9 | 2G2C | worker01/172.16.10.11 |
Centos 7.9 | 2G2C | worker02/172.16.10.12 |
2.1 初始化创建docker swarm 集群
# 初始化创建docker swarm 集群 docker swarm init --advertise-addr 172.16.10.10
2.2 集群查看相关命令
# 查看集群相关信息 docker info # 查看docker swarm 集群节点(仅manager身份可以操作) docker node ls ==集群状态 STATUS == active 表示集群中该几点==节点可以被指派任务 pause 集群中该节点不能指派新任务,但是已经运行的可以继续运行 drain 集群中该节点不能指派新任务,已经运行的任务会停止,并调度到其他节点
2.3 节点加入 docker swarm 集群
# 获取以worker身份加入docker swarm 集群的命令 docker swarm join-token worker # 获取以manager身份加入docker swarm 集群的命令 docker swarm join-token manager
2.4 节点退出 docker swarm 集群
-
哪个节点退出在哪个节点执行
-
manager管理身份节点无法直接退出集群,若强制退出,则该节点后期无法再加入集群
# 节点退出docker swarm集群 docker swarm leave # 删除已退出docker swarm集群节点(仅manager身份可以操作) docker node rm 节点ID # 若是manager身份节点要退出集群可先先降权再退出 ##降权,将manager身份节点降权为worker身份节点 docker node demote 节点NAME docker swarm leave docker node rm 节点ID
2.5 节点身份升权降权
# 降权 docker node demote [节点NAME] docker node demote worker01 # 升权 docker node promote [节点NAME] docker node promote worker01
2.6 更改docker swarm 集群中节点状态
##查看docker swarm 集群节点(仅manager身份可以操作) docker node ls ==集群状态 STATUS == active 表示集群中该几点==节点可以被指派任务 pause 集群中该节点不能指派新任务,但是已经运行的可以继续运行 drain 集群中该节点不能指派新任务,已经运行的任务会停止,并调度到其他节点 # 更改docker swarm 集群中节点状态 docker node update --availability [状态] [节点NAME] docker node update --availability drain manager
2.7 节点加标签
# 添加节点标签 docker node update --label-add [标签内容] [节点NAME] docker node update --label-add jifang=henan worker01 # 查看节点详细信息 docker node inspect worker01 docker node inspect [节点NAME] # 删除节点标签 docker node update --label-rm [标签] [节点NAME] docker node update --label-rm jifang worker01
三、在Docker Swarm 集群中部署服务
3.1 创建服务
# 创建服务 docker service create [--replicas 副本数] [-p 端口映射] [--name 服务名] [镜像] docker service create --replicas 2 --name web nginx --replicas 指定副本数 --name 指定服务名 -p 指定端口映射关系 # 查看集群中的服务 docker service ls ID NAME MODE REPLICAS IMAGE PORTS zpumurz95cok web replicated 2/2 nginx:latest # 查看集群中服务的详细xinx docker service ps [服务名] docker service ps web
3.2 修改期望值(增加缩减副本数)
# 增加期望值(原期望副本数为2),增加到3个 docker service scale [服务名]=[数量] docker service scale web=3 # 查看集群中的服务 docker service ls ID NAME MODE REPLICAS IMAGE PORTS zpumurz95cok web replicated 3/3 nginx:latest # 缩减期望值(原期望副本数为2),缩减为1个 docker service scale web=1 docker service ls ID NAME MODE REPLICAS IMAGE PORTS zpumurz95cok web replicated 1/1 nginx:latest
3.3 添加服务端口映射
# 添加服务端口映射 docker service update --publish-add [映射关系] [服务名] docker service update --publish-add 18080:80 web
3.4 删除集群中服务
# 删除集群中服务 docker service rm [服务名] docker service rm web
3.5 查看集群中服务的日志
# 查看集群中服务的日志 docker service logs -f [服务名] docker service logs -f web -f 实时查看
3.5 滚动更新
# 创建服务时添加滚动更新 docker service create --replicas 3 --name redis --update-delay 10s redis:3.0.6 --update-delay 指定滚动更新间隙 # 更新服务镜像(更新的版本镜像必须存在) docker service update --image redis:3.0.7 redis --image 指定更新的版本 # rollback 回滚,回到更新之前的版本 docker service rollback [服务名]
3.5 创建网络并创建服务时指定网络
# 创建网络 docker network create --driver overlay [网络名] # 查看网络 docker network ls # 指定网络 docker service create --replicas 2 [--network 网络名] [--name 服务名] [镜像] --network 指定网络
3.6 创建数据卷并挂载
# 创建数据卷 docker volume create [卷名] docker volume create test # 创建服务并挂载 docker service create --mount type=volume,src=kgc,dst=/usr/share/nginx/html --replicas 1 --name web01 nginx ==挂载type类型== volume 需要指定volume卷,通过 "docker volume inspect 卷名" 来查看挂载到宿主机的哪个目录下 bind 需要指定宿主机挂载目录,并且目录内容会覆盖容器挂载目录下的内容 # 查看卷的详细信息 docker volume inspect [卷名]