chronyd(chrony端口)

chronyd(chrony端口)写在前面 每个人的环境都不一样 所以生产环境操作前一定要在你的测试环境中仔细验证后再操作 以下内容纯属个人理解 并没有对错 只是参考 盗版不纠 才能有限 希望不误人子弟为好 以下属于个人实验 实际运用当中需要结合实际需求 参考有风险 实施需谨慎 文档信息 文档变更记录 最近接触了 k8s 集群 etcd 集群等等 发现集群内如果时间不同步 会出现一些意想不到的问题

大家好,我是讯享网,很高兴认识大家。



写在前面

每个人的环境都不一样,所以生产环境操作前一定要在你的测试环境中仔细验证后再操作。

以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。

以下属于个人实验,实际运用当中需要结合实际需求,参考有风险,实施需谨慎。

文档信息

文档变更记录

最近接触了k8s集群,etcd集群等等,发现集群内如果时间不同步,会出现一些意想不到的问题。

所以这里主要讨论下集群下的时间同步问题,本文的基础是以RockyLinux 8为基础。你可能会使用ntpd,ntpdate这些工具进行时间同步,但是Centos 8系列中,这些工具已经被淘汰了,在基础仓库里无法找到了,

而且Centos 7也有chrony,所以这里着重介绍Chrony来实现集群内的时间同步。

这里希望阅读完这篇文档,能够帮助解决2个问题:

  1. 我该如何设计时间集群
  2. 实际应用需要注意哪些问题

官方文档:

​​https://chrony.tuxfamily.org/​​

​​https://chrony.tuxfamily.org/faq.html​​

从chrony的官方文档可以有一些常见的问题解答,不过国内无法访问。

巨人的肩膀:

​​https://help.aliyun.com/document_detail/92704.html​​

​​https://datatracker.ietf.org/doc/html/rfc1305​​

​​https://yfeng9186.gitee.io/blog/2020/2/linux-%E6%97%B6%E9%97%B4%E5%90%8C%E6%AD%A5%E4%B9%8Bchronyd​​

除了以上的链接,还有万能的互联网,如果侵权了,可以通过上方文档的邮箱联系我。

本文档的实验环境,是在本地PC上模拟,不是云主机,如果是其他环境请自行测试

时间管理的主要的两个目的:

  1. 对外,保证本地的时间和国际通用时间保持同步,通过NTP协议与时间源同步
  2. 对内,保证系统时间和硬件时间保持同步

首先我们先了解一下Linux中和时间有关的一些简单的概念,这些便于以下内容的展开

系统时间:会发现一些比如Universal time,system time,都表示是系统内核进行的处理,和硬件无关

UTC:整个地球分为二十四时区,每个时区都有自己的本地时间,在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC:Universal Time Coordinated)

时区:这里自己可以去网上搜一下,有详细的展开,主要是我们中国使用的是CST,系统默认不是,但是我们通常都是配置CST,所以需要注意一下。

硬件时间(RTC): The Hardware Clock也可以叫real time clock也就是RTC,一般pc和服务器等设备都有一个和系统无关的小程序,通常是cmos电池维持其运行,不受服务器和操作系统的开启关闭影响,我们可以通过bios或者开机后通过系统设置进行校正。

​​https://zh.wikipedia.org/wiki/%E7%B6%B2%E8%B7%AF%E6%99%82%E9%96%93%E5%8D%94%E5%AE%9A​​

chronyd的那些事_系统时间
讯享网

啥也不说了,佩服去吧。别说设计了,我看都看不懂NTP的算法,哈哈。

知其然知其所以然,无法更为详细的解释chrony同步时间的一个算法,所里这里只能对其现象进行一些实验。

更为深入的解析,我目前还无法做到,所以各位看官见谅。

如下图是NTP的一个交互过程。

chronyd的那些事_系统时间_02

chronyd的那些事_系统时间_03

chronyd的那些事_服务器_04

