Kubernetes Pod与宿主机时区不同步

2023年 5月 4日 102.4k 0

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

Kubernetes 1.14 二进制集群安装

新闻联播老司机

  • 19年8月13日
  • 喜欢:1
  • 浏览:18.6k
  • 问题

    在Kubernetes集群中运行的容器默认会使用UTC时间,即北京时间为凌晨3点时,容器时间为晚上7点,中间会有8小时时差。而有些分布式系统对于时间极为敏感,不允许出现时间误差
    这里我们构建一个Nginx镜像,查看构建前的时间

    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后我们查看一下时间

    [root@k8s-01 test]# kubectl  logs -f time 
    337: Fri May  1 19:01:30 UTC 2020
    338: Fri May  1 19:01:31 UTC 2020
    339: Fri May  1 19:01:32 UTC 2020
    340: Fri May  1 19:01:33 UTC 2020
    341: Fri May  1 19:01:34 UTC 2020
    342: Fri May  1 19:01:35 UTC 2020
    

    在通过百度查看一下现在的时间
    image_1e78pr7om1j3pe5qt1ci7hnc49.png-46.8kB

    解决

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

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

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

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

    $ 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 Mar  6 16:40:01 CST 2019
    

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

    [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,前提是我们设置好上海的时区。

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

    通过环境变量定义时区

    [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
    

    进入容器内修改时区

    首先我们先看一下时间

    [root@k8s-01 test]# kubectl get pod
    NAME   READY   STATUS    RESTARTS   AGE
    time   1/1     Running   0          47s
    [root@k8s-01 test]# kubectl logs time 
    0: Fri May  1 19:27:31 UTC 2020
    1: Fri May  1 19:27:32 UTC 2020
    2: Fri May  1 19:27:33 UTC 2020
    3: Fri May  1 19:27:34 UTC 2020
    

    接下来我们进入容器

    [root@k8s-01 test]# kubectl exec -it time /bin/sh
    # date
    Fri May  1 19:28:33 UTC 2020
    # rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    # date
    Sat May  2 03:29:11 CST 2020
    # exit
    

    相关文章:

    1. Kubernetes 1.14 二进制集群安装
    2. CentOS 7 ETCD集群配置大全
    3. Kuerbernetes 1.11 集群二进制安装
    4. Kubenetes 1.13.5 集群二进制安装

    相关文章

    KubeSphere 部署向量数据库 Milvus 实战指南
    探索 Kubernetes 持久化存储之 Longhorn 初窥门径
    征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
    那些年在 Terraform 上吃到的糖和踩过的坑
    无需 Kubernetes 测试 Kubernetes 网络实现
    Kubernetes v1.31 中的移除和主要变更

    发布评论