chrony/ntpd 在 K3s 节点上失效导致时间漂移的修复经验

9次阅读

K3s集群时间漂移主因是chronyd与systemd-timesyncd端口冲突或hypervisor同步未启用;需停用timesyncd、配置chrony国内NTP源及makestep、虚拟机优先启用hypervisor时间同步。

chrony/ntpd 在 K3s 节点上失效导致时间漂移的修复经验

在 K3s 集群中,节点时间漂移往往不是 Chrony 或 NTPd 本身坏了,而是它被系统机制静默覆盖或冲突抑制了。K3s 默认不自带时间同步服务,但它的轻量特性反而放大了时间问题的连锁影响——etcd 心跳超时、证书签发失败、日志时间错乱、operator 控制循环延迟等都可能源于几秒偏差。

确认是否真由 chrony/ntpd 失效引起

先排除 K3s 自身干扰:

  • 运行 timedatectl status,重点看 “System clock synchronized” 是否为 no,且 “NTP service” 显示 inactive 或 unknown
  • 检查是否有 k3s-agentk3s-server 进程在用 --disable-agent--disable-servicelb 等参数启动,部分定制镜像会顺带禁用 systemd-timesyncd
  • K3s 官方文档明确说明:它不管理主机时间,但若启用了 systemd-timesyncd(如 ubuntu 22.04 默认),它可能和 chronyd 抢占 123/udp 端口,导致 chronyd 启动失败却无报错

修复 chrony 冲突与抢占问题

K3s 节点常见于边缘设备或云上小规格 VM,chronyd 更适配这类场景,但需主动规避 systemd-timesyncd 干扰:

  • 停用并屏蔽 timesyncd:
    sudo systemctl stop systemd-timesyncd
    sudo systemctl disable systemd-timesyncd
    sudo timedatectl set-ntp false
  • 确保 chronyd 配置含 rtcsync 和合理 makestep(尤其对重启频繁的 K3s edge node):
    /etc/chrony.conf 中添加或确认:
    makestep 1.0 3
    rtcsync
    logdir /var/log/chrony
  • 强制写入硬件时钟(避免断电后时间归零):
    sudo hwclock --systohc

针对 K3s 特定环境的加固配置

边缘 K3s 节点常面临网络抖动、间歇联网、NAT 环境,chrony 需调优以适应:

  • 使用低延迟国内源(避免跨洋解析失败):
    server ntp.aliyun.com iburst minpoll 4 maxpoll 8
    server time1.cloud.tencent.com iburst minpoll 4 maxpoll 8
  • 增加本地参考时钟兜底(可选):
    refclock SOCK /var/run/chrony.ttyS0.sock refid GPS precision 1e-1 offset 0.0 delay 0.0(需配合 GPS 串口模块)
  • 验证同步质量:
    chronyc tracking —— 关注 Offset 是否持续在 ±50ms 内
    chronyc sources -v —— 确保至少一个 source 的 Reach 值为 377(连续 8 次成功)

虚拟化 K3s 节点的特殊处理

若 K3s 运行在 vmware/KVM 上,宿主机时间不准会直接传导给节点:

  • 优先禁用 chronyd,改用 hypervisor 时间同步:
    VMware:启用 VMware Tools 的 tools.syncTime = "TRUE"
    KVM/QEMU:启用 qemu-ga 并配置 org.qemu.guest_agent.0.command.time-sync
  • 若必须用 chronyd,则在 /etc/chrony.confmakestep 0.1 -1 允许任意小偏差立即跳变,并关闭 slew 模式(避免虚拟机时钟拖慢)
  • 禁止在 K3s 节点上运行 ntpd —— 它不支持虚拟化时钟补偿,容易与 hypervisor 冲突
text=ZqhQzanResources