上云无忧 > 文档中心 > 腾讯云容器服务实战教程 - 解决容器内时区不一致问题
容器服务 TKE
腾讯云容器服务实战教程 - 解决容器内时区不一致问题

文档简介:
操作场景: 腾讯云容器服务(TKE)集群中容器系统时间默认为 UTC 协调世界时间 (Universal Time Coordinated),与节点本地所属时区 CST (上海时间)相差8个小时。在容器使用过程中,当需要获取系统时间用于日志记录、数据库存储等相关操作时,容器内时区不一致问题将会带来一系列困扰。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

操作场景

腾讯云容器服务(TKE)集群中容器系统时间默认为 UTC 协调世界时间 (Universal Time Coordinated),与节点本地所属时区 CST (上海时间)相差8个小时。在容器使用过程中,当需要获取系统时间用于日志记录、数据库存储等相关操作时,容器内时区不一致问题将会带来一系列困扰。
默认时间不支持直接以集群为单位进行修改,但可在单个容器内进行修改。本文提供了容器内时区不一致问题的多种解决方案,请选择合适的方案进行操作:
方案1:Dockerfile 中创建时区文件(推荐)
方案2:挂载主机时区配置到容器

操作环境

本文中所有操作步骤均在 TKE 集群节点上完成,相关操作环境如下所示,请对应您实际情形结合文档解决问题:
角色
地域
配置
操作系统
Kubernetes 版本信息
节点
华南地区(广州)
CPU:1核
内存::1GB
带宽:1 Mbps
系统盘:50 GB(普通云硬盘)
CentOS Linux 7(Core)
1.16.3

问题定位

1. 参考 使用标准登录方式登录 Linux 实例(推荐),登录目标节点。
2. 执行以下命令,查看本地时间。
		
date
返回结果如下图所示:

3. 依次执行以下命令,查看容器内 CentOS 系统默认时区。
		
docker run -it centos /bin/sh
		
date
返回结果如下图所示:

对比发现,本地时间与容器内时区不一致。
4. 执行以下命令,退出容器。
		
exit

操作步骤

方案1:Dockerfile 中创建时区文件(推荐)

在构建基础镜像或在基础镜像的基础上制作自定义镜像时,在 Dockerfile 中创建时区文件即可解决单一容器内时区不一致问题,且后续使用该镜像时,将不再受时区问题困扰。
1. 执行以下命令,新建 Dockerfile.txt 文件。
		
vim Dockerfile.txt
2. i 切换至编辑模式,写入以下内容,配置时区文件。
		
FROM centos
RUN rm -f /etc/localtime \
&& ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
3. Esc,输入 :wq,保存文件并返回。
4. 执行以下命令,构建容器镜像。
		
docker build -t centos7-test:v1 -f Dockerfile.txt .
返回结果如下图所示:

5. 依次执行以下命令,启动容器镜像并查看容器内时区。
		
date
		
docker run -it centos7-test:v1 /bin/sh
		
date
此时,容器内时区已与本地时间一致。如下图所示:

6. 执行以下命令,退出容器。
		
exit

方案2:挂载主机时区配置到容器

解决容器内时区不一致问题,还可以通过挂载主机时间配置到容器的方式进行解决。该方式可以在容器启动时进行设置,也可以在 YAML 文件中使用主机路径挂载数据卷到容器。

容器启动时挂载主机时间配置到容器

挂载主机时间到容器内覆盖配置时,有以下两种选择:
方式1:挂载本地 /etc/localtime:需确保该主机时区配置文件存在且时区正确。
方式2:挂载本地 /usr/share/zoneinfo/Asia/Shanghai:当本地 /etc/localtime 不存在或者时区不正确时,可选择直接挂载该配置文件。
请对应实际情况,选择以下方式,进行挂载主机时间配置到容器:
方式1
方式2
挂载本地 /etc/localtime
1. 依次执行以下命令,查看本地时间并挂载本地 /etc/localtime 到容器内。
				
date
				
docker run -it -v /etc/localtime:/etc/localtime centos /bin/sh
				
date
返回结果如下图所示,容器内时区已与本地时间一致:

2. 执行以下命令,退出容器。
				
exit
挂载本地 /usr/share/zoneinfo/Asia/Shanghai
1. 依次执行以下命令,查看本地时间并挂载本地 /usr/share/zoneinfo/Asia/Shanghai 到容器内。
				
date
				
docker run -it -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime centos /bin/sh
				
date
返回结果如下图所示,容器内时区已与本地时间一致:

2. 执行以下命令,退出容器。
				
exit

YAML 文件使用主机路径挂载数据卷到容器

本节内容以 mountPath:/etc/localtime 为例,介绍在 YAML 文件中如何通过数据卷挂载主机时区配置到容器内,解决容器内时区不一致的问题。
1. 在节点上执行以下命令,创建 pod.yaml 文件。
		
vim pod.yaml
2. i 切换至编辑模式,写入以下内容。
		
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
3. Esc,输入 :wq,保存文件并返回。
4. 执行以下命令,新建该 Pod。
		
kubectl create -f pod.yaml
返回结果如下图所示:

5. 依次执行以下命令,查看该容器内时区。
		
date
		
kubectl exec -it test date
返回结果如下图所示,与本地系统时区一致即为成功:

相似文档
  • 操作场景: 容器有时会在发生异常后无法正常工作,业务日志中若无足够的信息来定位问题原因,则需要结合 coredump 来进一步分析,本文将介绍如何使容器产生 coredump 并保存。
  • 操作场景: 动态准入控制器 Webhook 在访问鉴权的过程中可以更改请求对象或完全拒绝该请求,其调用 Webhook 服务的方式使其独立于集群组件。动态准入控制器具有很大的灵活性,可便捷地进行众多自定义准入控制。下图为动态准入控制在 API 请求调用链的位置,如需了解更多信息,请前往 Kubernetes 官网。
  • 总述: DNS 作为 Kubernetes 集群中服务访问的第一环节,其稳定性和性能至关重要,如何以更优的方式配置和使用 DNS,涉及到方方面面,本文档将总结这些最佳实践。
  • 操作场景: 通过在集群节点上以 Daemonset 的形式运行 NodeLocal DNS Cache,能够大幅提升集群内 DNS 解析性能,以及有效避免 conntrack 冲突引发的 DNS 五秒延迟。 本文接下来将详细介绍如何在 TKE 集群中使用 NodeLocal DNS Cache。
  • 操作场景: 在使用容器服务或 Serverless 容器服务时,可能会有解析自定义内部域名的需求,例如: 在集群外自建了集中存储服务,需要将集群中的监控或日志数据采集通过固定内部域名发送到存储服务。 传统业务在进行容器化改造过程中,部分服务的代码配置了用固定域名调用内部其他服务,且无法修改配置,即无法使用 Kubernetes 的 Service 名称进行调用。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部