文档目录

适用场景

  • 产品: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 网络服务。

判断方法

  1. 在 UI 上打开出问题的 VPC L3 网络,查看已挂载的网络服务中是否包含 DHCP。
  2. 使用 zstack-cli 查询网络服务提供模块,以及该 L3 网络当前已挂载的服务。
  3. 在该 L3 网络下的云主机内,确认网卡启动时没有收到 DHCP Offer。

原因说明

  • VPC L3 网络没有挂载 DHCP 服务,因此该网络的 VPC vRouter 不会对外提供 DHCP 服务。
  • 或者原先分配的 DHCP 服务 IP 需要迁移到同一 L3 网络范围内的新 IP。

解决方案

1. 执行前准备

  • 在执行 AttachNetworkServiceToL3Network 之前,先确认 L3 网络 UUID 与目标 Flat Network Service Provider UUID。
  • 若要修改 IP,先备份数据库,然后再修改 UsedIpVO。

2. 处理步骤

A. 在 VPC L3 网络上开启 DHCP 服务

  1. 登录 zstack-cli:
   # zstack-cli
   admin >>> LogInByAccount accountName=admin password=password
  1. 查询网络服务提供模块并记录其 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。
  1. 为该 L3 网络挂载 DHCP 服务(分布式 DHCP 使用第 1 个提供模块):
   admin >>> AttachNetworkServiceToL3Network l3NetworkUuid="39cc5ccb7fec48118c4bd47aedd193a2" networkServices="{'e3b79d7832a541398a094ab2d7f60dfa':['DHCP']}"

B. 修改 L3 网络上的 DHCP 服务 IP

  1. 通过 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
   }
  1. 更新 SystemTag,使 DHCP 服务 IP 指向新 IP(新 IP 必须在同一 IP 段内,且当前未被占用):
   UpdateSystemTag uuid=8aba217b49ec31e5822616d98729c81e tag="flatNetwork::DhcpServer::xxx.xxx.119.250::ipUuid::ca64804fd169344796821ccc96459bb2"
  1. 修改 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
   }
  1. 重连物理机。否则物理机内 DHCP namespace 中的 IP 不会更新。

验证方法

  • 在该 L3 网络上新建的云主机能够从 DHCP 获取 IP。
  • 修改 DHCP 服务 IP 之后,CheckIpAvailability 显示新 IP it 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 漂移以及在线迁移过程中的异常行为。
通过 zstack-cli 开启 VPC 网络 DHCP 服务并修改 DHCP 服务 IP | 技术方案 · KB | ZStack 资源中心