​​https://www.cnblogs.com/pipci/p/12833228.html​​

上面说了NTP的协议标准,下面就看NTP协议的一些常见的具体实现,

1、以前Linux时间同步基本是使用 ntpdate 和 ntpd 这两个工具实现的,但是这两个工具已经很古老了

ntpd是步进式平滑的逐渐调整时间,而ntpdate是断点式更新时间。所以当时间偏差比较大的时候ntpd同步就会比较慢,所以经常会有人用crontab来配置ntpdate定时的去更新时间。

2、RHEL/CentOS 7.x及以上版本已经将 chrony 作为默认时间同步工具了,本文主要讨论的就是这个

3、其他Linux (如 ubuntu,debian,openSUSE) 使用 systemd-timesyncd 服务。

systemd-timesyncd是断点式更新时间,也就是时间不同立即更新,这样会对某些服务产生影响,所以在生产环境尽量不要用,在桌面环境或者是系统刚开机时来进行时间同步还是很好的。timesyncd 替代了 ntpd 的客户端的部分。默认情况下 timesyncd 会定期检测并同步时间。它还会在本地存储更新的时间,以便在系统重启时做时间单步调整。systemd-timesyncd只能作为客户端,不能作为NTP服务器,要成为NTP服务器,可以安装chrony、ntpd,或者open-ntp。推荐chrony

4、虚拟机,以下是Vmware的时间同步,但是这个需要安装Vmware tools,这个不是默认安装的,所以一般不用关心,还有就是Esxi等其他的虚机,也要注意这块问题。

chronyd的那些事_系统时间_05

chronyd的那些事_系统时间_06

这里就不讨论vmware tools的安装了,我目前的环境暂时用不到。而且即使是虚拟机,宿主机也是需要使用上面的一些工具实现时间同步

第一个问题,“我该如何设计时间集群”,这就是架构问题,比如我的k8s集群有3个master节点,一堆node节点,我需要保证整个集群节点的时间一致性。

首先假设每个节点都可以访问公网,那么我们直接都从公共ntp服务器来同步时间。这个时候多个server就是备份,但是要监控主机的公网状态,如果公网不行了,时间同步就会失败。

那如果是无法访问公网的情况,就需要在局域网内自己搭建ntp服务器,但是一个ntp服务器不行,一旦挂了,就会出现无法使用的情况,server可以配置多个用于备份,此时需要使用多个主机来部署ntp server,客户端指定多个ntp server,但是ntp server需要能保证访问公网。否则时间不准确的日志和告警等信息没有参考价值。

也就是说必须要ntp server能够访问公网。此时也需要有监控,否则ntp server无法访问公网提示还提供chrony服务就不合适。

可以把ntp server和etcd集群放在一起,不浪费资源。

chronyd的那些事_时间同步_07

​​http://www.ntp.org.cn/pool​​

​​https://www.ntppool.org/zh/​​

NTP(network time protocol),通过这个协议,来实现网络中时间的同步,端口是UDP 123

和dns类似,总是要有个节点作为参考。

中国国家授时中心 NTP服务器地址是 ntp.ntsc.ac.cn

估计其他公共的NTP服务器的时间源就是上面的地址,但是我们也不用使用这个作为自己的源,因为这个是在北京,就近原则。过去我经常使用的就是ntp.aliyun.com,但是如果说要配置一个公共ntp服务器地址,确实不必要,因为有pool这个东西,类似yum仓库优先使用mirrorlist而不用baseurl一样。

现在我们只需要在chrony中配置地址池的地址,而不是server的地址,它会选择合适的服务器作为源

chronyd的那些事_时间同步_08

默认硬件时间是UTC格式的时间,

主要是2个作用把系统时间同步到硬件时间上,或者把硬件时间同步到系统上。

chronyd的那些事_系统时间_09

