专栏首页哎_小羊Docker/K8s 解决容器内时区不一致方案

Docker/K8s 解决容器内时区不一致方案

文章目录

1、背景介绍

我们知道,使用 docker 容器启动服务后,如果使用默认 Centos 系统作为基础镜像,就会出现系统时区不一致的问题,因为默认 Centos 系统时间为 UTC 协调世界时 (Universal Time Coordinated),一般本地所属时区为 CST(+8 时区,上海时间),时间上刚好相差 8 个小时。这就导致了,我们服务启动后,获取系统时间来进行相关操作,例如存入数据库、时间换算、日志记录等,都会出现时间不一致的问题,所以很有必要解决掉容器内时区不统一的问题。

问题显示如下:

# 查看本地时间
$ date
Wed Mar  6 16:41:08 CST 2019

# 查看容器内 centos 系统默认时区
$ docker run -it centos /bin/sh
sh-4.2# date
Wed Mar  6 08:41:45 UTC 2019

2、环境、软件准备

本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,通过虚拟机完成 Kubernetes 集群的搭建,以下是安装的软件及版本:

  • Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2)
  • System: CentOS Linux release 7.3.1611 (Core)
  • kubernetes: 1.12.1
  • docker: 18.06.1-ce

注意:本次操作基于 Linux Centos7 系统操作,若系统为 Ubuntu 或其他 Linux 系统,亦可参考方案对应处理,都大同小异。

3、Dockerfile 中处理

可以直接修改 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

可以看到,系统时间正常了,个人比较推荐这种方式,一劳永逸,只需要一次配置即可,后续在基于此基础镜像制作的镜像就可以直接使用了,不需要担心时区问题。

4、容器启动时处理

除了在 Dockerfile 中修改配置方式外,我们还可以在容器启动时通过挂载主机时区配置到容器内,前提是主机时区配置文件正常。

# 挂载本地 /etc/localtime 到容器内覆盖配置
$ docker run -it -v /etc/localtime:/etc/localtime centos /bin/sh
sh-4.2# date
Wed Mar  6 16:42:38 CST 2019

# 或者挂载本地 /usr/share/zoneinfo/Asia/Shanghai 到容器内覆盖配置
$ docker run -it -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime centos /bin/sh
sh-4.2# date
Wed Mar  6 16:42:52 CST 2019

以上两种方式,其实原理都一样,在 Centos 系统中,/usr/share/zoneinfo/Asia/Shanghai/etc/localtime 二者是一致的,我们一般会将二者软连接或者直接 cp 覆盖。

5、进入容器内处理

还有一种方式,就是进入到容器内处理,但是此方式有个不好的地方就是,如果容器删除后重新启动新的容器,还需要我们进入到容器内配置,非常不方便,所以个人不建议此方式。

# 进入到容器内部配置
$ docker run -it centos /bin/sh
sh-4.2# date
Wed Mar  6 08:43:29 UTC 2019
sh-4.2# rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
'/etc/localtime' -> '/usr/share/zoneinfo/Asia/Shanghai'
sh-4.2# date
Wed Mar  6 16:43:54 CST 2019

6、k8s 解决容器时间不一致

在 K8s 集群里,也会存在因为时区不一致导致的问题,还记得我之前文章中挖出来的坑 配置 Ceph Object Gateway Management Frontend 中,因为容器时间不一致,导致的报错。那么在 k8s 集群里,如何解决容器时间不统一的问题呢?方式有很多,最一劳永逸的方式还是上边,在基础镜像或者服务镜像里面直接配置好。其次我们还可以通过挂载主机时间配置的方式解决,针对此方式,我举个栗子。

$ cat busy-box-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busy-box-test
  namespace: default
spec:
  restartPolicy: OnFailure
  containers:
  - name: busy-box-test
    image: busybox
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: date-config
      mountPath: /etc/localtime
    command: ["sleep", "60000"]
  volumes:
  - name: date-config
    hostPath:
      path: /etc/localtime

注意:如果主机 /etc/localtime 已存在且时区正确的话,可以直接挂载,如果本地 /etc/localtime 不存在或时区不正确的话,那么可以直接挂载 /usr/share/zoneinfo/Asia/Shanghai 到容器内 /etc/localtime,都是可行的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 Jenkins 执行持续集成的几个实用经验分享

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    哎_小羊
  • Git Review + Gerrit 安装及使用完成 Code-Review

    目录 Code Review 介绍 Gerrit 介绍 环境、软件准备 Git-Review 安装 Gerrit 安装 简单的 Demo 示例 1、Code R...

    哎_小羊
  • Docker镜像仓库Harbor之Swagger REST API整合配置

    目录 Swagger介绍 预览Harbor REST API Harbor与Swagger 整合配置 FAQ 1、Swagger 介绍 Swagger 是一个...

    哎_小羊
  • kubernetes/Docker 容器内时区不一致解决方案

    我们知道,使用 docker 容器启动服务后,如果使用默认 Centos 系统作为基础镜像,就会出现系统时区不一致的问题,因为默认 Centos 系统时间为 U...

    kubernetes中文社区
  • Kubernetes入门之系统架构

    Kubernetes简称k8s(也缩写为kube),一个开源的用于自动化部署容器化(主要针对Docker,其它如katacontainers和rkt也支持)...

    一见
  • Kubernetes与区块链

    一切都那么快,难以想象,如火如荼的Kubernetes刚刚才满三岁,但是它现在的影响力却是空前绝后的。甚至说,它将成为IT历史上最成功的开源软件。

    CNCF
  • 迁移学习

    机器视觉领域的问题通常来说是个有很多参数的复杂问题,从零开始自己构造一个神经网络通常来说是非常消耗计算能力和时间的。 我们可以站在巨人的肩膀上,用别人训练好的图...

    linxinzhe
  • Kotlin Array 创建、增、删、改、查、插入

    码脑
  • 2019丨云原生的关键节点

    而所谓“云原生”,实际上就是在定义一条能够让应用最大程度利用云的能力、发挥云的价值的最佳路径。在这条路径上,脱离了“应用”这个载体,“云原生”就无从谈起;容器技...

    边缘计算
  • 不同预测算法比较实例(R语言)

    预测算法种类很多,不论是为实际问题选择更好的分类器,还是模型优化中判断模型效果,都需要比较不同算法之间的优劣。本文我们将借助样本数据,演示从数据处理-训练-预测...

    三猫

扫码关注云+社区

领取腾讯云代金券