【问题标题】:Is there a way to get information about kubernetes cronjob timetable?有没有办法获取有关 kubernetes cronjob 时间表的信息?
【发布时间】:2021-03-17 09:31:02
【问题描述】:

我想获取有关 k8s cronjob 时间的信息。 我的 k8s 程序中有很多工作。 所以很难计算他们关注的时间。 我想平均分配我的工作。 有没有办法计算 cronjob 时间或按时间排序?

【问题讨论】:

  • 您想知道CronJob 任务运行了多长时间或Last Schedule Time 何时运行?
  • 没有。我只想得到我的 CronJob 的排序时间表!

标签: kubernetes cron job-scheduling k8s-cronjobber


【解决方案1】:

我已尝试找到一个合适的工具来帮助您解决问题。 不幸的是,我没有找到任何合适且易于使用的东西。

可以使用Prometheus + Grafana 监控CronJobs,例如使用此Kubernetes Cron and Batch Job monitoring 仪表板。
但是,我认为您不会通过这种方式找到任何有用的信息,只是一个显示集群中CronJobs 数量的仪表板。


出于这个原因,我决定编写一个 Bash 脚本,它能够以可读的方式显示最后几个 CronJobs 运行。

Kubernetes CronJob documentation中所述:

CronJob 按重复计划创建作业。

要了解特定 Job 运行了多长时间,我们可以检查它的 startTimecompletionTime,例如使用以下命令:

# kubectl get job <JOB_NAME> --template '{{.status.startTime}}'      #  "startTime"
# kubectl get job <JOB_NAME> --template '{{.status.completionTime}}' # "completionTime"

要获得Jobs 的持续时间(以秒为单位),我们可以将startTimecompletionTime 日期转换为epoch

# date -d "<SOME_DATE> +%s

这是整个 Bash 脚本:
注意:我们需要将命名空间名称作为参数传递。

#!/bin/bash
# script name: cronjobs_timetable.sh <NAMESPACE>
namespace=$1

for cronjob_name in $(kubectl get cronjobs -n $namespace --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}'); do
    echo "===== CRONJOB_NAME: ${cronjob_name} ==========="

    printf "%-15s %-15s %-15s %-15s\n" "START_TIME" "COMPLETION_TIME" "DURATION" "JOB_NAME"
    for job_name in $(kubectl get jobs -n $namespace --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep -w "${cronjob_name}-[0-9]*$"); do

        startTime="$(kubectl get job ${job_name} -n $namespace --template '{{.status.startTime}}')"
        completionTime="$(kubectl get job ${job_name} -n $namespace --template '{{.status.completionTime}}')"
        if [[ "$completionTime"  == "<no value>" ]]; then
            continue
        fi
        duration=$[ $(date -d "$completionTime" +%s) - $(date -d "$startTime" +%s) ]
        printf "%-15s %-15s %-15s %-15s\n" "$(date -d ${startTime} +%X)" "$(date -d ${completionTime} +%X)" "${duration} s" "$job_name"
    done
done

默认情况下,此脚本仅显示最后三个Jobs,但可以在作业配置中使用.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit 字段进行修改(有关更多信息,请参阅Kubernetes Jobs History Limits

我们可以检查它是如何工作的:

$ ./cronjobs_timetable.sh default
===== CRONJOB_NAME: hello ===========
START_TIME      COMPLETION_TIME DURATION        JOB_NAME
02:23:00 PM     02:23:12 PM     12 s            hello-1616077380
02:24:02 PM     02:24:13 PM     11 s            hello-1616077440
02:25:03 PM     02:25:15 PM     12 s            hello-1616077500
===== CRONJOB_NAME: hello-2 ===========
START_TIME      COMPLETION_TIME DURATION        JOB_NAME
02:23:01 PM     02:23:23 PM     22 s            hello-2-1616077380
02:24:02 PM     02:24:24 PM     22 s            hello-2-1616077440
02:25:03 PM     02:25:25 PM     22 s            hello-2-1616077500
===== CRONJOB_NAME: hello-3 ===========
START_TIME      COMPLETION_TIME DURATION        JOB_NAME
02:23:01 PM     02:23:32 PM     31 s            hello-3-1616077380
02:24:02 PM     02:24:34 PM     32 s            hello-3-1616077440
02:25:03 PM     02:25:35 PM     32 s            hello-3-1616077500
===== CRONJOB_NAME: hello-4 ===========
START_TIME      COMPLETION_TIME DURATION        JOB_NAME
02:23:01 PM     02:23:44 PM     43 s            hello-4-1616077380
02:24:02 PM     02:24:44 PM     42 s            hello-4-1616077440
02:25:03 PM     02:25:45 PM     42 s            hello-4-1616077500

此外,您可能希望创建异常和错误处理,以使此脚本在所有情况下都能按预期工作。

【讨论】:

    猜你喜欢
    • 2021-03-09
    • 2013-05-10
    • 2014-02-15
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多