Swarm集群编排

什么是Swarm

Swarm是Docker公司自研发的容器集群管理系统,Swarm在晚期是作为一个独立服务存在,在Docker Engine v1.12中集成了Swarm的集群治理,和编排性能。能够通过初始化Swarm或退出现有Swarm来启用Docker引擎的Swarm模式。

Docker Engine CLI和API包含了治理Swarm节点命令,比方增加、删除节点,以及在Swarm中部署和编排服务,也减少了服务栈(Stack)、服务(Service)、工作(Task)概念

Swarm能干什么

Swarm是Docker 引擎内置(原生)的集群治理和编排工具。Docker Swarm是 Docker 官网三剑客我的项目之一,swarm是基于docker平台实现的集群技术,他能够通过几条简略的指令疾速的创立一个docker集群,接着在集群的共享网络上部署利用,最终实现分布式的服务。

swarm节点
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协定,并且是异步的。

运行机制

名词解释
集群中常常谈到的stacks, services, tasks,他们之间的关系。

上面简略解释一下这三者的含意:
task

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

services

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

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

stack是形容一系列相干services的汇合。咱们通过在一个YAML文件中来定义一个stack。

工作原理
服务、工作和容器

当将服务部署到集群时,管理者将服务定义视为服务所需状态。而后将服务调度为一个或多个正本工作。这些工作在集群的节点上彼此独立运行。

例如下图有三个正本的HTTP服务,每个服务实例就是一个工作。

容器是一个独立的过程,在swarm模型中,每个工作调用一个容器。工作相似于插槽,调度器将容器放入其中。一旦容器运行,调度器认为该工作处于运行状态。如果容器呈现衰弱监测失败或者终止,那么工作也终止。

正本和全局服务
有两种类型的服务部署:正本和全局。

对于正本服务,指定要运行的雷同工作的数量,每个正本都是雷同的内容。

全局服务是在每个节点上运行一个工作的服务。不须要预先指定工作数量。每当将一个节点增加到集群中,协调者将创立一个工作,并且调度器将任务分配给该新退出的节点。全局服务最好是监控代理、反病毒扫描程序等等想要在集群中每个节点上运行的容器。

下图显示三个正本服务(黄色)和全局服务(灰色):

性能特点(理解)

集成的集群治理

应用Docker Engine CLI创立一组Docker引擎,您能够在其中部署应用程序服务。您不须要其余编排软件来创立或治理群集。

节点分散式设计

Docker Engine不是在部署时解决节点角色之间的差别,而是在运行时解决角色变动。您能够应用Docker Engine部署两种类型的节点,治理节点和工作节点。这意味着您能够从单个服务器构建整个群集。

申明性服务模型

Docker Engine应用申明性办法来定义应用程序堆栈中各种服务的所需状态。例如,您能够形容由具备音讯队列服务和数据库后端的Web前端服务组成的应用程序。

可扩容与缩放容器

对于每个服务,您能够申明要运行的工作数。当您向上或向下缩放时,swarm管理器通过增加或删除工作来主动适应,以放弃所需的工作数量来保障集群的牢靠状态。

容器容错状态协调

群集管理器节点一直监督群集状态,并协调您示意的冀望状态的理论状态之间的任何差别。

例如,如果设置一个服务以运行容器的10个正本,并且托管其中两个正本的工作程序计算机解体,则管理器将创立两个新正本以替换解体的正本。 swarm管理器将新正本调配给正在运行和可用的worker节点上。

多主机网络

您能够为服务指定笼罩网络。当swarm管理器初始化或更新应用程序时,它会主动为笼罩网络上的容器调配地址。

服务发现

Swarm管理器节点为swarm中的每个服务调配惟一的DNS名称,并负载平衡运行的容器。您能够通过嵌入在swarm中的DNS服务器查问在群中运行的每个容器。

负载平衡

您能够将服务的端口公开给内部负载平衡器。在外部,swarm容许您指定如何在节点之间散发服务容器。

缺省平安

群中的每个节点强制执行TLS互相验证和加密,以爱护其本身与所有其余节点之间的通信。您能够抉择应用自签名根证书或来自自定义根CA的证书。

滚动更新

