Docker 集群之(swarm)

什么是 Docker 集群?

Swarm 将一个或多个 Docker 【节点】组织起来,使得用户能够以集群方式管理它们;

  • 这些节点可以是物理服务器、虚拟机、树莓派(Raspberry Pi)或云实例;
  • 节点会被配置为管理节点(Manager)或工作节点(Worker)。
  1. 管理节点负责集群控制面(Control Plane),进行诸如监控集群状态、分发任务至工作节点等操作。
  2. 工作节点接收来自管理节点的任务并执行。

【集群搭建的注意事项】

  • 安全性:要求所有节点通过可靠的网络相连;搭建 Swarm 集群时将不可避免地使用 TLS(安全传输层协议),因为它被 Swarm 紧密集成。在安全意识日盛的今天,这样的工具值得大力推广。Swarm 使用 TLS 进行通信加密、节点认证和角色授权。自动密钥轮换(Automatic Key Rotation)更是锦上添花!其在后台默默进行,用户甚至感知不到这一功能的存在。

Docker 集群之(swarm)_第1张图片

 

为什么要使用 Docker 集群?

Docker 集群之(swarm)_第2张图片

docker 在单机(单节点)环节下面,部署两个容器分别是 nginx 和 netcore ,假如 docker 主机宕机,意味着其上面的容器服务也随之不可用,再从客户端角度看,客户端的访问数量是不确定性的,随时都可能增多,而相对于单节点的 docker 主机,提供服务的负载能力也有上限,不能满足高并发场景,最终导致容器服务不可用,总结为以下两点:

  1. 单节点 docker 主机不能提供服务的高可用性;
  2. 单节点 docker 主机不能满足高并发服务访问;

针对以上面临的问题,因此需要对单节点 docker 主机进行集群,集群展示如下:

 Docker 集群之(swarm)_第3张图片

docker 集群解决的问题(提供服务的高可用):

  1. 提高并发量;
  2. 解决单点故障问题;

【swarm 如何管理 docker 集群】

Docker 集群之(swarm)_第4张图片

 以上环节中,docker swarm 通过角色(manager-worker)配置实现 docker 主机集群,同样管理节点(manager)也可以多个节点集群。

  • manager :
  1. 集群配置;
  2. 容器服务管理;
  3. 负载均衡;
  4. 集群其他配置;
  • worker:
  1. 提供容器服务

类似 redis 中的主(mastere)从(slaver)配置;

 

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 中是一个新的对象元素,它基于容器封装了一些高级特性,是一个更高层次的概念。当容器被封装在一个服务中时,我们称之为一个任务或一个副本,服务中增加了诸如扩缩容、滚动升级以及简单回滚等特性。

 

如何搭建 Docker 集群?

通过service,task,stack去配置容器;

  • service =》docker 不同主机(工作节点)容器的集合;
  • task =》供 service 启动集群环境容器;
  • stack =》多个 service 的集合;

Docker 集群之(swarm)_第5张图片

docker 集群准备:

  1. 两台云主机或VM,分别安装docker;
  2. docker-swarm;

备注:在哪里操作哪个就是管理节点,所有操作只需在管理节点处理,工作节点无需担心;

上面我们对docker集群的原理做了简单的介绍,接下来我们实践操作,【docker-swarm】集群的搭建过程;

【Swarm集群搭建过程】

  • 初始化一个集群工作节点 =》docker swarm init --advertise-addr [localhost] 默认为管理节点,
  • 如果该节点已经存在,删除节点 =》docker swarm leave -f 

Docker 集群之(swarm)_第6张图片

  • 另外一台docker主机加入集群节点(work工作节点)

  • 查看节点详细列表信息 =》docker --info

Docker 集群之(swarm)_第7张图片

【集群环境中如何配置services(容器)集合】

  • 镜像仓库准备所需的部署的镜像,比如:nginx 和 netcore

Docker 集群之(swarm)_第8张图片

  • 创建service =》docker service create --replicas 1 --name netcoreservice 参数 --replicas 指定集群数量,--name 为service取名;

Docker 集群之(swarm)_第9张图片

  • 查看【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

Docker 集群之(swarm)_第10张图片

【集群中 stack 创建两个 service】

Docker 集群之(swarm)_第11张图片

 【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 集群之(swarm)_第12张图片

  • 如果管理节点不存在 docker-compose.yml 文件就创建一个 =》 vi docker-compose.yml 创建文件并且进入编辑

Docker 集群之(swarm)_第13张图片

  • 管理节点的 stack 目录中创建的 docker-compose.yml 文件配置编辑信息如下:

Docker 集群之(swarm)_第14张图片

  • Stack 命令 =》docker stack --help

Docker 集群之(swarm)_第15张图片

  • 通过 docker-compose.yml 中的 deploy 配置信息,使用 stack 管理命令启动 =》docker stack deploy -c docker-compose.yml rmstack 创建的stack标识为rmstack
  • 查看 stack 创建的列表目录信息 =》docker stack ls

Docker 集群之(swarm)_第16张图片

  • 查看 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缺陷】

  1. 无法监控某一个docker节点(主机)=》解决方案 k8s
  2. 安装docker主机耗时;每安一次OS环境都需要对应的配置一次docker主机,比如:10台linux系统,需要安装10个docker主机 =》docker-machine(关键),参考:https://www.cnblogs.com/sparkdev/p/7066789.html
  3. 集群容器如何做数据持久化? =》volums 数据卷(关键)
  4. 当service的work节点容器宕机,无法监控和感知;

 针对以上【swarm缺陷】的解决方案 =》【k8s/Kubermetes】

你可能感兴趣的:(Docker,&,Podman,swarm,docker,service,stack,task)