在安装Kubernetes集群的过程中并没有注意到pod的时间问题,直到在Tomcat上部署应用后发现pod中的时间与Node上的时间不同步。针对时区不同文章有以下解决方案
Kubernetes
Kubernetes 1.14 二进制集群安装
新闻联播老司机
问题
在Kubernetes集群中运行的容器默认会使用UTC时间,即北京时间为凌晨3点时,容器时间为晚上7点,中间会有8小时时差。而有些分布式系统对于时间极为敏感,不允许出现时间误差
这里我们构建一个Nginx镜像,查看构建前的时间
apiVersion: v1 kind: Pod metadata: name: time-nginx spec: containers: - name: time-nginx image: nginx args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
创建完Pod后我们查看一下时间
[root@k8s-01 test]# kubectl logs -f time 337: Fri May 1 19:01:30 UTC 2020 338: Fri May 1 19:01:31 UTC 2020 339: Fri May 1 19:01:32 UTC 2020 340: Fri May 1 19:01:33 UTC 2020 341: Fri May 1 19:01:34 UTC 2020 342: Fri May 1 19:01:35 UTC 2020
在通过百度查看一下现在的时间
解决
首先要确保宿主机时间同步
timedatectl set-timezone Asia/Shanghai #将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 #重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond
目前解决Pod和宿主机时间不一致有以下集中解决方案
通过定制Dockerfile添加时区
$ cat Dockerfile.date 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 . Sending build context to Docker daemon 4.426GB Step 1/2 : FROM centos ---> 1e1148e4cc2c Step 2/2 : RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone ---> Running in fe2e931c3cf2 '/etc/localtime' -> '/usr/share/zoneinfo/Asia/Shanghai' Removing intermediate container fe2e931c3cf2 ---> 2120143141c8 Successfully built 2120143141c8 Successfully tagged centos7-date:test $ docker run -it centos7-date:test /bin/sh sh-4.2# date Wed Mar 6 16:40:01 CST 2019
通过将时区文件挂在到Pod中
[root@k8s-01 test]# cat time-mount.yaml apiVersion: v1 kind: Pod metadata: name: time spec: containers: - name: time image: nginx args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done'] volumeMounts: - name: timezone mountPath: /etc/localtime volumes: - name: timezone hostPath: path: /usr/share/zoneinfo/Asia/Shanghai
我们可以通过命令查看,/etc/localtime的目录实际上就是个软连接
如果需要系统修改时区,那么只需要将时区文件覆盖到/etc/localtime,前提是我们设置好上海的时区。
[root@k8s-01 test]# ll /etc/localtime lrwxrwxrwx. 1 root root 35 Apr 20 00:11 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
通过环境变量定义时区
[root@k8s-01 test]# cat time.yaml apiVersion: v1 kind: Pod metadata: name: time-nginx spec: containers: - name: time-nginx image: nginx args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done'] env: - name: TZ value: Asia/Shanghai
进入容器内修改时区
首先我们先看一下时间
[root@k8s-01 test]# kubectl get pod NAME READY STATUS RESTARTS AGE time 1/1 Running 0 47s [root@k8s-01 test]# kubectl logs time 0: Fri May 1 19:27:31 UTC 2020 1: Fri May 1 19:27:32 UTC 2020 2: Fri May 1 19:27:33 UTC 2020 3: Fri May 1 19:27:34 UTC 2020
接下来我们进入容器
[root@k8s-01 test]# kubectl exec -it time /bin/sh # date Fri May 1 19:28:33 UTC 2020 # rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # date Sat May 2 03:29:11 CST 2020 # exit
相关文章:
- Kubernetes 1.14 二进制集群安装
- CentOS 7 ETCD集群配置大全
- Kuerbernetes 1.11 集群二进制安装
- Kubenetes 1.13.5 集群二进制安装