目前用 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 里定义的内容,这个是为什么呢?
2
zy445566 2020-12-11 10:09:16 +08:00
开个微服务专门用于其它容器来同步时间不就好了,所有的服务启动后都调用一下同步时间接口,然后订阅服务使得时间改变的时候通知其它服务
|
3
asilin 2020-12-11 10:15:27 +08:00 1
解决方向偏了,所有容器的系统时间都统一来源于内核(除非用的是支持时间命名空间的新内核,如 5.6+)。
所以你需要在主机上启动一个 NTP 服务,就能够保证所有的容器时间统一。 |
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 写之前搜一下, 答案都在结果前三条 |
5
herealways 2020-12-11 10:20:13 +08:00 2
我记得在 time namespace 出现之前,容器内的时间是和 host 同步的,所以按道理只需要在 host 上运行 ntp 服务同步时间即可,有误的话请各位大佬指出
关于 time namespace: https://lwn.net/Articles/766089/ |
6
UnknownR OP |
7
UnknownR OP @wbzt 这个可能不太行,因为业务的需求,我们需要把镜像给到客户,具体的运行参数由客户填写,打到镜像里那就不能编辑了
|
8
wbzt 2020-12-11 10:49:19 +08:00
|
9
julyclyde 2020-12-12 19:40:58 +08:00
换句话说,现在的人们连服务器上需要做时间同步都还没学,就已经在做 k8s 了
|