【问题标题】:Cron in the same container works locally but fails in cluster同一容器中的 Cron 在本地工作,但在集群中失败
【发布时间】:2017-09-30 03:13:12
【问题描述】:

我有一个超级简单的容器,里面有 cron 计划:

* * * * * root /bin/bash /alive.sh

alive.sh:

#!/bin/bash

/bin/echo "I'm alive"
/bin/echo $(/bin/date) >> /tmp/alive.log

我在本地构建 docker 镜像并运行它:

docker build -t orian/crondemo:v0 .
docker run --rm -it --name crondemo orian/crondemo:v0

大约一分钟后,我可以检查是否正在创建一个新文件:

docker exec crondemo ls /tmp

I 标记并将图像推送到 Google Container Registry:

TAG=eu.gcr.io/<PROJECT_ID>/crondemo:v0
docker tag orian/crondemo:v0 $TAG
kubectl docker -- push $TAG

手动启动 pod:

kubectl run crondemo --image=$TAG --replicas=1 --restart=Never

并验证它是否有效:

kubectl exec crondemo ls /tmp

这里有个问题,/tmp/alive.log 文件没有被写入。问题出在哪里?

我已经准备了一个带有示例的 repo:https://github.com/orian/k8s-cron-demo

通知

  • 我也测试过覆盖/var/spool/cron/crontabs/root,但没有解决问题。
  • 我正在使用 docker 镜像:openjdk:8-jre。在切换之前,我使用了alpinecrond。那时它似乎奏效了。

Edit2 - 找到(这太疯狂了):

【问题讨论】:

    标签: docker cron kubernetes google-kubernetes-engine


    【解决方案1】:

    我已关注https://stackoverflow.com/a/21928878/436754 启用日志。

    跑步:/var/log/syslog

    May  4 12:33:05 crondemo rsyslogd: [origin software="rsyslogd" swVersion="8.4.2" x-pid="14" x-info="http://www.rsyslog.com"] start
    May  4 12:33:05 crondemo rsyslogd: imklog: cannot open kernel log(/proc/kmsg): Operation not permitted.
    May  4 12:33:05 crondemo rsyslogd-2145: activation of module imklog failed [try http://www.rsyslog.com/e/2145 ]
    May  4 12:33:08 crondemo cron[38]: (CRON) INFO (pidfile fd = 3)
    May  4 12:33:08 crondemo cron[39]: (CRON) STARTUP (fork ok)
    May  4 12:33:08 crondemo cron[39]: (*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab)
    May  4 12:33:08 crondemo cron[39]: (*system*crondemo) NUMBER OF HARD LINKS > 1 (/etc/cron.d/crondemo)
    May  4 12:33:08 crondemo cron[39]: (CRON) INFO (Running @reboot jobs)
    May  4 12:34:01 crondemo cron[39]: (*system*) NUMBER OF HARD LINKS > 1 (/etc/crontab)
    May  4 12:34:01 crondemo cron[39]: (*system*crondemo) NUMBER OF HARD LINKS > 1 (/etc/cron.d/crondemo)
    

    这让我在 Google 上搜索了 cron "NUMBER OF HARD LINKS &gt; 1",我发现:https://github.com/phusion/baseimage-docker/issues/198

    解决方法是修改 Dockerfile 以在启动时覆盖 cron 文件,而不是由 Docker 挂载。

    • Dockerfile COPY cronfile /cronfile
    • docker-entrypoint.sh: cp /cronfile /etc/cron.d/crondemo

    有解决方法的分支:https://github.com/orian/k8s-cron-demo/tree/with-rsyslog

    【讨论】:

      猜你喜欢
      • 2013-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2017-11-19
      • 2015-05-27
      • 2021-02-20
      • 2016-10-07
      相关资源
      最近更新 更多