云原生之容器编排实践-Docker使用JDK-Alpine镜像的时区问题导致定时任务不执行

70 阅读6分钟

我正在参加「掘金·启航计划」

背景

偶然发现程序中的一个定时任务在 Docker 容器中部署后并没有按照既定的时间执行。经过排查后发现,定时任务与实际时间有关联,而容器内(openjdk:8-jdk-alpine)的时间与实际时间相差了8小时,应该是时区问题。

那么,如何解决容器内的时区问题呢?网上有给出各类方式解决这个问题,而且针对了不同的操作系统的镜像都给出了方案。我这里用的是比较简单的 JDK-Alpine 镜像,参考其官方文档后,直接在构建自己的镜像时设置好时区。

设置时区

根据 Alpine 的文档提示:docs.alpinelinux.org/user-handbo… Dockerfile 中:

2022-09-10-AlpineTimeZone.jpg

RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    apk del tzdata && \
    rm -rf /var/cache/apk/*

完整Dockfile

FROM openjdk:8-jdk-alpine
RUN apk --update add tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    apk del tzdata && \
    rm -rf /var/cache/apk/*
VOLUME /tmp
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

小总结

Docker镜像中时区不正确的问题可能是由于以下原因导致的:

  1. 镜像中的时区设置不正确:Docker镜像默认使用UTC时间作为时区。如果你在容器中发现时区不正确,可能是因为镜像作者没有正确设置时区。你可以通过在Dockerfile中添加设置时区的命令来解决这个问题,例如:
   RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

这将把时区设置为上海的时区。你可以F根据自己的需要选择适当的时区。

  1. 宿主机时区与容器时区不一致:Docker容器默认继承宿主机的时区设置。如果宿主机的时区不正确,那么容器中的时区也会不正确。你可以通过在宿主机上正确设置时区,然后重新启动容器来解决这个问题。

  2. 容器中的时钟同步问题:有时候,容器中的时钟可能会与宿主机的时钟不同步,导致时区显示不正确。你可以尝试重新启动容器或者使用NTP服务来同步容器中的时钟。

如果你遇到Docker镜像中时区不正确的问题,可以尝试上述解决方法来解决。另外,你也可以参考Docker官方文档中关于时区设置的指南来获取更多信息。

Reference

后记

一开始安装启动 minikube 时报错,原因之一是说操作系统的内核版本不支持。。其实,后来我指定了 Kubernetes 的版本就可以了,也就没有用到升级后的内核: minikube start --force --kubernetes-version=v1.23.1 。这里记录下 CentOS7 升级内核版本的操作。

升级前的 CentOS7 升级内核版本信息如下:

# 系统版本信息
[root@k8s1 local]# uname -a
Linux k8s1 3.10.0-1127.el7.x86_64 #1 SMP Tue Mar 31 23:36:51 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

# 内核版本信息
[root@k8s0 ~]# uname -r
3.10.0-1127.el7.x86_64

升级内核版本

[root@k8s1 local]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
获取http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
警告:/var/tmp/rpm-tmp.wEC7Ex: 头V4 DSA/SHA1 Signature, 密钥 ID baadae52: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:elrepo-release-7.0-3.el7.elrepo  ################################# [100%]

[root@k8s1 local]# yum --enablerepo=elrepo-kernel install -y kernel-lt
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * elrepo-kernel: mirrors.tuna.tsinghua.edu.cn
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
elrepo                                                                                                                              | 3.0 kB  00:00:00     
elrepo-kernel                                                                                                                       | 3.0 kB  00:00:00     
(1/2): elrepo/primary_db                                                                                                            | 388 kB  00:00:00     
(2/2): elrepo-kernel/primary_db                                                                                                     | 2.1 MB  00:00:01     
正在解决依赖关系
--> 正在检查事务
---> 软件包 kernel-lt.x86_64.0.5.4.207-1.el7.elrepo 将被 安装
--> 解决依赖关系完成

依赖关系解决

=============================================================================================================================
 Package                           架构                           版本                                         源                                     大小
=============================================================================================================================
正在安装:
 kernel-lt                         x86_64                         5.4.207-1.el7.elrepo                         elrepo-kernel                          50 M

事务概要
=============================================================================================================================
安装  1 软件包

总下载量:50 M
安装大小:227 M
Downloading packages:
警告:/var/cache/yum/x86_64/7/elrepo-kernel/packages/kernel-lt-5.4.207-1.el7.elrepo.x86_64.rpm: 头V4 DSA/SHA256 Signature, 密钥 ID baadae52: NOKEY0:00 ETA 
kernel-lt-5.4.207-1.el7.elrepo.x86_64.rpm 的公钥尚未安装
kernel-lt-5.4.207-1.el7.elrepo.x86_64.rpm                                                                                           |  50 MB  00:00:11     
从 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org 检索密钥
导入 GPG key 0xBAADAE52:
 用户ID     : "elrepo.org (RPM Signing Key for elrepo.org) <secure@elrepo.org>"
 指纹       : 96c0 104f 6315 4731 1e0b b1ae 309b c305 baad ae52
 软件包     : elrepo-release-7.0-3.el7.elrepo.noarch (installed)
 来自       : /etc/pki/rpm-gpg/RPM-GPG-KEY-elrepo.org
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告:RPM 数据库已被非 yum 程序修改。
  正在安装    : kernel-lt-5.4.207-1.el7.elrepo.x86_64                                                                                                  1/1 
  验证中      : kernel-lt-5.4.207-1.el7.elrepo.x86_64                                                                                                  1/1 

已安装:
  kernel-lt.x86_64 0:5.4.207-1.el7.elrepo                                                                                                                  

完毕!

设置默认内核

先查看内核默认启动顺序,然后设置默认内核。

# 查看内核默认启动顺序
[root@k8s1 local]# awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg 
CentOS Linux (5.4.207-1.el7.elrepo.x86_64) 7 (Core)
CentOS Linux (3.10.0-1127.el7.x86_64) 7 (Core)
CentOS Linux (0-rescue-37761db4ce554629afd046b89323275e) 7 (Core)

# 默认启动的顺序是从0开始,新内核是从头插入(而5.4.207的位置是在0),所以需要选择0
[root@k8s1 local]# grub2-set-default 0

验证内核版本

Note:需要reboot重启生效。

# 重启前
[root@k8s1 local]# uname -r
3.10.0-1127.el7.x86_64

# 需要reboot重启生效
[root@k8s1 local]# reboot

# 重启后
[root@k8s1 ~]# uname -r
5.4.207-1.el7.elrepo.x86_64

小总结

使用 Kubernetes 并不一定需要升级 CentOS 7 的内核版本。 Kubernetes 可以在较低版本的 CentOS 7 上运行,但是某些功能可能需要较新的内核版本才能正常工作。如果您计划使用 Kubernetes 的高级功能,如网络插件或容器运行时,那么升级内核版本可能是必要的。可以通过以下步骤来升级 CentOS 7 的内核版本:

  1. 检查当前内核版本:运行命令uname -r来查看当前的内核版本。
  2. 检查可用的内核版本:运行命令yum list available kernel来查看可用的内核版本。
  3. 安装新的内核版本:选择一个符合需求的内核版本,并运行命令yum install kernel-来安装它。
  4. 更新引导配置:运行命令grub2-mkconfig -o /boot/grub2/grub.cfg来更新引导配置文件。
  5. 重启系统:运行命令reboot来重启系统并使用新的内核版本。

请注意,在升级内核之前,建议先备份重要的数据,并确保您了解如何回滚到旧的内核版本,以防出现问题。此外,升级内核可能需要一些时间和系统重启,因此请确保在合适的时间进行操作。


If you have any questions or any bugs are found, please feel free to contact me.

Your comments and suggestions are welcome!