文档目录
Note:

操作前需确认维护窗口。修改物理机时间后,云主机时间也可能随之变化,并影响依赖系统时间的业务。

适用场景

  • 产品:ZStack Cloud 双管理节点(MN)HA 部署。
  • 版本:4.2.x~4.8.x。
  • 组件:chronyd、/etc/chrony.conf、zstack.properties。
  • 触发条件:需要将平台时间源(NTP )变更为新的外部时间服务器。

问题现象

  • 客户需要为 ZStack Cloud 平台变更时间源。
  • 完成时间源切换后,物理机和管理节点必须保持时钟一致,以确保云主机调度、日志关联和 HA 决策的正确性。

判断方法

  1. 维护开始前确认平台与所有存储池均健康。
  2. 确认没有备份或其他长任务正在运行,再重启管理节点服务。
  3. 明确当前主管理节点的 IP,该值将用作 chrony.serverIp.0。

原因说明

管理节点为整个平台提供时间同步服务。平台在每台管理节点上使用 chronyd,并通过 zstack.properties 中的 chrony.serverIp.0 告诉物理机上的 agent 应该向哪台管理节点同步。要变更时间源,必须同步修改主管理节点的 /etc/chrony.conf 以及两台管理节点的 chrony.serverIp.0,并让物理机重新连接以加载新配置。

解决方案

1. 执行前准备

  • 在开始变更前,关闭全局云主机高可用。
图 1. 关闭全局云主机高可用

关闭全局云主机高可用
  • 在两台管理节点上分别备份 ZStack MySQL 数据库:
  # 主节点
  zstack-ctl dump_mysql --file-name zstack-db-backup-master
  # 备节点
  zstack-ctl dump_mysql --file-name zstack-db-backup-slave
  • 确认新的 NTP 服务器地址,并验证其可从管理网络访问。

2. 处理步骤

Note:

执行以下 zstack-cli 命令前,请先登录 admin 账号:

``bash zstack-cli LogInByAccount accountName=admin password=<password> ``

以下循环命令以 apache-tomcat-8.5.87 为示例,配套截图中的源环境路径为 apache-tomcat-8.5.99。不同 ZStack Cloud 版本的 Tomcat 目录版本号可能不同,执行前必须确认当前环境的实际 apache-tomcat-x.x.xx 路径,并替换后续所有 SSH 命令中的密钥路径。

  1. 列出物理机。
   zstack-cli QueryHost hypervisorType=KVM fields=managementIp | grep managementIp | awk -F '"' '{print $4}'
图 2. 查询 KVM 物理机管理 IP

查询 KVM 物理机管理 IP
  1. 查看每台主机当前 chrony 同步来源。
   for i in `zstack-cli QueryHost | grep man | awk -F "\"" '{print $4}'`; do
     ssh -i /usr/local/zstack/apache-tomcat-8.5.87/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa $i \
       "echo $i; chronyc sources -v | tail -n2"
   done
图 3. 查看各节点当前 chrony 同步来源

查看各节点当前 chrony 同步来源
  1. 在主管理节点上配置新的 NTP 时间源。
   cp /etc/chrony.conf /root/chrony.conf.bak
   vi /etc/chrony.conf
   # 新增或更新为:
   server <new NTP time source> iburst
图 4. 配置 chrony NTP 时间源

配置 chrony NTP 时间源
  1. 更新两台管理节点上的 chrony.serverIp.0。
   cp /usr/local/zstack/apache-tomcat/webapps/zstack/WEB-INF/classes/zstack.properties \
      /root/zstack.properties.bak
   vi /usr/local/zstack/apache-tomcat/webapps/zstack/WEB-INF/classes/zstack.properties
   # 设置:
   chrony.serverIp.0=<IP of the primary management node in the cluster>
图 5. 配置 zstack.properties 中的 chrony.serverIp.0

配置 zstack.properties 中的 chrony.serverIp.0
  1. 重启双管理节点服务并验证配置。
  • 确认平台上没有备份或其他任务在运行。
  • 重启双管理节点服务:
     zsha2 stop-node; zsha2 start-node
  • 验证新配置已生效:
     zstack-ctl show_configuration | grep -i chrony
图 6. 检查管理节点 chrony 配置

检查管理节点 chrony 配置
  1. 重新连接物理机。
  • 在 UI 中逐一重连每台物理机,使主机加载 zstack.properties 中的新时间源配置。
  1. 在每台物理机上重启 chronyd 服务。

在 host_ip.txt 中逐行填写当前环境的所有计算节点管理 IP。

图 7. 打开 host_ip.txt 文件

打开 host_ip.txt 文件
图 8. 在 host_ip.txt 中逐行填写计算节点管理 IP

在 host_ip.txt 中逐行填写计算节点管理 IP
   for i in `cat host_ip.txt`; do
     ssh -i /usr/local/zstack/apache-tomcat-8.5.87/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa $i \
       "echo $i; systemctl restart chronyd"
   done
图 9. 重启计算节点 chronyd 服务

重启计算节点 chronyd 服务
  1. 验证节点时间同步。
   chronyc sources -v

每台节点的输出中,所选时间源前必须带 * 标记。

图 10. 验证 chrony 时间同步状态

验证 chrony 时间同步状态
  1. 检查 Ceph 集群健康,再将时间写入硬件时钟(所有节点)。
   for i in `zstack-cli QueryHost | grep man | awk -F "\"" '{print $4}'`; do
     ssh -i /usr/local/zstack/apache-tomcat-8.5.87/webapps/zstack/WEB-INF/classes/ansible/rsaKeys/id_rsa $i \
       "echo $i; hwclock -w"
   done
图 11. 写入硬件时钟

写入硬件时钟
  1. 重新开启全局云主机高可用。
  • 在 UI 中将全局云主机高可用重新打开。
图 12. 重新开启全局云主机高可用

重新开启全局云主机高可用

验证方法

  • 在每台管理节点和物理机上执行 chronyc sources -v,新 NTP 服务器前应显示 *。
  • 在两台管理节点上执行 zstack-ctl show_configuration | grep -i chrony,应显示新的 chrony.serverIp.0 值。
  • Ceph 集群健康检查(UI)报告健康。
  • 重新启用全局 HA 后,云主机业务和高可用策略表现正常。

风险与回滚

  • 风险: 变更过程中会重启管理节点服务,UI 将短暂不可用。
  • 业务时间风险: 修改物理机时间后,云主机时间也可能随之变化,并影响依赖系统时间的业务。
  • 兼容性: 两台管理节点上的 chrony.serverIp.0 必须保持一致(为主管理节点的 IP)。
  • 回滚: 从 /root/chrony.conf.bak 恢复 /etc/chrony.conf,从 /root/zstack.properties.bak 恢复 zstack.properties,然后重启 chronyd 与管理节点服务。
在 ZStack Cloud 双管理节点 HA 部署上变更时间源(NTP) | 技术方案 · KB | ZStack 资源中心