背景说明
使用Dockerfile构建容器镜像时,若未指定时区配置,那么构建的容器有可能会使用UTC时间。在云容器引擎中使用该容器镜像构建工作负载时就有可能出现容器实例与云容器引擎的节点时间不一致,相差8小时的现象。
云容器引擎的所有节点统一中国CST时间(UTC+8), 登录节点执行date -R指令进行查看:
[root@0000000g-wcgp0q8ads ~]# date -R
Sat, 06 Apr 2024 18:37:16 +0800
验证Pod实例的工作容器当前时间可以使用kubectl指令,例如查看default命名空间下,名为kubia-mannual的pod工作容器时间:
使用kubectl exec指令可查看pod的工作负载容器当前的时间:
[root@0000000g-wcgp0q8ads ~]# kubectl exec kubia-manual -n default -- date -R
Sat, 06 Apr 2024 10:37:18 +0000
工作容器的时间戳时区为+0000,代表使用的是标准UTC时间, 中国CST时间比标准UTC时间多8个小时
解决该问题有两种方法:
1、构建容器镜像时配置时区
2、通过云容器引擎控制台进行配置
构建容器镜像时配置时区
以Dockerfile方式构建镜像为例,在镜像的Dockerfile中增加以下语句:
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
通过云容器引擎控制台进行配置
云容器控制台可以通过数据卷的方式,将节点的/etc/localtime文件挂载到Pod的工作容器实例中,以此实现时区信息同步,具体操作步骤如下:
1、登录云容器引擎控制台
2、进入【集群】-【工作负载】界面,找到待处理的pod名称,点击【全量替换】按钮 全量替换
3、增加一个主机目录类型的数据卷,设置主机路径为/etc/localtime 数据卷
4、为工作容器增加挂载点 挂载点
提交更改后,容器实例会重启,使用与节点相同的时区配置;
通过云容器引擎创建新的工作负载时,可以使用的操作方法:以数据卷的方式将节点的/etc/localtime挂载到容器实例的/etc/localtime,实现节点与容器实例时间同步。
容器、容器日志时间与节点同步
容器和节点时间同步后,容器的日志时间戳仍可能与节点时间相差8小时。比较典型的应用场景是容器的工作进程为使用tomcat应用。
tomcat应用的日志输出默认使用UTC时间,即便容器与节点时间已经同步,应用的日志输出也会相差8小时,该问题需要在构建镜像阶段解决。
1、先获取基础tomcat镜像的catalina.sh脚本
mkdir tmp
docker run --rm tomcat:<tag> -v tmp:/mnt cp /usr/local/tomcat/bin/catalina.sh /mnt/catalina.sh
2、修改catalina.sh脚本的JAVA_OPTSshell变量,添加-Duser.timezone=GMT+08配置项
JAVA_OPTS="$JAVA_OPTS -Djava.protocal.handler.pkgs=org.apache.catalina.webresources -Duser.timezone=GMT+08"
3、使用Dockerfile重建tomcat应用容器镜像,将修改后的catalina.sh脚本拷贝到构建目录,然后在Dockerfile中添加下列构建指令
COPY catalina.sh /usr/local/bin/tomcat/bin/catalina.sh