我有一个用例,我的"/main"binary应该在pod内运行,并在一段时间(90秒)后停止,然后通过cronJob对象启动一个新的pod。
但我不困惑如何添加睡眠和运行我的二进制在后台一起。请建议一个好的方法来解决这个问题,请原谅我的语法错误。
Dockerfile
FROM golang:alpine
WORKDIR /app
COPY main /app
RUN apk update && apk add bash
CMD ["./main &"]
---
cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cron
namespace: test-cron
spec:
schedule: "*/2 * * * *"
concurrencyPolicy: Replace
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
volumes:
- name: log
hostPath:
path: /data/log/test-cron/
containers:
- name: test-cron
image: test-kafka-0.5
command: ["sleep", "90"] // By adding this, the sleep command is working but my binary is not running inside my container.
Kubernetes内置了在截止日期后终止Pod的支持;您不需要尝试手动实现它。
在你的Dockerfile中,设置你的镜像以正常运行程序。不要试图包括任何"睡眠";或";kill"选项,并且不要尝试在后台运行程序。
CMD ["./main"]
在Job spec中,需要设置activeDeadlineSeconds:
字段。
apiVersion: batch/v1
kind: CronJob
spec:
jobTemplate:
spec:
activeDeadlineSeconds: 90 # <-- add
template:
spec:
containers:
- name: test-cron
image: test-kafka-0.5
# do not override `command:`
在Pod级别存在一个相同的选项。对于您的用例,这并不特别重要,但如果作业启动多个Pod,则每个Pod是否有截止日期或作业作为一个整体是否有截止日期是不同的。
从问题来看,您试图每两分钟运行一次作业,并且没有两个并发副本。假设Pod被创建并迅速启动,这应该可以完成这个任务。如果您有理由相信第二次作业会运行得更快,并且只是想重新启动它,那么CronJob可能不是您想要的设置。