我正在参加「掘金·启航计划」
背景
偶然发现程序中的一个定时任务在 Docker
容器中部署后并没有按照既定的时间执行。经过排查后发现,定时任务与实际时间有关联,而容器内(openjdk:8-jdk-alpine)的时间与实际时间相差了8小时,应该是时区问题。
那么,如何解决容器内的时区问题呢?网上有给出各类方式解决这个问题,而且针对了不同的操作系统的镜像都给出了方案。我这里用的是比较简单的 JDK-Alpine
镜像,参考其官方文档后,直接在构建自己的镜像时设置好时区。
设置时区
根据 Alpine
的文档提示:docs.alpinelinux.org/user-handbo… Dockerfile
中:
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
镜像中时区不正确的问题可能是由于以下原因导致的:
- 镜像中的时区设置不正确:
Docker
镜像默认使用UTC时间作为时区。如果你在容器中发现时区不正确,可能是因为镜像作者没有正确设置时区。你可以通过在Docker
file中添加设置时区的命令来解决这个问题,例如:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
这将把时区设置为上海的时区。你可以F根据自己的需要选择适当的时区。
-
宿主机时区与容器时区不一致:
Docker
容器默认继承宿主机的时区设置。如果宿主机的时区不正确,那么容器中的时区也会不正确。你可以通过在宿主机上正确设置时区,然后重新启动容器来解决这个问题。 -
容器中的时钟同步问题:有时候,容器中的时钟可能会与宿主机的时钟不同步,导致时区显示不正确。你可以尝试重新启动容器或者使用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
的内核版本:
- 检查当前内核版本:运行命令uname -r来查看当前的内核版本。
- 检查可用的内核版本:运行命令yum list available kernel来查看可用的内核版本。
- 安装新的内核版本:选择一个符合需求的内核版本,并运行命令yum install kernel-来安装它。
- 更新引导配置:运行命令grub2-mkconfig -o /boot/grub2/grub.cfg来更新引导配置文件。
- 重启系统:运行命令reboot来重启系统并使用新的内核版本。
请注意,在升级内核之前,建议先备份重要的数据,并确保您了解如何回滚到旧的内核版本,以防出现问题。此外,升级内核可能需要一些时间和系统重启,因此请确保在合适的时间进行操作。
If you have any questions or any bugs are found, please feel free to contact me.
Your comments and suggestions are welcome!