腾讯云容器服务(TKE)集群中容器系统时间默认为 UTC 协调世界时间 (Universal Time Coordinated),与节点本地所属时区 CST (上海时间)相差8个小时。在容器使用过程中,当需要获取系统时间用于日志记录、数据库存储等相关操作时,容器内时区不一致问题将会带来一系列困扰。
默认时间不支持直接以集群为单位进行修改,但可在单个容器内进行修改。本文提供了容器内时区不一致问题的多种解决方案,请选择合适的方案进行操作:
本文中所有操作步骤均在 TKE 集群节点上完成,相关操作环境如下所示,请对应您实际情形结合文档解决问题:
角色 | 地域 | 配置 | 操作系统 | Kubernetes 版本信息 |
---|---|---|---|---|
节点 | 华南地区(广州) | CPU:1核,内存::1GB,带宽:1 Mbps 系统盘:50 GB(普通云硬盘) |
CentOS Linux 7(Core) | 1.16.3 |
date
返回结果如下图所示:docker run -it centos /bin/sh
date
返回结果如下图所示:exit
在构建基础镜像或在基础镜像的基础上制作自定义镜像时,在 Dockerfile 中创建时区文件即可解决单一容器内时区不一致问题,且后续使用该镜像时,将不再受时区问题困扰。
vim Dockerfile.txt
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-test:v1 -f Dockerfile.txt .
返回结果如下图所示:date
docker run -it centos7-test:v1 /bin/sh
date
此时,容器内时区已与本地时间一致。如下图所示:exit
解决容器内时区不一致问题,还可以通过挂载主机时间配置到容器的方式进行解决。该方式可以在容器启动时进行设置,也可以在 YAML 文件中使用主机路径挂载数据卷到容器。
挂载主机时间到容器内覆盖配置时,有以下两种选择:
/etc/localtime
:需确保该主机时区配置文件存在且时区正确。/usr/share/zoneinfo/Asia/Shanghai
:当本地 /etc/localtime
不存在或者时区不正确时,可选择直接挂载该配置文件。请对应实际情况,选择以下方式,进行挂载主机时间配置到容器:
方式1:挂载本地 /etc/localtime
:
/etc/localtime
到容器内。date
docker run -it -v /etc/localtime:/etc/localtime centos /bin/sh
date
返回结果如下图所示,容器内时区已与本地时间一致:exit
方式2: 挂载本地 /usr/share/zoneinfo/Asia/Shanghai
:
/usr/share/zoneinfo/Asia/Shanghai
到容器内。date
docker run -it -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime centos /bin/sh
date
返回结果如下图所示,容器内时区已与本地时间一致:exit
本节内容以 mountPath:/etc/localtime
为例,介绍在 YAML 文件中如何通过数据卷挂载主机时区配置到容器内,解决容器内时区不一致的问题。
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: test
namespace: default
spec:
restartPolicy: OnFailure
containers:
- name: nginx
image: nginx-test
imagePullPolicy: IfNotPresent
volumeMounts:
- name: date-config
mountPath: /etc/localtime
command: ["sleep", "60000"]
volumes:
- name: date-config
hostPath:
path: /etc/localtime
kubectl create -f pod.yaml
返回结果如下图所示:date
kubectl exec -it test date
返回结果如下图所示,与本地系统时区一致即为成功:
本页内容是否解决了您的问题?