DBC 裸金属节点
DBC 裸金属节点
简介
- DBC 的裸金属节点只负责为裸金属服务器生成 "node_id", 控制裸金属服务器进行开关机等有限的操作。
- 裸金属节点不支持虚拟机相关功能,因为对部署节点的机器硬件设备要求很低,使用的内存硬盘等资源非常小,只要能对裸金属服务器使用 IPMI 工具且网络服务正常即可。
注意!
DBC 的裸金属节点本身有个 "node_id",不需要上链,只用来为裸金属服务器生成 "node_id"。
例如向裸金属节点发送添加裸金属服务器的请求,参数需要告诉客户端节点发给哪个裸金属节点,并且填上用于 IPMI 控制的信息,请求会返回一个新的 "node_id",即要添加的裸金属服务器的 "node_id",这个 "node_id" 需要上链,然后用户才能在链上租用它,使用它发送开关机的请求。
本文提到两种 "node_id",在此区分:
- “裸金属节点的 node_id”即节点安装目录下“dat/node.dat”文件中“node_id”字段。
- “裸金属服务器的 node_id”即发送添加裸金属服务器的请求返回的“node_id”字段。
安装节点
sudo bash ./install_baremetal.sh 安装目录
安装脚本会自动安装 IPMI 工具,并且会像安装 DBC 客户端节点的脚本一样,需要输入 2 个端口号。
升级节点
sudo bash update_baremetal.sh 安装目录
添加裸金属服务器
请求方式:POST
请求 URL:
http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/bare_metal/add
- 请求 Body:
{
"peer_nodes_list": [
// 裸金属节点的 node_id
"ccd9a2118ba3c95cd458302601f15281edc39d72dcf11a07527893d97ac1a573"
],
"additional": {
// 裸金属服务器的信息列表
"bare_metal_nodes": [
{
// 机器供应商的识别裸金属的唯一ID,必填。
"uuid": "3156995b-da18-4268-9734-f8d168e90a7d",
// 裸金属服务器给用户提供的连接方式,必填。建议固定IP地址。
"ip": "175.221.204.110",
// 裸金属服务器的操作系统,非必填。
"os": "Ubuntu 20.04.3 LTS (Focal Fossa) 5.4.0-121-generic GNU/Linux",
// 机器所有者自定义的描述,非必填。
"desc": "在xxx平台租用的裸金属服务器,用于xxx业务,机房id是9f01ca9c-38bd-46a9-9637-dac92b352a63",
// ipmi的主机标识,必填。建议固定IP地址。
"ipmi_hostname": "192.168.0.110",
// ipmi的用户名,必填。
"ipmi_username": "admin",
// ipmi的用户密码,必填。
"ipmi_password": "dbtu2017",
// ipmi的端口号,非必填。v0.4.0.9 版本增加。
"ipmi_port": 623
}
]
},
// 由裸金属节点的 node_id 和 node_private_key 生成
"wallet":"ccd9a2118ba3c95cd458302601f15281edc39d72dcf11a07527893d97ac1a573",
"nonce":"5tYLiAF9vVP8bRqSfV9DfZnizsDNY7dNeEWrSUAY8f1LKiZqBu8zaVs",
"sign":"3c680ba745af6695981fe2b30aedf6861749f570d9a6fe949930caf4613c225d4a674c33ec3d4af26c20caf871dd0f3a7cb4e0c045f12c211a345781054fc282"
}
- 返回示例:
{
"errcode": 0,
"message": {
"bare_metal_nodes": [
{
"node_id": "fcf2cd8b99958606d260ca00c5ac00c88c242bcf8eb38e7cc3f29e9719a73f39",
"uuid": "3156995b-da18-4268-9734-f8d168e90a7d"
}
]
}
}
查询裸金属服务器
请求方式:POST
请求 URL:
http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/bare_metal
- 请求 Body:
{
"peer_nodes_list": [
// 裸金属节点的 node_id,此处为空时意味着查询所有的裸金属服务器列表。
"ccd9a2118ba3c95cd458302601f15281edc39d72dcf11a07527893d97ac1a573"
],
"additional": {},
// 由裸金属节点的 node_id 和 node_private_key 生成
"wallet":"ccd9a2118ba3c95cd458302601f15281edc39d72dcf11a07527893d97ac1a573",
"nonce":"5tYLiAF9vVP8bRqSfV9DfZnizsDNY7dNeEWrSUAY8f1LKiZqBu8zaVs",
"sign":"3c680ba745af6695981fe2b30aedf6861749f570d9a6fe949930caf4613c225d4a674c33ec3d4af26c20caf871dd0f3a7cb4e0c045f12c211a345781054fc282"
}
- 返回示例:
{
"errcode": 0,
"message": {
"bare_metal_nodes": [
{
"node_id": "fcf2cd8b99958606d260ca00c5ac00c88c242bcf8eb38e7cc3f29e9719a73f39",
"node_private_key": "4c2e7133834d6d7dd35088beda5556215f6f5b15d2cd3c3153f117aaeec2c28b",
"uuid": "3156995b-da18-4268-9734-f8d168e90a7d",
"ip": "175.221.204.110",
"os": "Ubuntu 20.04.3 LTS (Focal Fossa) 5.4.0-121-generic GNU/Linux",
"description": "在xxx平台租用的裸金属服务器,用于xxx业务,机房id是9f01ca9c-38bd-46a9-9637-dac92b352a63",
"ipmi_hostname": "192.168.0.110",
"ipmi_username": "admin",
"ipmi_password": "dbtu2017",
"deeplink_device_id": "123456789",
"deeplink_device_password": "aAbBcC"
}
]
}
}
当请求 Body 中的 "peer_nodes_list" 数组中包含裸金属节点的 node_id 时,还可以根据添加裸金属服务器时输入的 uuid
查询指定的裸金属服务器。
- 使用
http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/bare_metal/<node_id>
查询指定node_id
的裸金属服务器的相关信息。 - 使用
http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/bare_metal/<uuid>
查询指定uuid
的裸金属服务器的相关信息。
裸金属服务器上链
使用上面查询到的"node_id"和"node_private_key",将裸金属服务器上链。参考机器上链步骤
上链后,就可以用像租用普通算力机器一样在链上租用裸金属服务器。
注意!
裸金属服务器上链用到的 “node_id” 即添加裸金属服务器的请求返回的“node_id”,"node_private_key"则由上面的查询裸金属服务器获取。
裸金属服务器的使用
在链上租用裸金属服务器,就可以查询到它的机器信息,使用机器信息中的 IP 和端口进行连接(ssh 或者 Windows 的远程连接工具)。
如果裸金属服务器没有开机,则可以通过发送请求控制其电源开机。
请求方式:POST
请求 URL:
http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/bare_metal/power
- 请求 Body:
{
"peer_nodes_list": [
// 裸金属服务器的 node_id
"fcf2cd8b99958606d260ca00c5ac00c88c242bcf8eb38e7cc3f29e9719a73f39"
],
"additional": {
// 电源控制命令
// "on" - 开机
// "off" - 关机
// "reset" - 重启
// "status" - 获取电源状态
"command": "on"
},
"session_id": "租用者分发的session_id",
"session_id_sign": "租用者分发的session_id_sign"
}
其他 API 接口请参考裸金属节点操作
云网吧
在云网吧场景中,一台 GPU 机器以裸金属服务器的方式上链后,想要获得电竞级的游戏体验,还需要使用基于云游戏的低延迟远程控制软件 DeepLink。
相应的,使用 DeepLink 远程控制,需要获得 GPU 机器上运行的 DeepLink 软件的设备码和设备验证码(后面统称为 DeepLink 设备信息)。为此,我们增加通过 dbc 节点来查询 DeepLink 设备信息的接口。
为了保证安全,建议云网吧场景中的 GPU 机器每次开机后都有不同的设备验证码,并且在开机后的第一时间使用设置 DeepLink 设备信息的接口将设备信息告知 dbc 的裸金属节点。
另外,需要将裸金属节点的配置文件 dbc_baremetal_node/conf/core.conf
中的 http_ip=127.0.0.1
修改为 http_ip=0.0.0.0
,这样设置将使得裸金属节点可以直接接受 HTTP 请求。
当 GPU 机器和 dbc 的裸金属节点位于同一个网络中的时候,可以直接使用裸金属节点的 HTTP 服务来获取/设置设备信息,而且此时的请求不需要 session_id
和 session_id_sign
参数。当租用人通过客户端节点的 HTTP 服务查询设备信息时,就必需带有 session_id
和 session_id_sign
参数了。
具体的使用流程如下:
- 在 GPU 机器开机后,云网吧的服务程序第一时间调用裸金属节点的设置 DeepLink 设备信息接口。
请求方式:POST
请求 URL:
http://{{dbc_baremetal_ip}}:{{dbc_baremetal_port}}/api/v1/deeplink/set
- 请求 Body:
{
"peer_nodes_list": [
// GPU 机器对应的 node_id
"fcf2cd8b99958606d260ca00c5ac00c88c242bcf8eb38e7cc3f29e9719a73f39"
],
"additional": {
"device_id": "123456789",
"device_password": "aAbBcC"
},
// 由 GPU 机器的 node_id 和 node_private_key 生成
"wallet":"fcf2cd8b99958606d260ca00c5ac00c88c242bcf8eb38e7cc3f29e9719a73f39",
"nonce":"3bxrsXVW2z2ELH7G9RvF7BMUQkEGkBfQhd8YD5r8somf3UdNWcEYAFa",
"sign":"e096764ac7462220bc9b8fa223b81cfb9a501eaea9ea355c0d561b6fe61cb729abed61e5d8488178856e198d9cde51c37e2aac8886cb5e7b674591b1eca8108f"
}
- 返回示例:
{
"errcode": 0,
"message": "ok"
}
注意此请求的 URL 是 http://{{dbc_baremetal_ip}}:{{dbc_baremetal_port}}/api/v1/deeplink/set
,而不是 http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/deeplink/set
,而且请求内容不需要 session_id
和 session_id_sign
参数。
同理,此时也可以调用 http://{{dbc_baremetal_ip}}:{{dbc_baremetal_port}}/api/v1/deeplink
查询裸金属节点的设备信息。
- 租用人查询 DeepLink 设备信息。
请求方式:POST
请求 URL:
http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/deeplink
- 请求 Body:
{
"peer_nodes_list": [
// GPU 机器对应的 node_id
"fcf2cd8b99958606d260ca00c5ac00c88c242bcf8eb38e7cc3f29e9719a73f39"
],
"additional": {},
"session_id": "租用者分发的session_id",
"session_id_sign": "租用者分发的session_id_sign"
}
- 返回示例:
{
"errcode": 0,
"message": {
"device_id": "123456789",
"device_password": "aAbBcC"
}
}
注意此请求的 URL 是 http://{{dbc_client_ip}}:{{dbc_client_port}}/api/v1/deeplink
,而且请求内容需要 session_id
和 session_id_sign
参数。