前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes Pod与宿主机时区不同步

Kubernetes Pod与宿主机时区不同步

作者头像
废柴阿尤
发布2023-12-18 16:10:14
4060
发布2023-12-18 16:10:14
举报
文章被收录于专栏:Typecho_ayouTypecho_ayou

在安装Kubernetes集群的过程中并没有注意到pod的时间问题,直到在Tomcat上部署应用后发现pod中的时间与Node上的时间不同步。针对时区不同文章有以下解决方案

问题

在Kubernetes集群中运行的容器默认会使用UTC时间,即北京时间为凌晨3点时,容器时间为晚上7点,中间会有8小时时差。而有些分布式系统对于时间极为敏感,不允许出现时间误差

这里我们构建一个Nginx镜像,查看构建前的时间

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: time-nginx
spec:
  containers:
  - name: time-nginx
    image: nginx
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']

创建完Pod后我们查看一下时间

代码语言:javascript
复制
[root@k8s-01 test]# kubectl  logs -f time 
337: Fri Dec  1 19:01:30 UTC 2021
338: Fri Dec  1 19:01:31 UTC 2021
339: Fri Dec  1 19:01:32 UTC 2021
340: Fri Dec  1 19:01:33 UTC 2021
341: Fri Dec  1 19:01:34 UTC 2021
342: Fri Dec  1 19:01:35 UTC 2021

查看一下宿主机时间

代码语言:javascript
复制
[root@k8s-01 ~]# date
Wed Dec 15 00:00:51 CST 2021

解决

首先要确保宿主机时间同步

代码语言:javascript
复制
timedatectl set-timezone Asia/Shanghai
 #将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
 #重启依赖于系统时间的服务
systemctl restart rsyslog 
systemctl restart crond

目前解决Pod和宿主机时间不一致有以下集中解决方案

  • 通过定制Dockerfile添加时区
  • 通过将时区文件挂在到Pod中
  • 通过环境变量定义时区
  • 进入容器内修改时区
  • 网上资料还有通过PodPreset的方式,但是我测试完毕之后没有效果~ 这里就不进行整理了

通过定制Dockerfile添加时区

代码语言:javascript
复制
$ 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 Dec  6 16:40:01 CST 2021

通过将时区文件挂在到Pod中

代码语言:javascript
复制
[root@k8s-01 test]# cat time-mount.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: time
spec:
  containers:
  - name: time
    image: nginx
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
    volumeMounts:
      - name: timezone
        mountPath: /etc/localtime
  volumes:
    - name: timezone
      hostPath:
        path: /usr/share/zoneinfo/Asia/Shanghai

我们可以通过命令查看,/etc/localtime的目录实际上就是个软连接 如果需要系统修改时区,那么只需要将时区文件覆盖到/etc/localtime,前提是我们设置好上海的时区。

代码语言:javascript
复制
[root@k8s-01 test]# ll /etc/localtime
lrwxrwxrwx. 1 root root 35 Apr 20 00:11 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

通过环境变量定义时区

代码语言:javascript
复制
[root@k8s-01 test]# cat time.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: time-nginx
spec:
  containers:
  - name: time-nginx
    image: nginx
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
    env:
    - name: TZ
      value: Asia/Shanghai
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年12月19日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 解决
  • 通过定制Dockerfile添加时区
  • 通过将时区文件挂在到Pod中
  • 通过环境变量定义时区
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档