yunionio / cloudpods

A cloud-native open-source unified multi-cloud and hybrid-cloud platform. 开源、云原生的多云管理及混合云融合平台
https://www.cloudpods.org
Apache License 2.0
2.56k stars 520 forks source link

[求助/Help] 物理机注册过程中,dhcp无法分配 #17967

Open 522623905 opened 1 year ago

522623905 commented 1 year ago

Request URL: https://10.103.192.30/api/v2/hosts Request Method: POST 参数为: access_ip: "10.103.192.140" access_mac: "10:70:fd:88:57:2a" enable_pxe_boot: true ipmi_ip_addr: "10.103.193.22" ipmi_password: "admin" ipmi_username: "admin" name: "metal" no_prepare: false project_domain: "default"

在基础资源-》物理机-》添加物理机,的界面中,选择的是PXE引导注册。其中,指定了ipmi地址、用户名和密码、管理口IP选择的是dhcp子网的静态IP,并且也填充了物理机的eth0的mac地址。但是还是提示: [info 2023-09-08 01:51:41 pxe.(DHCPHandler).ServeDHCP(dhcp.go:83)]DHCP: from relay 10.103.192.30 packet, mac: 10:70:fd:88:57:2a [info 2023-09-08 01:51:41 pxe.(dhcpRequest).fetchConfig(dhcp.go:238)] Not found baremetal by mac: 10:70:fd:88:57:2a [warning 2023-09-08 01:51:41 dhcp.(DHCPServer).serveDHCP.func1(server.go:124)]DHCP: handler serve error: Empty packet config [info 2023-09-08 01:51:43 pxe.(DHCPHandler).ServeDHCP(dhcp.go:83)]DHCP: from relay 10.103.192.30 packet, mac: 10:70:fd:88:57:2a [info 2023-09-08 01:51:43 pxe.(dhcpRequest).fetchConfig(dhcp.go:238)] Not found baremetal by mac: 10:70:fd:88:57:2a [warning 2023-09-08 01:51:43 dhcp.(DHCPServer).serveDHCP.func1(server.go:124)]DHCP: handler serve error: Empty packet config

zexi commented 1 year ago

@522623905

如果物理机的 bmc 不支持 redfish 协议,需要在创建物理机的时候把 pxe 网卡的 mac 地址填上,这样物理机 pxe 启动进行 dhcp 的时候 baremetal agent 才会从 dhcp 请求中的 mac 到平台那边匹配上记录。

可以看下 10:70:fd:88:57:2a 这个 mac 地址是否是当前物理机的网卡,如果是的话,需要在创建物理机记录的时候把 mac 地址填上后再试试。

另外 https://$ip/api/v2/hosts POST的接口从这里开始校验:https://github.com/yunionio/cloudpods/blob/3f5b0a824c8181a911a1d4155f0e50c1ce4c3357/pkg/compute/models/hosts.go#L3472

522623905 commented 1 year ago

@522623905

如果物理机的 bmc 不支持 redfish 协议,需要在创建物理机的时候把 pxe 网卡的 mac 地址填上,这样物理机 pxe 启动进行 dhcp 的时候 baremetal agent 才会从 dhcp 请求中的 mac 到平台那边匹配上记录。

可以看下 10:70:fd:88:57:2a 这个 mac 地址是否是当前物理机的网卡,如果是的话,需要在创建物理机记录的时候把 mac 地址填上后再试试。

另外 https://$ip/api/v2/hosts POST的接口从这里开始校验:

https://github.com/yunionio/cloudpods/blob/3f5b0a824c8181a911a1d4155f0e50c1ce4c3357/pkg/compute/models/hosts.go#L3472

可以看我上边的日志,DHCP Request的时候,可以看到 mac 地址就是调用POST请求时填充的: Request URL: https://10.103.192.30/api/v2/hosts Request Method: POST

access_mac: "10:70:fd:88:57:2a"