如上可以看出来,RTC的时间会和系统时间发生一定的偏差,此时我们可以使用clock命令来手动的同步。一般默认RTC是使用的UTC格式时间,所以和Universal time对比即可。

RTC in local TZ是no的状态,也不建议修改为yes。

但是会发现RTC和Universal time总是会偏差,不能总是手动clock 吧,懒惰的人类自然是不用的,下面chrony服务配置中有个参数rtcsysnc 每隔11分钟会把系统时间同步到RTC中去。

hwclock –set –date 来修改rtc时间,以便测试。

chronyd的那些事_系统时间_10

chronyd的那些事_服务器_11

chronyd的那些事_服务器_12

可以看出来有显示上有一定的区别。

​​https://www.freedesktop.org/software/systemd/man/systemd-timedated.service.html#​​

timedatectl就是systemd-timedated.service的客户端

虽然各种把timedatectl和systemd-timesyncd.service联系在一起,在RockyLinux8的man timedatectl的example中也有systemd-timesyncd.service联系,给我造成了一定的误导。可以参考上面的“ntp实现”

chronyd的那些事_服务器_13

NTP service有两个状态active和inactive,可以通过timedatectl set-ntp 来设置。

会把chronyd服务关掉,慎用。不仅仅是停止服务,还会把自启动关闭。

chronyd的那些事_服务器_14

NTP service: 状态更新是比较及时的,ntp服务停了,就是inactive,开启就是active

System clock synchronized:状态就比较复杂一点,不确定这个是根据什么文件等来判断是yes还是no的。

首先chronyc tracking如果是local 本地源的话,这个状态一直是no的。如果chronyc sources没有源,此时也是no,而且如果是local 本地源也会导致chronyc sources没有源,如果有源但是没有状态是^*的,也是no,

有了^*但是system time这里不是0的也是no,

说明代表的意思就是在和时间源同步成功的情况下,并且系统时间同步成功,才会显示yes。

如下图,因为chrony的makestep 1 1, limit是正值,所以这里启动后几次后,就会是慢慢修订而不是直接同步。

所以 System clock synchronized 状态是no,等同步好了,就会变成yes

chronyd的那些事_系统时间_15

chronyd的那些事_服务器_16

timedatectl list-timezones可以查看所有的时区

timedatectl set-timezone 然后从上面的Zone选择一个。就会把/etc/localtime文件软连接到指定的时区

chronyd的那些事_系统时间_17

问题:timedatectl timesync-status

chronyd的那些事_时间同步_18

这个可能安装桌面环境才需要。

server

peer

local

默认配置文件路径:/etc/chrony.conf

具体可以man chrony.conf查看帮助 ,也可以在线帮助,翻译方便。

​​https://chrony.tuxfamily.org/doc/4.1/chrony.conf.html​​

按功能分为以下部分的配置:

Time sources:设置时间源,例如:server,peer,pool。

Source selection:时间源的选择

NTP server:主要和作为ntp server相关的参数

Command and monitoring access :主要是和chronyc相关的一些参数

System clock: 和系统时间相关的参数,把同步来的是时间同步到系统时间上去,例如:makestep

Real-time clock (RTC):和rtc相关的一些参数,把同步来的时间同步到硬件时间上去,例如:rtcsync

logging:和chronyd日志相关的参数。


chronyd的那些事_服务器_19

chronyd服务启动后会启用2个端口

123/udp 用于提供ntp server 服务

323/udp 用于提供chronyc连接的管理端口。

​​https://www.ntppool.org/zh/use.html​​

pool/server 用于指定chrony同步时间的时间源,两个指令可以同时使用

chronyd的那些事_时间同步_20

pool <hostname> [option]…

option有个maxsources默认是4,最大16。

如下图所示,pool是个公益项目,看自己需求,使用默认参数即可。没必要修改maxsources

chronyd的那些事_系统时间_21

server <hostname> [option]… 指令最好配置3个,用于备份,所以本地网络中最好有3个ntp server。这样即使1个挂了,还有备份。

