从0到1之saltstack:基本概念和通信流程

saltstack简介

salt定位

saltstack, 简称salt, 是有Thomas Hatch先生于2011年创建的一个开源项目,最初是为了实现一个快速的远程控制系统,后来逐步发展成为如今的基于配置管理分布式远程执行系统的强大平台。 通过一台master即可远程管理成千上万的服务器。

基本架构

salt基本组成

salt是基于python实现的C/S架构平台,底层使用ZeroMQ消息队列pub/sub方式通信。主要的机器角色有三种:master、minion以及syndic。其中使用最多的是master和minion,顾名思义,master是salt的中心管理控制系统,而minion则是被远程控制的具体执行的客户端。
基本架构有三种:

  1. master和minion直连,即一个master连接多个minon,这种架构最常见
    从0到1之saltstack:基本概念和通信流程

  2. master通过syndic控制minion
    从0到1之saltstack:基本概念和通信流程

  3. 只有minion
    直接本地运行即可

salt-client、master和minion作用介绍

salt-client

简称salt-cli, 此处说的salt-cli主要指的是和用户交互的命令工具,类似docker、kubectl, etcdctl等。salt-client通常和master在同一台主机上,其主要的抽象概念为LocalClient, 主要的作用有二:

  1. 发送请求到master上的ReqServer(4506端口),通过master来控制minion
  2. 通过监听事件总线发布者,在master收到minion响应后,收集结果展示给用户
salt master

salt master守护进程运行在指定角色为master机器上,用来提供身份验证、发送和接收minion的请求、响应salt-cli等功能。当salt-master启动时会启动多个不同作用的进程:

  1. Publisher: 负责将任务发送给连接的minion,绑定4505端口和publish_pull.ipc
  2. EventPublisher: 负责将主事件发布给所有的侦听器,绑定master_event_pull.ipc和master_event_pub.ipc
  3. MWorker: 管理salt master的后端操作的worker进程,worker进程是数量可在主配置文件中的worker_threads参数定义,至少为1。绑定workers.ipc
  4. ReqServer: 接收请求,并分发给可用的MWorker进程进行处理,同时还接收来自minion的回复。绑定4505端口和workers.ipc
minion

salt minion是通过salt管理的机器上运行的一个单进程。它即可以在本地执行salt-call时作为独立的守护进程运行,也可以连回主服务器远程接收命令。启动时,salt minion会通过自己配置文件里配置的master地址发起连接,会同时通过4505、4506端口建立tcp连接。

salt完整的通信流程

简化的流程为:salt-cli通过4506端口验证身份并发送一个salt命令给master,master通过4505端口发布任务给所有的minions, minion匹配成功后执行任务,并将结果通过master的4506端口发送给master,此时salt-cli会负责收集和展示结果给用户。

  • minion只需要在配置文件中配置master ip,不需要监听端口
  • master需要监听4505和4506两个端口,其中4505为Publisher端口,提供异步发送执行命令的能力
  • master监听的4506端口为ReqServer,主要用来接受minion/salt-cli的请求,同时提供auth等能力和接受minion的回复信息
  • 每个minion都会 和监听4505的Publisher、监听4506的ReqServer建立连接
    从0到1之saltstack:基本概念和通信流程

salt job的生命周期

salt-master的工作方式是向所有的minion发送执行命令,而minion则是通过对照命令来配置自己的执行内容。job可以理解为一次完整的执行任务。从master的角度出发,典型的job生命周期为:

  1. salt-cli 上执行一个简单的salt命令,如:“salt my_minion test.ping”
  2. "salt"命令使用LocalClient生成对salt-master的请求,并通过master: 4506端口提交一个任务给ReqServer
  3. salt-master ReqServer收到请求后,会将其通过 workers.ipc 发送给可用的MWorker
  4. worker 接收并开始处理请求: 第一步,确认发送请求的用户具有发出命令的权限(个人注:一般使用root用户执行);第二步,发送命令到所有可以连接的minion
  5. 位于master event bus (master事件总线) 的worker宣布:master即将发送一个任务给所有连接的minion。 其实现机制为:通过将event放置在主事件总线(master_event_pull.ipc)上,EventPublisher在事件总线上将此event分发到master_event_pub.ipc上所有已连接的event侦听器
  6. 即将发送给minion的消息都是经过加密,然后通过publish_pull.ipc上的IPC发送给master Publisher
  7. 已和master连接的minions在4505端口上和Publisher建立了一个会话,并等待指令。当Publiser接收通过publish_pull接收到job时,它会将job通过线路发送给minions处理
  8. minions接收到请求后进行解密,在确认自己是执行者后开始执行所有的请求内容,否则丢弃
  9. 当minions准备好response后,会将job执行完的结果进行加密,通过4506端口发送给master。在这里,ReqServer再次获取job内容并转发到可用的MWorker进行处理(这里同样是通过workers.ipc来传递消息给可用的workers)
  10. 当MWorker 接收到job后进行解密,并在master event bus(master_event_pull.ipc)上发起一个event
  11. EventPublisher 发现此event后,在event bus上重新发布它给master event bus(on master_event_pub.ipc)上的所有监听者。此时,LocalClient已经处于等待状态,监听到master event bus的minions的反馈后,将收集任务并将结果存储起来
  12. 当收到所有的minion回复或者请求超时后,salt client会在CLI上向用户展示所有任务的执行结果。

参考官网:https://docs.saltproject.io/en/latest/topics/development/architecture.html

上一篇:浅谈ipc(posix)


下一篇:进程间的几种通信方式