[info 2023-09-08 01:51:41 pxe.(DHCPHandler).ServeDHCP(dhcp.go:83)]DHCP: from relay 10.103.192.30 packet, mac: 10:70:fd:88:57:2a [info 2023-09-08 01:51:41 pxe.(dhcpRequest).fetchConfig(dhcp.go:238)] Not found baremetal by mac: 10:70:fd:88:57:2a

522623905 commented 1 year ago

但是,奇怪的是,host-list出来的mac,并不是我请求时配置的mac,而是我另一张网卡的mac:

[root@host-005056b2d99d ~]# climc host-list +--------------------------------------+---------------------------------+-------------------+----------------+---------------+--------------------+----------------------------+---------+---------+-------------+----------+-----------+------------+------------+------------+----------------------------------+--------------+-----------+--------------+ | ID | Name | Access_mac | Access_ip | Ipmi_Ip | Ovn_Mapped_Ip_Addr | Manager_URI | Status | enabled | host_status | mem_size | cpu_count | node_count | sn | host_type | version | storage_size | domain_id | public_scope | +--------------------------------------+---------------------------------+-------------------+----------------+---------------+--------------------+----------------------------+---------+---------+-------------+----------+-----------+------------+------------+------------+----------------------------------+--------------+-----------+--------------+ | 8e58d500-e0a7-4154-8aa5-817ea496a018 | tetet | b4:05:5d:30:82:2a | 10.103.192.140 | 10.103.193.22 | | | prepare | false | offline | 0 | 0 | 0 | 819597899 | baremetal | | 0 | default | system |

zexi commented 1 year ago

@522623905 如果物理机的 bmc 不支持 redfish 协议,需要在创建物理机的时候把 pxe 网卡的 mac 地址填上,这样物理机 pxe 启动进行 dhcp 的时候 baremetal agent 才会从 dhcp 请求中的 mac 到平台那边匹配上记录。 可以看下 10:70:fd:88:57:2a 这个 mac 地址是否是当前物理机的网卡,如果是的话,需要在创建物理机记录的时候把 mac 地址填上后再试试。 另外 https://$ip/api/v2/hosts POST的接口从这里开始校验: https://github.com/yunionio/cloudpods/blob/3f5b0a824c8181a911a1d4155f0e50c1ce4c3357/pkg/compute/models/hosts.go#L3472

可以看我上边的日志,DHCP Request的时候,可以看到 mac 地址就是调用POST请求时填充的: Request URL: https://10.103.192.30/api/v2/hosts Request Method: POST

access_mac: "10:70:fd:88:57:2a"

[info 2023-09-08 01:51:41 pxe.(DHCPHandler).ServeDHCP(dhcp.go:83)]DHCP: from relay 10.103.192.30 packet, mac: 10:70:fd:88:57:2a [info 2023-09-08 01:51:41 pxe.(dhcpRequest).fetchConfig(dhcp.go:238)] Not found baremetal by mac: 10:70:fd:88:57:2a

@522623905 应该是你理解错了,bm_register.go:CreateBaremetal 函数是从这个接口调进来的:

image

这个不是 pxe 注册物理机的逻辑。

你的是 pxe 注册的流程,如果看代码的话,应该看这个地方的逻辑:

image
522623905 commented 1 year ago

目前现象,看起来是,  pxe 注册时,使用的网卡,和进入ramdisk系统后,再请求dhcp的网卡不是一个。 然后造成的问题是: 1)虽然我注册时,指定的是MAC1; 2)pxe boot启动时,用的是另一张网卡,MAC2,然后dhcp server收到请求后,从DHCP Request中 获取到这个MAC2,再反写到数据库,将MAC1覆盖了; 3)然后流程继续,往下后,以MAC1,发送DHCP请求,但是由于数据库备修改成MAC2了,就无法找到,就无法分配成功了

zexi commented 1 year ago

但是,奇怪的是,host-list出来的mac,并不是我请求时配置的mac,而是我另一张网卡的mac:

[root@host-005056b2d99d ~]# climc host-list +--------------------------------------+---------------------------------+-------------------+----------------+---------------+--------------------+----------------------------+---------+---------+-------------+----------+-----------+------------+------------+------------+----------------------------------+--------------+-----------+--------------+ | ID | Name | Access_mac | Access_ip | Ipmi_Ip | Ovn_Mapped_Ip_Addr | Manager_URI | Status | enabled | host_status | mem_size | cpu_count | node_count | sn | host_type | version | storage_size | domain_id | public_scope | +--------------------------------------+---------------------------------+-------------------+----------------+---------------+--------------------+----------------------------+---------+---------+-------------+----------+-----------+------------+------------+------------+----------------------------------+--------------+-----------+--------------+ | 8e58d500-e0a7-4154-8aa5-817ea496a018 | tetet | b4:05:5d:30:82:2a | 10.103.192.140 | 10.103.193.22 | | | prepare | false | offline | 0 | 0 | 0 | 819597899 | baremetal | | 0 | default | system |

@522623905 这个物理机是否支持 redfish api ?如果支持的话,有可能是 redfish 返回的 mac 地址不包含输入的 mac 地址,就会以 redfish 的为准,这个问题以前遇到过。

这种情况可以改用 iso 引导注册试试

522623905 commented 1 year ago

[info 2023-09-08 01:41:09 redfish.NewRedfishDriver(driver.go:120)] Use generic Redfish REST Api Driver for endpoint "https://10.103.193.22" [warning 2023-09-08 01:41:09 tasks.(*SBaremetalIpmiProbeTask).DoIpmiProbe(ipmiprobe.go:83)] BMC not redfish-compatible 日志这个提示,看起来是不兼容redfish?有什么方式或接口能验证redfish获取mac不?

zexi commented 1 year ago

目前现象,看起来是,  pxe 注册时,使用的网卡,和进入ramdisk系统后,再请求dhcp的网卡不是一个

@522623905 那现在 pxe 进入 ramdisk 系统后,进去用 ifconfig 和 route 等命令看下网卡现在分配的 ip 和路由配置是什么? 需要确保 ramdisk 系统能够成功访问 baremetal-agent 所在的节点对应的 https://$ip:8879 服务监听地址才行

zexi commented 1 year ago

[info 2023-09-08 01:41:09 redfish.NewRedfishDriver(driver.go:120)] Use generic Redfish REST Api Driver for endpoint "https://10.103.193.22" [warning 2023-09-08 01:41:09 tasks.(*SBaremetalIpmiProbeTask).DoIpmiProbe(ipmiprobe.go:83)] BMC not redfish-compatible 日志这个提示,看起来是不支持完整的redfish?有什么方式或接口能验证redfish获取mac不?

@522623905 那这个看起来是不支持 redfish 了,可以排除我说的 redfish 的问题了。 现在可以从 ramdisk 分配的网络配置来排查了,进入 ramdisk 系统看下能否访问 baremetal-agent 所在的节点对应的 https://$ip:8879 服务监听地址?

zexi commented 1 year ago

目前现象,看起来是,  pxe 注册时,使用的网卡,和进入ramdisk系统后,再请求dhcp的网卡不是一个。 然后造成的问题是: 1)虽然我注册时,指定的是MAC1; 2)pxe boot启动时,用的是另一张网卡,MAC2,然后dhcp server收到请求后,从DHCP Request中 获取到这个MAC2,再反写到数据库,将MAC1覆盖了; 3)然后流程继续,往下后,以MAC1,发送DHCP请求,但是由于数据库备修改成MAC2了,就无法找到,就无法分配成功了

@522623905 可以拔掉一条网卡的网线吗?保证 pxe 阶段出来的 dhcp 请求都走一张网卡

zexi commented 1 year ago

@522623905 另外 iso 引导注册这个不用尝试了,不支持 redfish 的机器用不了这个模式

522623905 commented 1 year ago

目前现象,看起来是,  pxe 注册时,使用的网卡,和进入ramdisk系统后,再请求dhcp的网卡不是一个。 然后造成的问题是: 1)虽然我注册时,指定的是MAC1; 2)pxe boot启动时,用的是另一张网卡,MAC2,然后dhcp server收到请求后,从DHCP Request中 获取到这个MAC2,再反写到数据库,将MAC1覆盖了; 3)然后流程继续,往下后,以MAC1,发送DHCP请求,但是由于数据库备修改成MAC2了,就无法找到,就无法分配成功了