iburst表示的是首次同步的时候快速同步,chronyc中可以使用交互式命令,online和offline快速启用和禁用server。实现这个过程。

如上我们指定了多个server和pool,如何选择时间源。

这里就需要时间源选择算法,核心就是在多个时间源中如何选择合适的一个时间源

stratumweight distance:stratumweight指令设置当chronyd从可用时间源中选择同步源时,每一stratum应添加多少同步距离。

默认情况下,该值是0.001秒。这意味着,在选择同步源的过程中,只有当时间源距离之间的差异以毫秒为单位时,时间源的stratum才有意义。在chronyd选择同步时间源时,即使处于stratum低层级的时间源距离更远,也比另一个处于stratum高层次的时间源更容易被选中。将stratumweight设置为0时,可以使chrongyd选择时间源时忽略stratum层次。

也就是说假设一个是10层,一个是3层,假设当前3层给的时间是10:00:001,10层给的时间是10:00:002此时看时间小的,不看stratum高的也就是数字小的,如果当前3层给的时间是10:00:009,10层给的是10:00:001,此时选择哪个source作为时间源呢?

chronyd的那些事_系统时间_22

allow指令:需要配置,让chronyd去响应客户端请求,如果allow后不跟子网或主机地址就是响应所有来自ipv4和ipv6的访问

chronyd的那些事_服务器_23

bindaddress:chrony的ntp服务监听在哪个ip上

binddevice:chrony的ntp服务监听在哪个接口port:chrony对外提供ntp server的端口,默认是123,port可以配置为0,表示只作为ntp client同步时间,不提供ntp server服务。此时如果allow没配置的话,那么此时也不需要添加 port 0的指令。

!!!如果allow不开启的话,port和bindaddress、binddevice没有意义,因为不会监听。

local :当本地ntp server的外部的time sources不可用时,可以用本地时间去给内部网络的客户端去同步时间。

这句话怎么理解呢,用人话就是,如下图,如果我不配置local指令,当无sources源可用的时候,不会启用local preference mode,无法提供ntp server的服务了。

chronyd的那些事_时间同步_24

chronyd的那些事_服务器_25

如果配置了local指令,当chrony的其他源无法同步的时候,才会启用本地参考模式。否则不会启用,此时stratum是随着当前同步的时间源的值而变化,而不是配置的值。比如当前chrony同步的是源stratum是2,那么chrony服务器的stratum就是3,如果chrony同步的是源stratum是3,那么chrony服务器的stratum就是4。如果没有同步的源了,那么stratum就是配置的值了。

chronyd的那些事_时间同步_26

chronyd的那些事_系统时间_27

chronyd的那些事_时间同步_28

orphan说是在孤岛网络里使用,这个一直无法验证。即使我3台都配置了local stratum 10 orphan,但是都是^X的状态,不会说去选择reference id最小的,不知道为何。

​​https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/setting-up-chrony-for-a-system-in-an-isolated-network_using-chrony​​

把从时间源同步的时间同步到系统时间上。

makestep threshold limit threshold:表示阈值,系统时间和时间源之间的偏差,单位秒

不受limit的影响,这个是makestep的前提条件,也就是说如果本地和时间源的时间偏差超过多少秒,才会触发step断点式更新,直接同步时间。

limit:限制次数,允许chrony启动后,快速去修正同步多少次,超过次数后则会采用slew time的方式,慢慢的修正,如果相差时间过大,会很慢;如果为负值,则不限制次数,step方式去更新系统时间,

说是步进时钟(时间跳跃)可以快速修正偏差较大的时间误差,但是有可能会导致一些程序异常,因此应当慎用这个选项,但是不使用的话,会导致时间无法修复。不是更影响程序吗。

这里有个问题,为何不把threshold设置小,默认是1s,可以设置0.1s,这样影响应该就不大了吧。这里主要是影响程序的时间阈值不好判定,1s可以避免频繁的step 修正。当然如果设置为0.1也没有造成频繁的step修正的话,也可以设置为0.1s,看你能接受的时间偏差范围。

