Есть ли способ получить информацию о расписании kubernetes cronjob?

Я хочу получить информацию о времени работы k8s cronjob. В моей программе k8s так много вакансий. Так что сложно сосчитать, на какое время там сосредоточено внимание. Я хочу равномерно распределять свои рабочие места. Есть ли способ подсчитать время cronjob или отсортировать по времени?

1 ответ

Я попытался найти подходящий инструмент, который может помочь в вашем случае. К сожалению, ничего подходящего и одновременно удобного в использовании не нашел.

Можно использовать Prometheus + Grafanaдля мониторинга, например, с помощью этой панели мониторинга Kubernetes Cron и Batch Job .
Однако я не думаю, что вы найдете здесь какую-либо полезную информацию, просто панель инструментов, которая отображает количество в кластере.


По этой причине я решил написать сценарий Bash, который может отображать последние несколько CronJobs работать в удобочитаемой форме.

Как описано в документации Kubernetes CronJob :

CronJob создает задания по повторяющемуся расписанию.

Для того, чтобы выяснить , как долго конкретная Работа была запущена, мы можем проверить его и , например , с помощью команды ниже:

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

Чтобы получить продолжительность в секундах, мы можем преобразовать startTime и completionTimeдатируется эпохой :

      # 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 )

Можем проверить, как это работает:

      $ ./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

Кроме того, вы, вероятно, захотите создать исключения и обработку ошибок, чтобы этот сценарий работал должным образом во всех случаях.

Другие вопросы по тегам