Docker容器虚拟化技术—Docker运维管理(Swarm集群管理)3




Swarm集群管理

docker swarm是docker官方提供的一套容器编排系统,是Docker公司推出的官方容器集群平台。

基于Go语言实现。它的架构如下:

Docker 集群 doris docker 集群化管理_Docker 集群 doris

1 Swarm的核心概念

1.1 集群

一个集群由多个 Docker 主机组成,这些Docker主机以集群模式运行,并充当管理者(用于管理成员资格和委派)和工作人员(运行集群服务)

与独立容器相比,集群服务的主要优势之一是,可以修改服务的配置,包括它所连接的网络和卷,而无需手动重新启动服务。

独立容器和集群服务之间的主要区别在于,只有集群管理器可以管理集群,而独立容器可以在任何守护程序上启动。

1.2 节点

swarm是一系列节点的集合,而节点可以是一台裸机或者一台虚拟机。一个节点能扮演一个或者两个角色,manager或者worker

manager节点
Docker Swarm集群需要至少一个manager节点,节点之间使用 Raft consensus protocol 进行协同工作。 通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。

当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。 每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用

worker节点
worker节点是运行实际应用服务的容器所在的地方。理论上,一个manager节点也能同时成为worker节点,但在生产环境中,我们不建议这样做。 worker节点之间,通过 control plane 进行通信,这种通信使用 gossip 协议,并且是异步的

1.3 服务和任务

集群中的stacks, services, tasks的关系,如下图:

Docker 集群 doris docker 集群化管理_Docker 集群 doris_02


services(服务)

swarm service是一个抽象的概念,它只是一个对运行在swarm集群上的应用服务,所期望状态的描述。它就像一个描述了下面物品的清单列表一样:

  • 服务名称
  • 使用哪个镜像来创建容器
  • 要运行多少个副本
  • 服务的容器要连接到哪个网络上
  • 应该映射哪些端口

task(任务)
在Docker Swarm中,task是一个部署的最小单元,task与容器是一对一的关系

stack(栈)
stack是描述一系列相关services的集合。我们通过在一个YAML文件中来定义一个stack

1.4 负载均衡

集群管理器使用入口负载平衡将要从集群外部获取的服务公开给集群。
集群管理器可以自动为服务分配一个已发布端口,也可以为该服务配置一个已发布端口。
可以指定任何未使用的端口。如果未指定端口,则集群管理器会为服务分配 30000-32767 范围内的端口。

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

2 Swarm安装

对于Docker 1.12+版本,Swarm相关命令已经原生嵌入到了Docker Engine中

2.1 下载镜像
docker pull swarm

Docker 集群 doris docker 集群化管理_docker_03

docker images

Docker 集群 doris docker 集群化管理_Docker 集群 doris_04

2.2 查看版本
# 查看版本 
	docker run --rm swarm -v

Docker 集群 doris docker 集群化管理_nginx_05

3 Swarm集群

3.1 创建新集群
docker swarm init --advertise-addr 192.168.80.60

Docker 集群 doris docker 集群化管理_swarm_06

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。

其中,–advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输 出包含了其它节点如何加入集群的命令。

# 将节点强制驱除集群 
	docker swarm leave --force
3.2 查看集群状态和节点信息
docker info

Docker 集群 doris docker 集群化管理_Docker 集群 doris_07

docker node ls

Docker 集群 doris docker 集群化管理_docker_08

3.3 添加工作节点到集群

创建了一个swarm集群与管理器节点,就可以添加工作节点。

  • 新创建虚拟机dockerManager
  • 在工作节点192.168.80.70上安装docker和docker swarm

Docker 集群 doris docker 集群化管理_docker_09

在工作节点192.168.80.70上添加工作节点到集群命令:

docker swarm join --token SWMTKN-1-0i3j7ach1qm8feoewpka6lg84judwrzt5z762hhn9a40dq5xj2-56blivoil7tr4dgef1vwcwglf 192.168.146.60:2377

Docker 集群 doris docker 集群化管理_nginx_10

如果忘记了token的值,在管理节点192.168.80.60上执行下述命令(在管理节点上运行)

docker swarm join-token manager 
	docker swarm join-token worker

Docker 集群 doris docker 集群化管理_swarm_11

在管理节点192.168.80.60上查看节点信息(在管理节点上运行)

docker node ls

Docker 集群 doris docker 集群化管理_Docker 集群 doris_12

3.4 发布服务到集群(在管理节点上运行)

在管理节点192.168.80.60上

docker service create  -p 80:80  --replicas 2 --name nginx1 nginx 
	
	# 参数介绍
		-p :端口映射
		--replicas:运行实例个数
		--name:服务名
		nginx : 镜像名称

Docker 集群 doris docker 集群化管理_swarm_13

Docker 集群 doris docker 集群化管理_docker_14


查看哪些节点正在运行服务(在管理节点上运行)

docker service ps nginx1

Docker 集群 doris docker 集群化管理_Docker 集群 doris_15

停止并删除发布的服务(在管理节点上运行)

docker service rm nginx1

Docker 集群 doris docker 集群化管理_Docker 集群 doris_16

在工作节点上运行的命令

docker ps

Docker 集群 doris docker 集群化管理_Docker 集群 doris_17

3.5 扩展一个或多个服务

Docker 集群 doris docker 集群化管理_swarm_18

docker service scale mynginx=3
	
		
	docker service ls
	docker service ps mynginx

Docker 集群 doris docker 集群化管理_docker_19

3.6 更新服务
docker service update --publish-rm 80:80 --publish-add 88:80 nginx1

Docker 集群 doris docker 集群化管理_docker_20

3.7 节点管理

命令名称

说明

docker node demote

从群集(swarm)管理器中降级一个或多个节点

docker node inspect

显示一个或多个节点的详细信息

docker node ls

列出群集(swarm)中的节点

docker node promote

从群集(swarm)管理器中升级一个或多个节点

docker node ps

列出在一个或多个节点上运行的任务,默认为当前节点

docker node rm

从群集(swarm)删除一个或多个节点

docker node update

更新一个节点

#给工作节点(localhost.localdomain,可以设置主机名更改节点名称)添加worker1标签
	docker node update --label-add  myworker1 localhost.localdomain

Docker 集群 doris docker 集群化管理_Docker 集群 doris_21

#给工作节点(localhost.localdomain)节点停用 
	docker node update --availability drain localhost.localdomain

Docker 集群 doris docker 集群化管理_nginx_22

#停止工作节点(localhost.localdomain)
	docker systemctl stop docker

Docker 集群 doris docker 集群化管理_swarm_23

#删除工作节点(localhost.localdomain),需要先停止工作节点,才能删除
	docker node rm localhost.localdomain

Docker 集群 doris docker 集群化管理_docker_24

3.8 如果添加工作节点到集群中报错

Docker 集群 doris docker 集群化管理_Docker 集群 doris_25

解决:防火墙没关

管理节点关闭防火墙

Docker 集群 doris docker 集群化管理_Docker_26

工作节点关闭防火墙,重新加入swarm集群

Docker 集群 doris docker 集群化管理_swarm_27