makestep 0.1 -1

chronyd的那些事_系统时间_29

rtcsync:rtcsync指令启用系统时间定期复制到 RTC 并且chronyd不会尝试跟踪其漂移的模式。该指令不能与rtcfile指令一起使用。

前提是,系统时钟必须是同步的,也就是system clock synchronized是yes的状态。

在 Linux 上,内核每 11 分钟执行一次 RTC 复制。

在 macOS 上,当系统时钟处于同步状态时, chronyd将每 60 分钟执行一次 RTC 复制。

在其他系统上,该指令什么也不做。

遇到的问题:

问题:如下图所示,没有生效,11分钟过去了,rtc依然没有从 system time同步。

chronyd的那些事_服务器_30

修改rtcsync改为rtcfile,结果出现rtc不可用情况

chronyd的那些事_服务器_31

chronyd的那些事_系统时间_32

chronyd的那些事_服务器_33

以为master1是把公网关了,使用的是本地时间做为时间源。所以测试下master2,master2以master1作为时间,修改下master2的rtc时间,看master2会不会在11分钟的时候更新rtc时间。

chronyd的那些事_时间同步_34

果然在11分钟的时候更新了。

chronyd的那些事_系统时间_35

结论就是:

rtcsync同步的关键是要系统时钟同步状态是yes才可以。

rtcfile启用后,hwclock无法正常使用。rtcfile和hwclock是互斥的。

logdir定义了chronyd日志的目录

log 定义日志的文件,仅仅定义了logdir是没有用的。

rtc日志,需要配置rtcfile /var/lib/chrony/rtc,当chronyd退出或者其他原因会把便宜保存到/var/lib/chrony/rtc中,第一次不会生成这个文件。

rtcsync不能配置,配置了,也不会产生rtc.log

chronyd的那些事_时间同步_36

这里面就想看下chronyd服务自己的一些日志,但是没有。上面那些日志的格式,都是常人无法理解的信息。

下面系统日志提示的都是一些终结态的信息,其中的一些逻辑判断信息,这里没有。

所以你不知道为啥它就判断没有可用的源了,然后就检测到时间便宜了,然后又选择到了可用的时间源,然后由修订了时间。

chronyd的那些事_时间同步_37

客户端工具,本地的话建议使用交互式命令,方便,如下help可以看到所有支持的命令

chronyd的那些事_服务器_38

chronyd的那些事_系统时间_39

MS:M代表source mode,一般都是^表示server,配置文件中指定的也是server

主要是S,source state,

?:代表不可用,

*:代表当前同步的时间源

+/-:

x:

chronyd的那些事_时间同步_40

Stratum:表示的是时间源的层级,不是自己的层级。取值范围是1-15

chronyd的那些事_服务器_41

Poll: 表示对时间源进行轮询的频率。Poll 为6,表示每隔2^6=64s(秒)对该时间源轮询,Poll 为9就是每隔2^9=512s(秒)。chronyd会根据情况自动调整轮询频率,所以这里会看到这个值在变化。

Last sample :

xxxx 【yyyy】 +/- zzzz 可以看到这里的单位有ns/us/ms/s

1秒(s) =1000毫秒(ms)
1毫秒(ms)=1000微秒 (us)
1微秒(us)=1000纳秒 (ns)




这一列显示了最后一次测量到的本地时间与时间源之间的偏移量。

yyyy表示实际测量的偏移量,。

xxxx的数字显示的是最初的测量值,经过调整后可以应用到本地时钟上。‘+/-’符号后的数字显示的是测量误差。‘+’表示本地时钟比时间源快。

zzzz

chronyd的那些事_时间同步_42

Stratum:这个是相对Reference id的层级,这里是3,说明Reference id的层级是2,在chronyc sources中看到的这个时间源的stratum值应该是2.

