V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
UnknownR
V2EX  ›  Docker

Kubernetes 管理的容器,如何做到时间同步? (非时区)

  •  
  •   UnknownR · 2020-12-11 09:54:19 +08:00 · 3413 次点击
    这是一个创建于 1447 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前用 k8s 管理着一些业务容器(用的 Docker),因为有计时类的需求所以时间和时区一定要同步,时区的问题已经解决,在 dockerfile 里 RUN 创建 /etc/localtime 的软连接即可,但是时间的问题一直没解决,求 v 站的大神们,有什么好的解决方案吗?

    能想到的解决方案是使用 ntp 来同步,为了控制镜像的大小,几个包都是基于 debianslim 制作,默认没有 ntp,没有 systemd,只有 service,service 没法设置开启自动启动,手动安装 systemd 的话会提示无法运行,所以现在是安装好了 ntp,但是只能在容器启动时开启,比如在 dockerfile 里启动:

    CMD service ntp start
    or
    ENTRYPOINT service ntp start
    

    但是如果想在这之上再运行其他进行,比如我 docker run 后面跟上 bash,用 CMD 的话原来的 ntp 启动命令会被覆盖,镜像可以 run 但是 ntp 没起来;用 ENTRYPOINT 的话 ntp 可以启动但是很快就退出了,请问有什么办法可以既跑 ntp service 又跑自己的进程?当然我知道这不太符合容器的标准 同时也注意到一个现象,以前 dockerfile 里用 ENTRYPOINT 的镜像,在 k8s 里通过 deployment 创建时,deployment 里定义的 commond 和 args 会覆盖掉 ENTRYPOINT,运行 k8s 里定义的内容,这个是为什么呢?

    9 条回复    2020-12-12 19:40:58 +08:00
    wbzt
        1
    wbzt  
       2020-12-11 10:06:34 +08:00
    写个满足你执行需要的脚本 my.sh ,然后打到镜像里,Dockerfile 里 ENTRYPOINT["/my.sh"]
    zy445566
        2
    zy445566  
       2020-12-11 10:09:16 +08:00
    开个微服务专门用于其它容器来同步时间不就好了,所有的服务启动后都调用一下同步时间接口,然后订阅服务使得时间改变的时候通知其它服务
    asilin
        3
    asilin  
       2020-12-11 10:15:27 +08:00   ❤️ 1
    解决方向偏了,所有容器的系统时间都统一来源于内核(除非用的是支持时间命名空间的新内核,如 5.6+)。

    所以你需要在主机上启动一个 NTP 服务,就能够保证所有的容器时间统一。
    monsterxx03
        4
    monsterxx03  
       2020-12-11 10:18:43 +08:00   ❤️ 1
    时间是内核控制的, 容器都共享内核, host 上装 ntp 容器内部就是同步的.

    容器内跑多个 service(很不推荐这么搞): https://docs.docker.com/config/containers/multi-service_container/

    覆盖 ENTRYPOINT 那个是 expected behavior: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes

    写之前搜一下, 答案都在结果前三条
    herealways
        5
    herealways  
       2020-12-11 10:20:13 +08:00   ❤️ 2
    我记得在 time namespace 出现之前,容器内的时间是和 host 同步的,所以按道理只需要在 host 上运行 ntp 服务同步时间即可,有误的话请各位大佬指出

    关于 time namespace: https://lwn.net/Articles/766089/
    UnknownR
        6
    UnknownR  
    OP
       2020-12-11 10:21:28 +08:00
    @asilin
    @monsterxx03
    非常感谢!之前思路确实跑偏了,想着去容器内做时间同步
    UnknownR
        7
    UnknownR  
    OP
       2020-12-11 10:23:52 +08:00
    @wbzt 这个可能不太行,因为业务的需求,我们需要把镜像给到客户,具体的运行参数由客户填写,打到镜像里那就不能编辑了
    wbzt
        8
    wbzt  
       2020-12-11 10:49:19 +08:00
    @UnknownR 解决时间问题,上面大佬说的已经解决了

    而参数可以通过 pod 的 args 值来传递
    比如脚本是这样的 jar -jar app.jar $@
    julyclyde
        9
    julyclyde  
       2020-12-12 19:40:58 +08:00
    换句话说,现在的人们连服务器上需要做时间同步都还没学,就已经在做 k8s 了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5618 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 03:40 · PVG 11:40 · LAX 19:40 · JFK 22:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.