在曾经运行期间,您能够增量地应用服务更新到节点。 swarm管理器容许您管制将服务部署到不同节点集之间的提早。如果呈现任何问题,您能够将工作回滚到服务的先前版本。

筹备环境

服务器筹备
我的三台测试机
IP地址角色主机名
192.168.64.153managernode1
192.168.64.154workernode2
192.168.64.155workernode3
服务器端口凋谢
在创立集群前,如果开启了防火墙,请确认三台主机的防火墙能让swarm需要的端口凋谢,须要关上主机之间的端口,以下端口必须可用。在某些零碎上,这些端口默认为关上。
  • 2377:TCP端口2377用于集群治理通信
  • 7946:TCP和UDP端口7946用于节点之间的通信
  • 4789:TCP和UDP端口4789用于笼罩网络流量
能够间接禁用零碎防火墙来让这些端口通信不受限制,个别测试环境咱们都会禁用防火墙
systemctl stop firewalld(立刻失效)systemctl disable firewalld(重启失效)

搭建Swarm集群

当首次装置并应用Docker Engine时,默认状况下swarm模式是禁用的。当启用swarm模式时,能够应用docker service 服务治理命令。

有两种形式在swarm模式下运行引擎:

  • 创立一个新的集群
  • 退出现有集群

    在生成环境中,集群模式提供具备集群治理性能的容错平台,以保障服务的牢靠运行。

上面咱们就来搭建一个swarm集群
初始化集群
docker swarm init --advertise-addr 192.168.64.153(本机地址)

生成口令
生成治理节点口令
docker swarm join-token manager

生成执行节点口令
docker swarm join-token worker

其余节点退出集群
在第一个从节点执行退出 work的指令
docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 192.168.64.153:2377

第二个节点执行退出work的命令
docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 192.168.64.153:2377

查看swarm的节点
执行docker node ls 查看swarm节点信息
docker node ls

AVAILABILITY状态阐明
  • Active 意味着调度程序能够将任务分配给节点。
  • Pause 意味着调度程序不会将新任务分配给节点,但现有工作仍在运行。
  • Drain 意味着调度程序不会向节点调配新工作。调度程序敞开所有现有工作并在可用节点上调度它们。
MANAGER STATUS状态阐明
显示节点是属于manager或者worker
  • 没有值 :示意不参加群治理的工作节点。
  • Leader :意味着该节点是使得群的所有群治理和编排决策的次要管理器节点。
  • Reachable: 意味着节点是管理者节点正在参加Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
  • Unavailable :意味着节点是不能与其余管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点退出群集,或者将工作器节点降级为管理器。
批改主机名
默认centos的主机名是localhost,咱们看下面,节点的主机名都是localhost,咱们批改以下
查看主机名
hostnamectl status能够查看主机名
hostnamectl status

批改主机名
批改主机名应用hostnamectl set-hostname NAME命令能够进行批改,咱们应用 node1,node2...形式命名咱们的节点
#批改主机名hostnamectl set-hostname node1# 查看主机名hostnamectl status

其余节点顺次操作就能够
再次查看节点
再次查看swarm节点信息
docker node ls

增加节点标签
因为咱们用到了节点束缚,所有启动服务之前须要增加节点标签
# 增加标签docker node update --label-add role=data node1#查看节点标签信息docker node inspect node1|grep role

治理节点

升降级节点
无论您降级或降级节点,您应该始终在群中保护奇数个管理器节点,

升降级节点角色只能在治理节点上运行,应先降级工作节点为被选举者,再降级领导者为工作节点,而后被选举者成为领导者实现替换;

您能够将工作程序节点晋升为manager角色。这在管理器节点不可用或者您心愿使管理器脱机以进行保护时很有用。 相似地,您能够将管理器节点降级为worker角色。

降级节点

要降级一个节点或一组节点,请从管理器节点运行

docker node promote 节点名称

docker node promote pbui0rdry85e25i3bvhzmqw8h

降级节点后不会马上失效,会进入Reachable 状态,如果leader节点关掉,以后节点会参加主节点竞争
降级节点

要降级一个节点或一组节点,请从管理器节点运行

docker node demote 节点名称

docker node demote r7cv7prw1h2to9h1cpwxs9jhl