Ref time:就是上次同步的时间源给的时间

Update interval:同步的间隔,64s左右,基本上是chronyc sources中pool的时间,2^6=64s

System time:这个就是本地时间和时间源提供的Ref time之间的差距,这里是slow of Ntp time也就是比时间源慢了,因为我虚拟机挂机后打开的,因为我makestep的limit是正值,所以它只能slewing 慢慢的修正。

如果相差时间过大,那么slew修订的时间会巨慢,可以尝试date -s 先修订下时间

Frequency、Residual freq、Skew:ppm (part per million)百万分之一,算法需要的值,反正解释了我也不理解,就算了吧。

chronyd的那些事_时间同步_43

chronyd的那些事_服务器_44

手动同步系统时间。

有一定延迟,说是强制同步系统时间,但是并不是像date -s 一样系统时间时间直接就变了。

而且会使chrony重新选择时间源,不知道这个命令的意义是啥,和重启chrony有啥区别

chronyd -q ‘server ntp.aliyun.com iburst’

chronyd的那些事_时间同步_45

还不如在chrony启动前去执行这个命令,但是这玩意有和makestep 1 3里面的前几次跳跃式同步也没啥区别。

chronyd的那些事_系统时间_46

这里可以看到,chronyc tracking的时候,

Ref time是正确的,但是system time并没有修订。所以同步时间是没有问题的,但是没有把系统的时间给修订掉。

chronyd的那些事_系统时间_47

可以看到时间是慢慢调整,不是跳跃式的调整,此时相差时间太大,无法快速修订。

chronyd的那些事_服务器_48

通过chronyc makestep快速同步了system clock,但是RTC时间chrony并没有间隔11分钟,把系统时间同步到rtc上,手动执行hwclock -w才同步。所以为什么rtc时间没同步呢。

这个问题在上面的配置部分,Real time clock部分有解释。但是为什么时间同步了,system clock sysnchronized还是没有变成yes,这里可能是状态的一个延迟问题。

chronyd的那些事_系统时间_49

chronyd的那些事_时间同步_50

chronyd的那些事_时间同步_51

chronyd的那些事_时间同步_52

chronyd的那些事_系统时间_53

结论就是:

makestep threshold limit中,limit是正值的时候,Backward time能跃进的修订,但是Forward time慢慢修订。

当是负值的时候,Backward time和Forward time都能跃进的修订。

“Can’t synchronise: no selectable sources” 这个不是关键问题,容易误导人

chronyd的那些事_系统时间_54

chronyd的那些事_系统时间_55过了一个小时的时间,才判断时间源无效。此时local stratum 10生效。

chronyd的那些事_服务器_56

chronyd的那些事_时间同步_57

因为我master1 时间和其他时间源相差过大,所以这里是x的状态,如果我把master2其他源去掉后重启

如下图。就是简单的局域网ntp client和server关系。当然备份的考虑,我这里办本地的ntp server可以多个。

下面一个问题就是多个ntp server的问题

chronyd的那些事_系统时间_58

chronyd的那些事_服务器_59

当我把其中一个服务器上的chrony服务停掉后

chronyd的那些事_服务器_60

chronyd的那些事_服务器_61

发的包,181和183reference id报文里都是127.127.1.1,但是落地显示不一样呀。chronyd的那些事_服务器_62

chronyd的那些事_系统时间_63

结论就是

如果所有ntp server都不能有自己的time source的话,就是不配置server,local preference mode,只能有一个,local stratum xxx 只能配置在一个server上,也就是只能有一个server。所以尽量保证ntp server可以访问internet的时间源,然后选择一个ntp server配置local stratum用来保底。

想要看同步的效果等,可以使用date来设置时间,然后来测试效果。

防止中间人攻击,使用安全的方式

小讯
上一篇 2025-06-08 19:57
下一篇 2025-06-11 11:47

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/189681.html