一直在使用linux的操作系统,对于时间相关的操作,也就仅限于,修改时间,查看时间,通过不同的输出格式查看时间,这些很小的方面,也觉得够用了,但是······
昨天,一个测试的同学问了我一个知识点,让我对于linux的时间设置,又进行了一个全新的,更加深入的探索。
他问我:“k8s中应用的时区是怎么设置的?”
一时间,我语塞,只是隐隐约约的记得/etc/localtime这个数据卷的挂载,既然无法彻底的说清楚,那么就只好派上我的杀手锏-检索。
经过几个小时的研究、探索,我得出以下的结论:
接下来,我们一一展开。
在linux的环境中,通过以下的命令,即可安装出来时区文件
yum install -y tzdata
安装完成之后,我们可以看到,在环境中,增加了如下的rpm包
[root@nccztsjb-node-23 ~]# rpm -qa | grep tzdata tzdata-2018e-3.el7.noarch
既然,tzdata是为了安装时区信息文件的,那这些信息在什么地方呢,通过这个rpm包,我们可以一探究竟
rpm -ql tzdata-2018e-3.el7.noarch
在/usr/share/zoneinfo目录中的,就是时区信息文件,各种各样的时区,比如,美国,中国,非洲,应有尽有······
那我们有了这些时区信息之后,我们如何来配置,我们当前的环境具体用哪个呢?
对于时区的设置,我们可以通过如下的方式:
[root@nccztsjb-node-23 ~]# ls -l /etc/localtime lrwxrwxrwx. 1 root root 35 Jun 22 2018 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai [root@nccztsjb-node-23 ~]#
这个是目前的时区,我们可以通过timedatectl命令查看
[root@nccztsjb-node-23 ~]# timedatectl Local time: Thu 2022-07-07 09:37:39 CST Universal time: Thu 2022-07-07 01:37:39 UTC RTC time: Thu 2022-07-07 01:35:51 Time zone: Asia/Shanghai (CST, +0800) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a [root@nccztsjb-node-23 ~]#
那么,咱们这里演示一个,设置为其他的时区的示例:
rm -f /etc/localtime ln -s /usr/share/zoneinfo/America/Santiago /etc/localtime [root@nccztsjb-node-23 America]# ls -l /etc/localtime lrwxrwxrwx 1 root root 36 Jul 6 21:39 /etc/localtime -> /usr/share/zoneinfo/America/Santiago [root@nccztsjb-node-23 America]#
此时,已经设置为“America/Santiago”
[root@nccztsjb-node-23 America]# timedatectl Local time: Wed 2022-07-06 21:40:15 -04 Universal time: Thu 2022-07-07 01:40:15 UTC RTC time: Thu 2022-07-07 01:38:27 Time zone: America/Santiago (-04, -0400) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: no Last DST change: DST ended at Sat 2022-05-14 23:59:59 -03 Sat 2022-05-14 23:00:00 -04 Next DST change: DST begins (the clock jumps one hour forward) at Sat 2022-08-13 23:59:59 -04 Sun 2022-08-14 01:00:00 -03 [root@nccztsjb-node-23 America]# date Wed Jul 6 21:40:18 -04 2022 [root@nccztsjb-node-23 America]#
OK,这里就通过/etc/localtime建立和时区文件软链接的方式,设置了当前环境的时区。
其实,除了这种方式,还有一种更便捷的方式······
通过设置TZ环境变量,我们获得比/etc/localtime更高的优先级,用来设置当前环境的时区
export TZ="Asia/Shanghai"
通过以下的前后对比图:
我们可以发现,快速的将当前环境的时区,设置为需要的时区。
事实上,如果你使用了redhat 7以上的版本,还有一个工具一样可以快速的设置时区
没错,就是timedatectl工具,可以用来显示、设置时区,我们来看
a.显示当前时间设置
[root@nccztsjb-node-23 ~]# timedatectl Local time: Wed 2022-07-06 21:46:28 -04 Universal time: Thu 2022-07-07 01:46:28 UTC RTC time: Thu 2022-07-07 01:44:39 Time zone: America/Santiago (-04, -0400) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: no Last DST change: DST ended at Sat 2022-05-14 23:59:59 -03 Sat 2022-05-14 23:00:00 -04 Next DST change: DST begins (the clock jumps one hour forward) at Sat 2022-08-13 23:59:59 -04 Sun 2022-08-14 01:00:00 -03 [root@nccztsjb-node-23 ~]#
b.列出所有可设置的时区
timedatectl list-timezones
c.最后设置需要的时区
timedatectl set-timezone "Asia/Shanghai"
惊奇的发现,通过timedatectl工具设置好时区后,连/etc/localtime也重新建立了和对应时区文件的连接。
OK,到这里就是linux环境中,如何安装、配置使用时区的方法了。
不过,那位测试同学的问题好像,还没有解决,k8s的pod如何设置时区?
如果我们彻底理解了上面的流程,应该是非常简单的了。
1、首先k8s中pod使用的镜像必须包含时区文件(可安装tzdata包,或者挂载宿主机的/usr/share/zoneinfo目录)
2、在1的基础上,通过/etc/localtime或者TZ环境变量的方式,可以实现时区的设置。
当然了,对于时区设置/etc/localtime的挂载,无非也就是将主机上的链接映射到容器里面而已。
如果,容器的镜像中,已经存在时区文件,最好直接用TZ环境变量,会更加的便利、快捷。