Есть ли способ получить информацию о расписании 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
Кроме того, вы, вероятно, захотите создать исключения и обработку ошибок, чтобы этот сценарий работал должным образом во всех случаях.