swam将节点降级后,再次查看节点命令不失效,须要到治理节点查看
节点退出swarm集群

docker swarm leave 命令可在所有节点上运行,值得注意的是,工作节点退出swarm集群后,在治理节点上仍然保留着工作节点的节点信息,状态为down,要删除节点信息,可应用docker node rm 命令,当所有的节点都退出并且被删除时,在治理节点上应用docker swarm leave,而后退出整个集群;

工作节点
在工作节点执行以下命令能够退出swarm节点
docker swarm leave

治理节点
在治理节点查看节信息
docker node ls
依据退出节点前后查看节点信息,能够发现退出的节点是down的状态,并没有删除节点

删除节点信息
在治理节点执行删除命令docker node rm 节点ID
docker node rm r7cv7prw1h2to9h1cpwxs9jhl

治理集群服务

治理集群服必须在manager角色的主机上
创立overlay网络
咱们须要载多个服务器中运行Docker容器集群,须要应用overlay网络,overlay网络用于连贯不同机器上的docker容器,容许不同机器上的容器互相通信,同时反对对音讯进行加密
docker network create --driver overlay learn-docker-overlay-network
创立服务
应用docker service create命令来创立服务
创立MySQL服务
docker service create \-e MYSQL_ROOT_PASSWORD=root \--mount type=bind,source=/tmp/etc/mysql,destination=/etc/mysql/mysql.conf.d/ \--mount type=bind,source=/tmp/data/mysql,destination=/var/lib/mysql \--replicas 1 \--constraint 'node.labels.role == data' \--name mysql \--network learn-docker-overlay-network \mysql:5.7.33

--replicas 1 示意在集群中创立1个服务

node.labels.role == data示意节点须要创立在标签是data的节点上

能够查看swarm的过程
docker service lsdocker service ps mysql

创立nacos服务
nacos也是须要创立一个,然而节点是能够漂移的,不须要固定在某一台机器
docker service create \-e MODE=standalone \--replicas 1 \--name nacos \--network learn-docker-overlay-network \nacos/nacos-server

能够查看swarm的过程
docker service lsdocker service ps nacos

咱们发现nacos运行在了 node3节点上
创立learn-docker-storage服务
咱们创立learn-docker-storage服务,咱们将该服务部署两个节点
docker service create \--name learn-docker-storage \--replicas 2 \--network learn-docker-overlay-network \manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT

能够查看swarm的过程
docker service lsdocker service ps nacos
咱们发现咱们的存储服务运行在两个节点上

创立learn-docker-web服务
咱们创立learn-docker-web服务,咱们将该服务同样部署两个节点
docker service create \--name learn-docker-web \--replicas 2 \--network learn-docker-overlay-network \manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT

能够查看swarm的过程
docker service lsdocker service ps nacos

创立learn-docker-gateway服务
咱们创立learn-docker-gateway服务,因为是网关服务,咱们只创立一个节点,因为须要对外暴漏端口,须要凋谢8888端口
docker service create \-p 8888:8888 \--name learn-docker-gateway \--replicas 1 \--network learn-docker-overlay-network \manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT

能够查看swarm的过程
docker service lsdocker service ps nacos

测试拜访微服务
因为在node2节点上,node2节点IP是192.168.64.154 咱们能够申请URL拜访
 curl http://192.168.64.154:8888/employeapi/find/10001| python -m json.tool

查看某个服务日志
通过docker service logs 服务命能够看到以后服务的日志,然而这个服务有两个容器在运行,所有能同时看到两个容器的日志
docker service logs learn-docker-storage

扩缩容服务
能够通过集群操作对集群进行扩缩容
扩容操作
咱们将learn-docker-storage由两个容器变为三个容器
docker service scale learn-docker-storage=3

这样咱们就把存储服务变成了三台服务
缩容操作
同样,应用该命令对learn-docker-storage进行缩容
docker service scale learn-docker-storage=2

删除服务
咱们能够尝试把learn-docker-gateway删除掉,删除操作将会把整个服务的所有容器删除
docker service rm learn-docker-gateway

本文由传智教育博学谷教研团队公布。

如果本文对您有帮忙,欢送关注点赞;如果您有任何倡议也可留言评论私信,您的反对是我保持创作的能源。

转载请注明出处!