什么是 Docker 集群?
Swarm 将一个或多个 Docker 【节点】组织起来,使得用户能够以集群方式管理它们;
- 这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例;
节点会被配置为管理节点(Manager)或工作节点(Worker)。
- 管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。
- 工作节点接收来自管理节点的任务并执行。
【集群搭建的注意事项】
- 安全性:要求所有节点通过可靠的网络相连;
搭建 Swarm 集群时将不可避免地使用 TLS(安全传输层协议),因为它被 Swarm 紧密集成。在安全意识日盛的今天,这样的工具值得大力推广。Swarm 使用 TLS 进行通信加密、节点认证和角色授权。自动密钥轮换(Automatic Key Rotation)更是锦上添花!其在后台默默进行,用户甚至感知不到这一功能的存在。
为什么要使用 Docker 集群?
docker 在单机(单节点)环节下面,部署两个容器分别是 nginx 和 netcore ,假如 docker 主机宕机,意味着其上面的容器服务也随之不可用,再从客户端角度看,客户端的访问数量是不确定性的,随时都可能增多,而相对于单节点的 docker 主机,提供服务的负载能力也有上限,不能满足高并发场景,最终导致容器服务不可用,总结为以下两点:
- 服务器角度:单节点 docker 主机不能提供服务的高可用性;
- 客户端角度:单节点 docker 主机不能满足高并发服务访问;
Docker 集群解决什么问题?
针对以上面临的问题,因此需要对单节点 docker 主机进行集群,集群展示如下:
Docker 集群解决的问题(提供服务的高可用):
- 提高并发量;
- 解决单点故障问题;
Docker Swarm 集群工具简介
- Swarm 是 Dcoker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源;
- Swarm 和 Kubernetes 比较类似,但是更加轻,具有的功能也较 kubernetes 更少一些;
- Docker Swarm 包含两方面:1.企业级的 Docker 安全集群 & 2.微服务应用编排引擎;
- Swarm 的配置和状态信息保存在一套位于所有管理节点上的分布式 etcd 数据库中。该数据库运行于内存中,并保持数据的最新状态。关于该数据库最棒的是,它几乎不需要任何配置,作为 Swarm 的一部分被安装,无须管理;
- Swarm 默认内置有加密的分布式集群存储(encrypted distributed cluster store)、加密网络(Encrypted Network)、公用TLS(Mutual TLS)、安全集群接入令牌 Secure Cluster Join Token)以及一套简化数字证书管理的 PKI(Public Key Infrastructure)。我们可以自如地添加或删除节点;
- Swarm 提供了一套丰富的 API 使得部署和管理复杂的微服务应用变得更加方便。通过将应用定义在声明式配置文件中,就可以使用原生的 Docker 命令完成部署。甚至还可以执行滚动升级、回滚以及扩缩容操作;
关于应用编排,Swarm 中的最小调度单元是服务;它是随 Swarm 引入的,在 API 中是一个新的对象元素,它基于容器封装了一些高级特性,是一个更高层次的概念。当容器被封装在一个服务中时,我们称之为一个任务或一个副本,服务中增加了诸如扩缩容、滚动升级以及简单回滚等特性。
Swarm 如何管理 Docker 集群?
以上环节中,docker swarm
通过角色(manager-worker
)配置实现 docker
主机集群,同样管理节点(manager
)也可以多个节点集群。
manager(管理节点)
- 集群配置;
- 容器服务管理;
- 负载均衡;
- 集群其他配置;
worker(工作节点)
- 提供容器服务
说明:类似 redis 中的主(mastere)从(slaver)配置;
如何搭建 Swarm 集群?
通过 service,task,stack
去配置容器;
- service =》docker 不同主机(工作节点)容器的集合;
- task =》供 service 启动集群环境容器;
- stack =》多个 service 的集合;
Swarm 集群准备
- 两台云主机或 VM,分别安装 docker;
- docker-swarm;
备注:在哪里操作哪个就是管理节点,所有操作只需在管理节点处理,工作节点无需担心;
上面我们对 docker
集群的原理做了简单的介绍,接下来我们实践操作,【docker-swarm】集群的搭建过程;
Swarm 集群搭建过程
- 首先初始化一个集群工作节点 =》docker swarm init --advertise-addr [localhost] 默认为管理节点,
- 如果该节点已经存在,删除节点 =》docker swarm leave -f
- 另外一台 docker 主机加入集群节点(work工作节点)
- 查看节点详细列表信息 =》docker --info
集群环境中如何配置 services(容器)集合
- 镜像仓库准备所需的部署的镜像,比如:nginx 和 netcore
- 创建 service =》docker service create --replicas 1 --name netcoreservice 参数 --replicas 指定集群数量,--name 为service取名;
- 查看【rmcoreservice】在哪个 docker 主机节点运行 =》docker service ps rmcoreservice
- 查看容器列表信息 =》docker container ls -a
- 删除 rmcoreservice 服务 =》docker service rm rmcoreservice
备注:所有 service 的操作,全在管理节点操作,管理节点删除service 集群的工作节点也随之删除,
证明:在 worker 工作节点查看 service 列表=》docker serice ls 工作节点无权操作,显示如下:
- 从镜像 rmcore 创建服务,指定两个工作节点,并暴露服务端口(映射) =》docker service create --replicas 2 --name rmcoreservice --publish 6066:80 rmcore
集群中 stack 创建两个 service
deploy 可选参数配置详解
endpoint_mode:访问集群服务的方式。
endpoint_mode: vip
# Docker 集群服务一个对外的虚拟 ip。所有的请求都会通过这个虚拟 ip 到达集群服务内部的机器。
endpoint_mode: dnsrr
# DNS 轮询(DNSRR)。所有的请求会自动轮询获取到集群 ip 列表中的一个 ip 地址。
labels:在服务上设置标签。可以用容器上的 labels(跟 deploy 同级的配置) 覆盖 deploy 下的 labels。
mode:指定服务提供的模式。
replicated:复制服务,复制指定服务到集群的机器上。
global:全局服务,服务将部署至集群的每个节点。
replicas:mode 为 replicated 时,需要使用此参数配置具体运行的节点数量。
resources:配置服务器资源使用的限制,例如上例子,配置 redis 集群运行需要的 cpu 的百分比 和 内存的占用。避免占用资源过高出现异常。
restart_policy:配置如何在退出容器时重新启动容器。
condition:可选 none,on-failure 或者 any(默认值:any)。
delay:设置多久之后重启(默认值:0)。
max_attempts:尝试重新启动容器的次数,超出次数,则不再尝试(默认值:一直重试)。
window:设置容器重启超时时间(默认值:0)。
rollback_config:配置在更新失败的情况下应如何回滚服务。
parallelism:一次要回滚的容器数。如果设置为0,则所有容器将同时回滚。
delay:每个容器组回滚之间等待的时间(默认为0s)。
failure_action:如果回滚失败,该怎么办。其中一个 continue 或者 pause(默认pause)。
monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
max_failure_ratio:在回滚期间可以容忍的故障率(默认为0)。
order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认 stop-first )。
update_config:配置应如何更新服务,对于配置滚动更新很有用。
parallelism:一次更新的容器数。
delay:在更新一组容器之间等待的时间。
failure_action:如果更新失败,该怎么办。其中一个 continue,rollback 或者pause (默认:pause)。
monitor:每个容器更新后,持续观察是否失败了的时间 (ns|us|ms|s|m|h)(默认为0s)。
max_failure_ratio:在更新过程中可以容忍的故障率。
order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)
- 管理节点创建 stack 目录 =》mkdir stack
- 查看当前目录列表,切换到 compose
- 如果管理节点不存在
docker-compose.yaml
文件就创建一个 =》 vi docker-compose.yml 创建文件并且进入编辑
- 管理节点的 stack 目录中创建的
docker-compose.yaml
文件配置编辑信息如下:
- Stack 命令 =》docker stack --help
- 通过 docker-compose.yml 中的 deploy 配置信息,使用 stack 管理命令启动 =》docker stack deploy -c docker-compose.yml rmstack 创建的stack标识为rmstack
- 查看 stack 创建的列表目录信息 =》docker stack ls
- 查看 stack 中创建的 service =》docker service ls 创建的服务 rmstack_nginx, rmstack_rmcore
- 再次查看容器列表目录 =》docker container ls
以上过程就完成 stack 的集群配置;
- 删除 stack 配置 =》docker stack rm rmstack
注意:管理节点创建和删除集群操作,工作节点也随之删除。
docker-swarm 命令集合
- 查看 swarm 工具管理命令 =》docker swarm --help
指令 | 说明 |
ca | 显示CA证书 |
init | 初始化swarm 集群,并创建管理节点 |
join | 将其他docker节点加入集群,创建工作节点,被管理节点管理 |
join-token | 将其他docker节点加入集群,创建工作节点,被管理节点管理[这个是管理节点令牌] |
leave | 离开集群 |
unlock | 打开集群 |
unlock-key | 管理解锁键key |
update | 更新群集群 |
Swarm 缺陷
- 无法监控某一个docker节点(主机)=》解决方案 k8s
- 安装docker主机耗时;每安一次OS环境都需要对应的配置一次docker主机,比如:10台linux系统,需要安装10个docker主机 =》docker-machine(关键),参考:https://www.cnblogs.com/sparkdev/p/7066789.html
- 集群容器如何做数据持久化? =》volums 数据卷(关键)
- 当 service 的 work 节点容器宕机,无法监控和感知;
针对以上【swarm缺陷】的解决方案 =》【k8s/Kubermetes】