在同一个容器中的Cron在本地工作,但在集群中失败

我有一个与cron计划超级简单的容器:

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

alive.sh:

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

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

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

一分钟后,我可以检查一个新的文件正在创build:

 docker exec crondemo ls /tmp 

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

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

手动启动吊舱:

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

并validation它的工作原理:

 kubectl exec crondemo ls /tmp 

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

我准备了一个样品回购: https : //github.com/orian/k8s-cron-demo

注意

  • 我也testing覆盖/var/spool/cron/crontabs/root但没有解决问题。
  • 我使用的是docker image: openjdk:8-jre 。 切换之前,我使用了alpinecrond 。 这似乎工作。

编辑2 – find(这是疯了):

  • https://forums.docker.com/t/running-cronjob-in-debian-jessie-container/17527/2
  • 在不同主机上的Docker中运行cron的问题
  • 为什么需要用docker将`pam_loginuid`设置为'optional'的值?

关于启用日志,我遵循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) 

这让我的谷歌cron "NUMBER OF HARD LINKS > 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