zoukankan      html  css  js  c++  java
  • K8s Pod与宿主机时区不同步

    在K8s集群中运行的容器默认会使用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后查看一下时间

    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
    

    解决问题

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

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

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

    1、通过定制Dockerfile添加时区

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

    3、通过环境变量定义时区

    4、进入容器内修改时区,或者docker cp时区进去

    5、网上资料还有通过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 .
         
    $ docker run -it centos7-date:test /bin/sh
    sh-4.2# date
    Wed Mar  6 16:40:01 CST 2019
    

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

    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,前提是宿主机设置好上海的时区。

    ll /etc/localtime
    lrwxrwxrwx. 1 root root 35 Apr 20 00:11 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai
    

    三、通过环境变量定义时区

     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
    

    四、进入容器内修改时区

    kubectl exec -it time-nginx /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
    
  • 相关阅读:
    日常脚本练习与解释
    第五周作业
    centos 7中命令记录
    centos7 中如何查看、打开、关闭防火墙。
    第四周
    复制/etc/profile至/tmp/目录,用查找替换命令删除/tmp/profile文件中的 行首的空白字符
    vim中设置tab缩进为4个字符
    Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。
    sql 索引笔记--索引组织结构
    sql 索引笔记2
  • 原文地址:https://www.cnblogs.com/zjz20/p/14463714.html
Copyright © 2011-2022 走看看