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.153 | manager | node1 |
192.168.64.154 | worker | node2 |
192.168.64.155 | worker | node3 |
服务器端口凋谢
在创立集群前,如果开启了防火墙,请确认三台主机的防火墙能让 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 ls
docker 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 ls
docker 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 ls
docker 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 ls
docker 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 ls
docker 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
本文由
传智教育博学谷
教研团队公布。如果本文对您有帮忙,欢送
关注
和点赞
;如果您有任何倡议也可留言评论
或私信
,您的反对是我保持创作的能源。转载请注明出处!