原因:pod内默认时区是UTC,宿主机时区是CST
解决方式:
一,如果仅仅是运行一个jar文件,可以使用如下命令:
java -jar -Duser.timezone=GMT+08 xxx.jar
在k8s的Deployment文件中,加入上述JVM启动参数:
kind: Deployment
apiVersion: apps/v1
metadata:
name: xxxx
namespace: dev
labels:
app: xxxx
spec:
replicas: 1
selector:
matchLabels:
app: xxxx
template:
metadata:
labels:
app: xxxx
spec:
containers:
- name: xxxx
image: xxxx
command:
- java
- '-jar'
- '-server'
- '-Duser.timezone=GMT+08' #这里指定时区
- /xxx.jar
这种方式简单,但是只能针对这个java应用设定时区,其他应用的时区还是pod的时区
二,通过环境变量设定pod的时区
apiVersion: v1
kind: Pod
metadata:
name: xxx
spec:
containers:
- name: xxx
image: xxx
env:
- name: TZ #时区设置的key
value: Asia/Shanghai #时区设置的value
三,通过修改pod的配置文件中的时区与宿主机一致
思想:让pod使用宿主机的时区文件
时区的配置存储在两个文件中:/etc/timezone 和 /etc/localtime ,分别介绍一下这两个文件,如果不想关心这两个文件存的是啥,不想知道为什么要这么修改,直接看③就行
① /etc/timezone 是个文本文件,内容如下:
就是记录了使用哪个时区
②/etc/localtime并不是一个文件,而是一个软连接:
/etc/localtime所链接的这个文件是个什么文件呢?
由于系统中所有的时区文件都存储在/usr/share/zoneinfo下,其中中国的时区位于Asia目录下的Shanghai 文件中,如下图:
所以配置系统的时区,就是配置/etc/localtime这个软连接所指向的时区文件;
要修改pod的时区,就要修改/etc/timezone 和 /etc/localtime;
③ 修改pod的时区
有两种方式都可以修改pod的时区:
一是在通过Dockerfile制作镜像时,通过RUN 命令运行shell命令来修改:
FROM centos
RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
# 构建容器镜像
$ docker build -t centos7-date:test -f Dockerfile.date .
$ docker run -it centos7-date:test /bin/sh
sh-4.2# date
Wed Mar 6 17:40:01 CST 2019
即执行如下3个命令:
rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
&& echo "Asia/Shanghai" > /etc/timezone
注意RUN后面的脚本是在容器内部执行的,所有它修改的是容器中的文件,
第一条命令:先删除原有的软连接/etc/localtime;
第二条命令:重新建立新的软连接/etc/localtime,让其指向 /usr/share/zoneinfo/Asia/Shanghai
第三条命令:将 /etc/timezone的内容修改为Asia/Shanghai
这种方式仅适用于自己制作的镜像,但是有时候我们是使用别人制作好的镜像,所以有局限性;
二是将宿主机的两个时区文件映射到容器中(这种我没有实际验证过)
apiVersion: v1
kind: Pod
metadata:
name: time
spec:
containers:
- name: time
image: nginx
volumeMounts:
- name: localtime
mountPath: /etc/localtime
- name: timezone
mountPath: /etc/timezone
volumes:
- name: localtime
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
- name: timezone
hostPath:
path: /etc/timezone