@522623905 可以拔掉一条网卡的网线吗?保证 pxe 阶段出来的 dhcp 请求都走一张网卡

嗯,我验证一下

zexi commented 1 year ago

@522623905 可以用下面的命令查询 ramdisk 的登陆密码,如果没有查询到,应该就是 mosbaremetal 这个默认密码

# climc host-logininfo 物理机名 
$ climc host-logininfo $your-baremetal-name
zexi commented 1 year ago

@522623905 通知回 baremetal-agent 的脚本在 ramdisk 里面,代码在这里: https://github.com/yunionio/yunionos/blob/master/src_pxe/etc/init.d/S99notify

对应到 ramdisk 的地方是:/etc/init.d/S99notify

522623905 commented 1 year ago

/etc/init.d/S80eth0,这个脚本中,直接从系统识别的第一个网卡去发现dhcp请求。但是,第一个网卡,由于系统识别的原因,并不是我们指定的PXE使用的网卡。应该修改成,从 /proc/cmdline 中获取到 BOOTIF 这个变量,他记录的就是 pxe 启动的网卡mac地址,通过mac地址去遍历识别的网卡,如果一致,就用这个mac来发送DHCP,也就是执行 udhcpc 。这样就可以避免这个问题了。

目前现象,看起来是,  pxe 注册时,使用的网卡,和进入ramdisk系统后,再请求dhcp的网卡不是一个。 然后造成的问题是: 1)虽然我注册时,指定的是MAC1; 2)pxe boot启动时,用的是另一张网卡,MAC2,然后dhcp server收到请求后,从DHCP Request中 获取到这个MAC2,再反写到数据库,将MAC1覆盖了; 3)然后流程继续,往下后,以MAC1,发送DHCP请求,但是由于数据库备修改成MAC2了,就无法找到,就无法分配成功了

@522623905 可以拔掉一条网卡的网线吗?保证 pxe 阶段出来的 dhcp 请求都走一张网卡

zexi commented 1 year ago

/etc/init.d/S80eth0,这个脚本中,直接从系统识别的第一个网卡去发现dhcp请求。但是,第一个网卡,由于系统识别的原因,并不是我们指定的PXE使用的网卡。应该修改成,从 /proc/cmdline 中获取到 BOOTIF 这个变量,他记录的就是 pxe 启动的网卡mac地址,通过mac地址去遍历识别的网卡,如果一致,就用这个mac来发送DHCP,也就是执行 udhcpc 。这样就可以避免这个问题了。

目前现象,看起来是,  pxe 注册时,使用的网卡,和进入ramdisk系统后,再请求dhcp的网卡不是一个。 然后造成的问题是: 1)虽然我注册时,指定的是MAC1; 2)pxe boot启动时,用的是另一张网卡,MAC2,然后dhcp server收到请求后,从DHCP Request中 获取到这个MAC2,再反写到数据库,将MAC1覆盖了; 3)然后流程继续,往下后,以MAC1,发送DHCP请求,但是由于数据库备修改成MAC2了,就无法找到,就无法分配成功了

@522623905 可以拔掉一条网卡的网线吗?保证 pxe 阶段出来的 dhcp 请求都走一张网卡

@522623905 这个逻辑有道理,我改进下 yunionos 里面的那个脚本试试

vincentiss commented 10 months ago

遇到同一个问题了 请问这个有修复吗

zexi commented 10 months ago

遇到同一个问题了 请问这个有修复吗

@vincentiss 暂时还没有修复,争取发在下个版本修复。

github-actions[bot] commented 9 months ago

If you do not provide feedback for more than 37 days, we will close the issue and you can either reopen it or submit a new issue.

您超过 37 天未反馈信息,我们将关闭该 issue,如有需求您可以重新打开或者提交新的 issue。