当前位置: 首页 > 后端技术 > Java

容器编排工具有很多套,大名鼎鼎的Swarm是少不了的

时间:2023-04-01 21:38:57 Java

Swarm集群编排什么是SwarmSwarm是Docker开发的容器集群管理系统。Swarm早期作为一个独立的服务存在。在DockerEnginev1.12中集成了Swarm的集群管理和编排功能。Docker引擎的Swarm模式可以通过初始化一个Swarm或加入一个现有的Swarm来启用。DockerEngineCLI和API包括管理Swarm节点的命令,例如添加和删除节点,以及在Swarm中部署和编排服务,并且还增加了服务栈(Stack)、服务(Service)、任务(Task)的概念。Swarm能做什么?Swarm是Docker引擎内置(原生)的集群管理和编排工具。DockerSwarm是Docker官方的三剑客项目之一。Swarm是基于docker平台的集群技术。它可以通过几个简单的指令快速创建一个docker集群,然后将应用程序部署到集群的共享网络上,最终实现分布式服务。swarm节点swarm是一系列节点的集合,一个节点可以是裸机也可以是虚拟机。一个节点可以扮演一个或两个角色,管理者或工作者。管理节点DockerSwarm集群至少需要一个管理节点,节点之间使用Raft共识协议协同工作。通常第一个启用dockerswarm的节点会成为leader,后续所有节点都会成为follower。如果当前leader挂掉,剩下的节点会重新选举新的leader。每个manager都有一份当前集群状态的完整副本,可以保证manager的高可用。工作节点工作节点是运行实际应用程序服务的容器所在的位置。理论上,一个manager节点也可以同时成为worker节点,但在生产环境中,我们不建议这样做。worker节点通过controlplane进行通信,使用gossip协议,是异步的。运行机制术语解释了集群中经常提到的栈、服务、任务,以及它们之间的关系。这里简单解释一下这三个的含义:task在DockerSwarm中,task是部署的最小单位,task和容器是一对一的关系。servicesswarm服务是一个抽象的概念,它只是对运行在swarm集群上的应用服务的预期状态的描述。它就像一个列表,描述了以下项目:服务名称使用哪个镜像来创建容器要运行多少个副本服务容器要连接到哪个网络应该映射哪些端口堆栈堆栈是一个集合,描述了一系列相关服务。我们在YAML文件中定义了一个堆栈。工作原理服务、任务和容器在将服务部署到集群时,管理器将服务定义视为服务的期望状态。然后将服务安排为一个或多个副本任务。这些任务在集群的节点上彼此独立运行。比如下图中的HTTP服务有3个副本,每个服务实例就是一个任务。容器是一个独立的进程。在swarm模型中,每个任务调用一个容器。任务就像调度程序放置容器的插槽。容器运行后,调度程序认为任务正在运行。如果容器健康监控失败或终止,任务也将终止。副本和全局服务有两种类型的服务部署:副本和全局。对于副本服务,指定要运行的相同任务的数量,每个副本都是相同的内容。全局服务是每个节点运行一个任务的服务。无需预先指定任务数量。每当一个节点加入集群时,协调器就会创建一个任务,调度器会把这个任务分配给新加入的节点。全局服务最好是监视代理、防病毒扫描程序等容器,它们希望在集群中的每个节点上运行。下图显示了三个副本服务(黄色)和一个全局服务(灰色):特性(学习)集成集群管理使用Docker引擎CLI创建一个Docker引擎集群,您可以在其中部署应用程序服务。您不需要额外的编排软件来创建或管理集群。节点分布式设计DockerEngine不是在部署时处理节点角色之间的差异,而是在运行时处理角色更改。您可以使用Docker引擎部署两种类型的节点,即管理节点和工作节点。这意味着您可以从单个服务器构建整个集群。声明式服务模型Docker引擎使用声明式方法来定义应用程序堆栈中各种服务的所需状态。例如,您可以描述一个应用程序,该应用程序由带有消息队列服务的Web前端服务和数据库后端组成。可扩展和可扩展的容器对于每个服务,您可以声明要运行的任务数。当您向上或向下扩展时,swarm管理器会通过添加或删除任务来自动调整以维持所需数量的任务,从而保证集群的可靠状态。容器容错状态协调集群管理器节点持续监控集群状态,并协调您表达的期望状态的实际状态之间的任何差异。例如,如果一个服务被设置为运行一个容器的10个副本,而托管其中两个副本的工作机器崩溃了,管理器将创建两个新的副本来替换崩溃的副本。群管理器将新副本分配给正在运行和可用的工作节点。多主机网络您可以为您的服务指定覆盖网络。当群管理器初始化或更新应用程序时,它会自动为覆盖网络上的容器分配地址。服务发现Swarm管理器节点为swarm中的每个服务分配唯一的DNS名称并负载平衡运行的容器。您可以通过嵌入在swarm中的DNS服务器查询在swarm中运行的每个容器。负载平衡您可以将服务的端口公开给外部负载平衡器。在内部,swarm允许您指定服务容器如何在节点之间分布。默认安全性swarm中的每个节点都强制执行TLS相互身份验证和加密,以保护自身与所有其他节点之间的通信。您可以选择使用自签名根证书或来自自定义根CA的证书。滚动更新您可以在节点已经运行时以增量方式将服务更新应用到节点。群管理器允许您控制将服务部署到不同节点集之间的延迟。如果出现任何问题,您可以将任务回滚到服务的先前版本。准备环境服务器准备我的三台测试机IP地址角色主机名192.168.64.153managernode1192.168.64.154workernode2192.168.64.155workernode3服务器端口开放创建集群前,如果开启防火墙,请确认三台主机的防火墙可以允许swarm需要的端口开放,主机之间的端口需要开放。以下端口必须可用。在某些系统上,这些端口默认是打开的。2377:TCP2377端口用于集群管理通信7946:TCP和UDP7946端口用于节点间通信4789:TCP和UDP4789端口用于覆盖网络流量您可以直接关闭系统防火墙允许这些端口通信不受限制,在一般测试环境下,我们将禁用防火墙systemctlstopfirewalld(立即生效)systemctldisablefirewalld(重启生效)搭建Swarm集群。首次安装和使用DockerEngine时,swarm模式默认是关闭的。启用swarm模式后,可以使用dockerservice服务管理命令。swarm模式下引擎有两种运行方式:创建一个新的集群加入已有的集群在生产环境中,swarm模式提供了一个具有集群管理功能的容错平台,保证服务的可靠运行。接下来我们搭建swarm集群初始化集群dockerswarminit--advertise-addr192.168.64.153(本地地址)生成密码生成管理节点密码dockerswarmjoin-tokenmanager生成执行节点密码给dockerswarmjoin-tokenworkerothernodes加入集群,在第一个slave节点上执行加入work命令dockerswarmjoin--tokenSWMTKN-1-53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w192.168.64.153:2377第二个节点执行命令kswarm-Nwork-1jodocker53p5t2rt9ud5j0owkl14boj2z8im6r60ddlzotgc4a8y93u1c2-8f6crxgyc9umayhxva1jv9t1w192.168.64.153:2377查看swarm节点执行dockernodels查看swarm节点信息192.168.64.153:2377暂停意味着调度器不会向节点分配新任务,但现有任务仍在运行。Drain表示调度程序不会向该节点分配新任务。调度程序关闭所有现有任务并将它们调度到可用节点上。MANAGERSTATUS状态描述表示该节点是属于manager还是worker,没有值:表示工作节点不参与group管理。Leader:表示该节点是主管理节点,为该组做出所有组管理和编排决策。Reachable:表示该节点是管理节点,正在参与Raft共识。如果领导节点变得不可用,则该节点有资格被选为新的领导者。Unavailable:表示该节点是无法与其他管理器通信的管理器。如果管理器节点变得不可用,您应该将新的管理器节点加入集群,或者将工作节点提升为管理器。修改主机名centos默认的主机名是localhost。让我们看看上面的内容。节点的主机名是localhost。我们修改如下查看主机名hostnamectlstatus查看主机名hostnamectlstatus修改主机名使用hostnamectlset-hostnameNAME命令修改主机名可以修改,我们使用node1,node2...来命名ournodes#修改主机名hostnamectlset-hostnamenode1#查看主机名hostnamectlstatus其他节点可以依次操作再次查看节点再查看swarm节点信息dockernodelsadd节点标签因为我们使用了节点约束,所有节点标签启动服务前需要添加#添加标签dockernodeupdate--label-addrole=datanode1#查看节点标签信息dockernodeinspectnode1|greprole管理节点是否降级或降级节点升级或降级节点时,您应该始终在集群中维护奇数个管理器节点。降级节点角色只能在管理节点上运行。您应该先将worker节点升级为electee,然后将leader降级为worker节点。被选者成为leader完成替换;您可以将工作节点提升为管理器角色。如果管理器节点不可用或者您想让管理器脱机进行维护,这将很有用。同样,您可以将管理器节点降级为辅助角色。升级节点降级一个节点或一组节点,请从manager节点运行dockernodepromotenodenamedockernodepromotepbui0rdry85e25i3bvhzmqw8h升级节点后,不会立即生效,会进入Reachable状态。如果leader节点关闭,当前节点将参与master节点竞争降级节点升级一个节点或一组节点,请从manager节点节点名dockernodedemoter7cv7prw1h2to9h1cpwxs9jhlswam运行dockernodedemote节点后降级后,再次检查节点的命令没有生效,需要到管理节点查看节点并退出swarm集群dockerswarmleave命令可以在所有节点上运行。值得注意的是,工作节点退出swarm集群后,管理节点上仍然保存着工作节点的节点信息,状态为down。删除节点信息,可以使用dockernoderm命令,当所有节点退出删除后,在管理节点上使用dockerswarmleave,然后退出整个集群;工作节点在工作节点上执行如下命令退出swarm节点dockerswarmleave管理节点查看管理节点上的section信息dockernodels查看节点退出前后的节点信息,可以发现退出的节点是处于down状态,并且该节点还没有被删除。删除节点信息,在管理节点执行删除命令dockernodermnodeID。在管理者角色的主机上创建覆盖网络。我们需要加载多个服务器来运行Docker容器集群。我们需要使用覆盖网络。overlay网络用于连接不同机器上的docker容器,让不同机器上的容器可以相互通信,同时支持消息处理。加密dockernetworkcreate--driveroverlaylearn-docker-overlay-network创建服务使用dockerservicecreate命令创建服务创建MySQL服务dockerservicecreate\-eMYSQL_ROOT_PASSWORD=root\--mounttype=bind,source=/tmp/etc/mysql,destination=/etc/mysql/mysql.conf.d/\--mounttype=bind,source=/tmp/data/mysql,destination=/var/lib/mysql\--replicas1\--constraint'node.labels.role==data'\--namemysql\--networklearn-docker-overlay-network\mysql:5.7.33--replicas1表示在集群中创建服务节点.labels.role==data表示需要在label为data的节点上创建节点。可以查看swarm进程dockerservicelsdockerservicepsmysql创建nacos服务nacos也需要创建,但是节点可以漂移,不需要固定在某个地方一台机器dockerservicecreate\-eMODE=standalone\--replicas1\--namenacos\--networklearn-docker-overlay-network\nacos/nacos-server可以查看swarmdockerservice的进程lsdockerservicepsnacos发现nacos运行在node3节点上创建learn-docker-storage服务我们创建learn-docker-storage服务,我们将服务部署到两个节点dockerservicecreate\--namelearn-docker-storage\--replicas2\--networklearn-docker-overlay-network\manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-storage:1.0-SNAPSHOT可以查看swarmdockerservice的进程lsdockerservicepsnacos我们发现我们的storage服务运行在两个节点上创建learn-docker-web服务我们创建learn-docker-web服务,我们将服务部署到两个节点dockerservicecreate\--namelearn-docker-web\--replicas2\--networklearn-docker-overlay-network\manager-hongbaoyu-java.iheima.net:8443/library/learn-docker-web:1.0-SNAPSHOT可以查看swarmdockerservice的进程lsdockerservicepsnacoscreatelearn-docker-gatewayservice我们创建learn-docker-gateway服务,因为它是网关服务,我们只创建一个节点,因为需要对外暴露端口,需要开放8888端口dockerservicecreate\-p8888:8888\--namelearn-docker-gateway\--replicas1\--networklearn-docker-overlay-network\manager-hongbaoyu-java.itheima.net:8443/library/learn-docker-gateway:1.0-SNAPSHOT可以查看swarmdockerservicelsdockerservicepsnacos测试访问微服务的进程因为在node2节点上,node2节点IP为192.168.64.154我们可以请求url访问curlhttp://192.168.64.154:8888/employeapi/find/10001|python-mjson.tool查看一个服务日志通过dockerservicelogs服务命令可以看到当前的服务日志,但是这个服务有两个容器在运行,同时可以看到两个容器的所有日志。dockerservicelogslearn-docker-storagescalingservice可以通过集群操作来扩缩集群。存储从两个容器更改为三个容器。dockerservicescalelearn-docker-storage=3这样我们就可以存储服务规模该服务已成为三个服务缩水操作。同样,使用这个命令收缩learn-docker-storagedockerservicescalelearn-docker-storage=2删除服务我们可以尝试删除learn-docker-gateway,删除操作整个服务的所有容器都会被删除。dockerservicermlearn-docker-gateway私信,您的支持是我坚持创作的动力。转载请注明出处!