SlurmRestAPI
1、RestAPI
REST(REpresentational State Transfer,表现层资源状态转化)描述了客户端和服务器如何相互交互的方式。REST 通信通常基于 HTTP 协议,并且向资源 URI 发出请求,可能包含额外的请求数据,并且回复可以是任何内容:HTML、XML、JSON、CSV、纯文本甚至原始二进制数据。是开发的一套标准或者说是一套规范。
资源,是网络上的一个实体。可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。可以用一个 URI(统一资源定位符)指向它,每种资源对应一个特定的URI。在客户端和服务器之间,通过表现层传递这种资源。HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建/更新资源,PUT用来更新资源,DELETE用来删除资源。通过服务器端的资源操作,完成“表现层状态的转化”。
Swagger™ 的目标是为 REST APIs 定义一个标准的,与语言无关的接口,使人和计算机在看不到源码或者看不到文档或者不能通过网络流量检测的情况下能发现和理解各种服务的功能。南研院公司中的swagger接口文档就是对restFul API的很好理解。
2、OpenAPI
RESTful API 是指导设计 Web 应用 API 的规范,而 OpenAPI 是指导编写 Web 应用 API 文档的规范,是对 RESTful API 实现细节的描述。
OpenAPI 规范 (OAS) 为 REST API 定义了一个标准的、与编程语言无关的接口描述,它允许人类和计算机在不需要访问源代码、附加文档或检查网络流量的情况下发现和理解服务的功能。
如果有一个 OpenAPI 实现和一个 REST API 的 OpenAPI 描述文件,那么就可以将该描述文件提供给 OpenAPI 实现,并且该实现现在知道如何使用 REST API,它可以生成程序员可读的文档,或者可以自动生成代码以使用不同语言的 REST API。
3、SlurmRestAPI
slurm RestAPI是slurm 20.02版本中最新推出的功能,其接口符合 REST 设计标准的 API,方便我们基于接口调用slurm的功能。SlurmRestAPI是一个将JSON/YAML通过HTTP请求转换为slurm RPC请求的工具。可以像类似于命令行工具一样更好的方式向用户提供输出。Slurm 提供了一个名为 slurmrestd 的 REST API守护程序。此守护程序旨在允许客户端通过REST API 与搜索引擎进行通信。SlurmRestAPI主要有两种模式Inet Mode和Daemon Mode模式(Listen Mode)。
Daemon Mode(Listen Mode):监听客户端连接的给定IP:端口集,每个连接需要独立验证。
Inet Mode:客户端通过xinted、inetd或systemd等扩展/系统守护进程激活每个连接启动,避免在主机运行守护进程的需要。为每一个客户端创建一个实例。
slurmrestd充当请求的框架,基于插件通过注册URL路径添加新的Rest方法。通常slurmrestd只放置在与受信任的客户端通信的可信网络中,需要对客户端身份进行验证,来保证安全性。对于用户身份进行验证,可以使用一个身份验证代理,这个代理负责验证用户身份。常用的有三个方法:
- JSON Web Token (JWT) 身份验证
JWT网络令牌可用于通过 REST 协议对用户进行身份验证。HTTP headers变量:X-SLURM-USER-NAME(用户名),X-SLURM-USER-TOKEN(用户token,包括信息)。使用 JWT 时,需要在 slurm.conf 中为 slurmrestd 配置身份验证类型=auth/jwt。否则就会出现Authentication failure
的错误。
集群内部的通信方式主要是采用Munge实现的,它们都属于Munge边界,而slurm的控制进程和slurmdbd 进程在横向上又与slurmrestd作为一个整体,采用的AuthAltTypes边界,即JWT认证方式认证的。
- 本地身份验证
支持使用 UNIX 域套接字让Linux内核对本地用户进行身份验证。默认slurmrestd 不会以root或 SlurmUser 身份启动。slurmrestd 必须位于 Munge 安全域中,才能在本地身份验证模式下运行并与 Slurm 通信。
- 身份验证代理
身份验证代理是使用分配给 SlurmUser 的 JWT 令牌设置的,然后可以使用该令牌代理集群上的任何用户。但是该功能仅适用于 SlurmUser 和root用户。
proxy 结构
可以使用nginx或apache代理服务器,来进行用户登录验证。由于Slurmrestd 是无状态的,因为它不会在请求之间缓存或保存任何状态。每个请求都在线程中处理,然后就丢弃。可以在slurmrestd 和客户端之间设置缓存代理,以避免客户端重复调用查询。