容器编排工具很多套,出身名门的Swarm上不了
Posted 博学谷狂野架构师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器编排工具很多套,出身名门的Swarm上不了相关的知识,希望对你有一定的参考价值。
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节点
manager节点
通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader如果挂掉,剩余的节点将重新选举出一个新的leader。
每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用。
worker节点
worker节点是运行实际应用服务的容器所在的地方。理论上,一个manager节点也能同时成为worker节点,但在生产环境中,我们不建议这样做。
worker节点之间,通过control plane
进行通信,这种通信使用gossip
协议,并且是异步的。
运行机制
名词解释
task
在Docker Swarm中,task是一个部署的最小单元,task与容器是一对一的关系。
services
swarm service是一个抽象的概念,它只是一个对运行在swarm集群上的应用服务,所期望状态的描述。它就像一个描述了下面物品的清单列表一样:
- 服务名称
- 使用哪个镜像来创建容器
- 要运行多少个副本
- 服务的容器要连接到哪个网络上
- 应该映射哪些端口
stack
stack是描述一系列相关services的集合。我们通过在一个YAML文件中来定义一个stack。
工作原理
服务、任务和容器
当将服务部署到集群时,管理者将服务定义视为服务所需状态。然后将服务调度为一个或多个副本任务。这些任务在集群的节点上彼此独立运行。
容器是一个独立的进程,在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 |
服务器端口开放
- 2377:TCP端口2377用于集群管理通信
- 7946:TCP和UDP端口7946用于节点之间的通信
- 4789:TCP和UDP端口4789用于覆盖网络流量
systemctl stop firewalld(立即生效)
systemctl disable firewalld(重启生效)
搭建Swarm集群
-
创建一个新的集群
-
加入现有集群
在生成环境中,集群模式提供具有集群管理功能的容错平台,以保证服务的可靠运行。
初始化集群
docker swarm init --advertise-addr 192.168.64.153(本机地址)
生成口令
生成管理节点口令
docker swarm join-token manager
生成执行节点口令
docker swarm join-token worker
其他节点加入集群
docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 192.168.64.153:2377
docker swarm join --token SWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w 192.168.64.153:2377
查看swarm的节点
docker node ls
AVAILABILITY状态说明
-
Active 意味着调度程序可以将任务分配给节点。
-
Pause 意味着调度程序不会将新任务分配给节点,但现有任务仍在运行。
-
Drain 意味着调度程序不会向节点分配新任务。调度程序关闭所有现有任务并在可用节点上调度它们。
MANAGER STATUS状态说明
-
没有值 :表示不参与群管理的工作节点。
-
Leader :意味着该节点是使得群的所有群管理和编排决策的主要管理器节点。
-
Reachable: 意味着节点是管理者节点正在参与Raft共识。如果领导节点不可用,则该节点有资格被选为新领导者。
-
Unavailable :意味着节点是不能与其他管理器通信的管理器。如果管理器节点不可用,您应该将新的管理器节点加入群集,或者将工作器节点升级为管理器。
修改主机名
查看主机名
hostnamectl status
修改主机名
#修改主机名
hostnamectl set-hostname node1
# 查看主机名
hostnamectl status
再次查看节点
docker node ls
添加节点标签
# 添加标签
docker node update --label-add role=data node1
#查看节点标签信息
docker node inspect node1|grep role
管理节点
升降级节点
升降级节点角色只能在管理节点上运行,应先升级工作节点为被选举者,再降级领导者为工作节点,然后被选举者成为领导者完成替换;
您可以将工作程序节点提升为manager角色。这在管理器节点不可用或者您希望使管理器脱机以进行维护时很有用。 类似地,您可以将管理器节点降级为worker角色。
升级节点
docker node promote pbui0rdry85e25i3bvhzmqw8h
降级节点
docker node demote r7cv7prw1h2to9h1cpwxs9jhl
节点退出swarm集群
docker swarm leave 命令可在所有节点上运行,值得注意的是,工作节点退出swarm集群后,在管理节点上依然保存着工作节点的节点信息,状态为down,要删除节点信息,可使用docker node rm 命令,当所有的节点都退出并且被删除时,在管理节点上使用docker swarm leave,然后退出整个集群;
工作节点
docker swarm leave
管理节点
docker node ls
删除节点信息
docker node rm r7cv7prw1h2to9h1cpwxs9jhl
管理集群服务
创建overlay网络
docker network create --driver overlay learn-docker-overlay-network
创建服务
创建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
docker service ls
docker service ps mysql
创建nacos服务
docker service create \\
-e MODE=standalone \\
--replicas 1 \\
--name nacos \\
--network learn-docker-overlay-network \\
nacos/nacos-server
docker service ls
docker service ps nacos
创建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
docker service ls
docker service ps nacos
创建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
docker service ls
docker service ps nacos
创建learn-docker-gateway服务
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
docker service ls
docker service ps nacos
测试访问微服务
curl http://192.168.64.154:8888/employeapi/find/10001| python -m json.tool
查看某个服务日志
docker service logs learn-docker-storage
扩缩容服务
扩容操作
docker service scale learn-docker-storage=3
缩容操作
docker service scale learn-docker-storage=2
删除服务
docker service rm learn-docker-gateway
以上是关于容器编排工具很多套,出身名门的Swarm上不了的主要内容,如果未能解决你的问题,请参考以下文章
容器编排工具鉴赏- docker-compose KubernetesOpenShiftDocker Swarm