适用场景
- 产品:ZStack Cloud
- 版本:4.2.x~4.8.x
- 组件:VPC 网络、DHCP 服务、zstack-cli、MariaDB
UsedIpVO表 - 触发条件: VPC 网络在创建时未挂载 DHCP 服务,导致已有云主机无法获取 IP;或者需要将该 DHCP 服务 IP 更换为同一 IP 段内的另一个地址。
问题现象
- 云主机无法加载到该 VPC 网络,或者重启后云主机无法从该 VPC 网络获取 IP 地址。
- 该 L3 网络在创建时未挂载 DHCP 网络服务。
判断方法
- 在 UI 上打开出问题的 VPC L3 网络,查看已挂载的网络服务中是否包含
DHCP。 - 使用
zstack-cli查询网络服务提供模块,以及该 L3 网络当前已挂载的服务。 - 在该 L3 网络下的云主机内,确认网卡启动时没有收到 DHCP Offer。
原因说明
- VPC L3 网络没有挂载 DHCP 服务,因此该网络的 VPC vRouter 不会对外提供 DHCP 服务。
- 或者原先分配的 DHCP 服务 IP 需要迁移到同一 L3 网络范围内的新 IP。
解决方案
1. 执行前准备
- 在执行
AttachNetworkServiceToL3Network之前,先确认 L3 网络 UUID 与目标Flat Network Service ProviderUUID。 - 若要修改 IP,先备份数据库,然后再修改
UsedIpVO。
2. 处理步骤
A. 在 VPC L3 网络上开启 DHCP 服务
- 登录
zstack-cli:
# zstack-cli
admin >>> LogInByAccount accountName=admin password=password
- 查询网络服务提供模块并记录其 UUID:
admin >>> QueryNetworkServiceProvider fields=name,uuid
{
"inventories": [
{
"name": "Flat Network Service Provider",
"uuid": "e3b79d7832a541398a094ab2d7f60dfa"
},
{
"name": "SecurityGroup",
"uuid": "4b57f5625f354379a179ae2a5e1583f7"
},
{
"name": "VirtualRouter",
"uuid": "eaf2159b6a114d2ca24eb8510d675bf1"
},
{
"name": "vrouter",
"uuid": "49f657c414c64941a94e2829970ca589"
}
],
"success": true
}
说明:
FLAT(Flat Network Service Provider)用于扁平网络。vrouter用于 VPC 网络。VirtualRouter已经不再使用。- VPC 网络也使用第 1 个提供模块,即分布式 DHCP 服务。第 4 个是集中式 DHCP 服务。
- 开启 DHCP 服务之后,会自动从地址池中随机分配一个 IP 作为 DHCP 服务 IP。
- 为该 L3 网络挂载 DHCP 服务(分布式 DHCP 使用第 1 个提供模块):
admin >>> AttachNetworkServiceToL3Network l3NetworkUuid="39cc5ccb7fec48118c4bd47aedd193a2" networkServices="{'e3b79d7832a541398a094ab2d7f60dfa':['DHCP']}"
B. 修改 L3 网络上的 DHCP 服务 IP
- 通过 SystemTag 查询当前 DHCP 服务 IP:
admin >>> QuerySystemTag tag~=xxx.xxx.119.2
{
"inventories": [
{
"createDate": "Dec 25, 2023 5:51:00 PM",
"inherent": true,
"lastOpDate": "Dec 25, 2023 5:51:00 PM",
"resourceType": "L3NetworkVO",
"resourceUuid": "39cc5ccb7fec48118c4bd47aedd193a2",
"tag": "flatNetwork::DhcpServer::xxx.xxx.119.2::ipUuid::ca64804fd169344796821ccc96459bb2",
"type": "System",
"uuid": "8aba217b49ec31e5822616d98729c81e"
}
],
"success": true
}
- 更新 SystemTag,使 DHCP 服务 IP 指向新 IP(新 IP 必须在同一 IP 段内,且当前未被占用):
UpdateSystemTag uuid=8aba217b49ec31e5822616d98729c81e tag="flatNetwork::DhcpServer::xxx.xxx.119.250::ipUuid::ca64804fd169344796821ccc96459bb2"
- 修改 MariaDB 中的
UsedIpVO:
a. 先通过 CLI 检查 IP 的可用性:
admin >>> CheckIpAvailability ip=xxx.xxx.119.2 l3NetworkUuid=39cc5ccb7fec48118c4bd47aedd193a2
{
"available": false,
"reason": "it is used",
"success": true
}
admin >>> CheckIpAvailability ip=xxx.xxx.119.250 l3NetworkUuid=39cc5ccb7fec48118c4bd47aedd193a2
{
"available": true,
"success": true
}
b. 进入 MariaDB 并更新 IP:
# mysql -uroot -pzstack.mysql.password zstack
MariaDB [zstack]> select * from UsedIpVO where ip="xxx.xxx.119.2";
...
| ca64804fd169344796821ccc96459bb2 | 72b4271e4fd2471aa4f31b8292a7772e | 39cc5ccb7fec48118c4bd47aedd193a2 | xxx.xxx.119.2 | 173569794 | xxx.xxx.119.254 | xxx.xxx.255.0 | NULL | NULL | 2023-12-25 17:51:00 | 2023-12-25 17:51:00 | 4 | NULL |
MariaDB [zstack]> update UsedIpVO set ip='xxx.xxx.119.250' where uuid='ca64804fd169344796821ccc96459bb2';
c. 验证:
MariaDB [zstack]> select * from UsedIpVO where ip="xxx.xxx.119.2";
Empty set (0.00 sec)
MariaDB [zstack]> select * from UsedIpVO where ip="xxx.xxx.119.250";
...
| ca64804fd169344796821ccc96459bb2 | 72b4271e4fd2471aa4f31b8292a7772e | 39cc5ccb7fec48118c4bd47aedd193a2 | xxx.xxx.119.250 | 173569794 | xxx.xxx.119.254 | xxx.xxx.255.0 | NULL | NULL | 2023-12-25 18:58:41 | 2023-12-25 17:51:00 | 4 | NULL |
d. 再次通过 CLI 检查 IP 可用性:
admin >>> CheckIpAvailability ip=xxx.xxx.119.2 l3NetworkUuid=39cc5ccb7fec48118c4bd47aedd193a2
{
"available": true,
"success": true
}
admin >>> CheckIpAvailability ip=xxx.xxx.119.250 l3NetworkUuid=39cc5ccb7fec48118c4bd47aedd193a2
{
"available": false,
"reason": "it is used",
"success": true
}
- 重连物理机。否则物理机内 DHCP namespace 中的 IP 不会更新。
验证方法
- 在该 L3 网络上新建的云主机能够从 DHCP 获取 IP。
- 修改 DHCP 服务 IP 之后,
CheckIpAvailability显示新 IPit is used、原 IP 可用。 - 依赖 DHCP namespace 取 IP 的云主机,在物理机重连后会获取到新 IP。
风险与回滚
- 风险:直接修改
UsedIpVO是数据库层面的操作;操作前请先备份 MariaDB。 - 风险:在开启 DHCP 服务之前已经创建的云主机原本没有配置 DHCP;如果其操作系统使用 DHCP,那么重启后会获得不同的 IP。请在重启前先在 guest 内配置好静态 IP。
- 风险:事后开启 DHCP 可能会对在线迁移产生影响,因为云平台会给新云主机分配 DHCP IP,而老的云主机仍使用其静态配置。
- 回滚:通过
DetachNetworkServiceFromL3Network卸载 DHCP 网络服务;如已修改数据库,则从备份中恢复UsedIpVO行。
最佳实践
- 在最初规划时一次性确定该 L3 网络是否使用 DHCP,并保持一致;在已经存在的 L3 网络上反复切换 DHCP 状态可能引发 IP 漂移以及在线迁移过程中的异常行为。
