今天来聊聊 Redfish
Redfish 的诞生
Redfish 是在2015年由DMTF(Distributed Management Task Force) 这个组织开始着手建立的伺服器管理标准,官方的描述是
A standard, Redfish is designed to deliver simple and secure management for converged, hybrid IT and the Software Defined Data Center (SDDC).
作为一项标准,Redfish 旨在为converged, hybrid IT 和 SDDC 提供简单而安全的管理
这边的SDDC就是"Software Defined Data Center (SDDC) - 软件定义数据中心",简单来说就是希望未来能提供单一软件工具集来管理这些虚拟化资源。但在伺服器的领域,长期发展且成熟的协定一直是IPMI,对于数据中心的管理者/客户端的反馈是他们并不了解IPMI这个协定,他们的人员都需要重新学习,而且很多现代化的管理工具并不能直接应用在IPMI上面,所以Redfish诞生的契机就出现了
什么是 Redfish
- 用于 IT 基础架构的行业标准 RESTful API
- 基于 Odata v4 的 JSON 格式的 HTTPS
- 应用程序、GUI 和脚本同样可用
- Schema-backed但可读性高
Redfish Data model
Redfish 关键技术
HTTP
超文本传输协议 (HTTP) 是分布式、协作、超媒体信息系统的应用层协议。它是一种通用、无状态的协议,透过扩展其请求方法(Method)、错误代码(Status-Code)和头标(Header),可用于超文本之外的许多任务。
底下是HTTP协议的概念图,详细可以参考Hypertext Transfer Protocol -- HTTP/1.1,例如我们想要看Redfish 的Service root URL ,Request-Line就是 GET /redfish/v1 http/1.1
我们可以透过回传响应中的错误代码(Status-Code)来判断请求的状态
常用的Method(GET, POST, PATCH, DELETE)
- GET:获取,例如获取系统帐户讯息GET /redfish/v1/AccountService
- POST:
- 新增,例如新增一个帐户 POST /redfish/v1/AccountService/Accounts {"id":"xxx" "password":"xxx"}
- 执行,例如执行韧体更新,开关机等动作
- PATCH:更新,例如更新帐户名字 PATCH /redfish/v1/AccountService/Accounts/01 {"Name": "123"}
- DELETE:删除,例如删除一个帐户 DELETE /redfish/v1/AccountService/Accounts/01
常見的错误代码(Status-Code)
Status-Code 是由三个数字所组合组成的,目的是企圖去理解和满足请求
- 1xx:Informational (信息):提供协议级信息
- 2xx:Success(成功):客户端请求被接受(成功)
- 200:OK
- 201: Created:申请资源创建成功
- 202:Accepted (已接受):用于报告异步操作成功
- 204:No content (无内容):当 API 想要发送空内容或没有内容时响应体
- 3xx:Redirection (重定向):客户端请求由服务器重定向到满足客户端请求的不同端点
- 301:Moved Permanently (永久移动):用于重新定位的资源
- 302:Found (找到)
- 4xx:Client error(客户端错误):客户端错误
- 400:Bad request (错误请求)
- 401:Unauthorized (未经授权)
- 403:Forbidden (禁止)
- 404:Not found (未找到)
- 405:Method not allowed (方法不允许)
- 5xx:Server error (服务器错误)
- 500: Internal server error(内部服务器错误)
HTTPS (Hyper Text Transfer Protocol Secure)
HTTPS 对在浏览器和网站之间发送的数据进行加密,使其比 HTTP 更安全,通信协议使用传输层安全性 (TLS) 或以前的安全套接字层 (SSL) 进行加密。 TLS的概念可以参考 [OpenBMC] LDAP 设定(三) - LDAPS(LDAP over TLS) TLS的部分
Restful API
REST( Representational State Transfer, 表现层状态转移),它是一种设计风格,RESTful 是转为形容词,RESTful 形容以此规范设计的 API,称为 RESTful API
它的约束(constraints)有以下几项
- 主从架构 Client-server
- 无状态 Statelessness
- 可暂存 Cacheable
- 统一介面 Uniform interface
- 阶层式系统 Layered systems: 每一个资源有对应至少一个的URI
- [Optional] 依需求提供程式 Code on demand
OData
OData(The Open Data Protocol) 是一种基于REST的数据访问方式,该标准由微软发起,前三个版本1.0、2.0、3.0是微软开放标准,第4.0版于2014年在OASIS投票通过成为 开放工业标准。
The Open Data Protocol (OData) enables the creation of REST-based data services which allow resources, identified using Uniform Resource Locators (URLs) and defined in a data model, to be published and edited by Web clients using simple HTTP messages.
This specification defines the core semantics and the behavioral aspects of the protocol.
但odata我没有很熟,所以这边只会简单介绍一些Redfish会用到的(我大概知道的)
OData‑URL
Odata定义了一组推荐的(但不是必需的)规则,用于构建 URL 以识别 OData 服务公开的数据和元数据,以及一组保留的 URL 查询字符串运算符。
- Service root URL: url 的服务根是服务的基本 url。当对该 url 发出 GET 请求时,它将返回一个服务文档,该文档定义了通过该服务可用的所有资源。Redfish 的Service root URL 是 /redfish/v1 这在redfish spec中有定义
- Resource path : REST 定义的资源是可通过 HTTP 使用标准 GET、POST、PUT、PATCH 和 DELETE 方法访问的对象。
- Query options: 查询选项本质上是标准化的查询字符串参数,可以传递给 OData 服务以对请求的资源运行查询。例如对资源的filter, count, skip, order, search 和 format。所有 OData 查询选项都以 $ 符号为前缀,并且不区分大小写。
另外在service root URL后面加上$metadata可以看到Service的实体模型(entity model),内容根据 [OData-CSDLJSON] 或 [OData-CSDLXML]
OData-CSDLXML
OData 服务是根据实体模型来描述的。 CSDL(Common Schema Definition Language) 使用XML(Extensible Markup Language ) 定义了由 OData 服务公开的实体数据模型的表示法,以及来自 W3C XML 模式定义语言的进一步构建块 (XSD) 。
简单来说,就是定义我们常听到的Redfish的Schema和Property,这样使用者可以知道它会得到的讯息格式,进而先处理(微软有些tool可以直接将CSDL转为结构或资料库),这部分DMTF有CSDL的教学文件,同时也有一个Redfish Service Validator 的tool 来验证我们的Redfish Services有没有符合定义的CSDL
Redfish_School-Introduction_to_CSDL (dmtf.org)https://www.dmtf.org/sites/default/files/Redfish_School-Introduction_to_CSDL.pdfGitHub - DMTF/Redfish-Service-Validator
https://github.com/DMTF/Redfish-Service-Validator
OData-JSON
OData 定义一些特定的property 来扩展 JSON。举一些常见的例子,詳細可以參閱Spec
- @odata.id:entity-id与实体的规范URL相同,通常是必须存在的
- @odata.count:计数控制信息仅出现在响应中,可以注释在任何集合中
Redfish 的版本怎么看
Redfish的版本怎么看 ? 优快云博客https://blog.youkuaiyun.com/yeiris/article/details/122759365