Kubernetes реализует cronjob для регулярного выполнения сценариев оболочки.
Kubernetes cronjob регулярно выполняет роль сценариев оболочки
Многие существующие учебные пособия только объясняют, как регулярно выполнять команду через cronjob, но в реальном производственном процессе использования cronjob, особенно когда необходимо выполнить большое количество команд оболочки, это часто не соответствует требованиям. Выполняя сценарий оболочки, связанный с configmap, вы можете гибко настраивать команды в сценарии оболочки и выполнять cronjob для запуска более сложных команд оболочки.
CronJob, который периодически выполняет сценарий оболочки в Kubernetes, имеет множество применений, например:
- Регулярное обслуживание: CronJob можно настроить на регулярное выполнение определенных задач обслуживания, таких как очистка старых файлов журнала, обновление баз данных, обслуживание индексов и т. д.
- Резервное копирование и восстановление данных. Вы можете создать CronJob для периодического резервного копирования базы данных или файловой системы и выполнения операций восстановления при необходимости.
- Периодическая обработка данных: если вашей системе необходимо регулярно обрабатывать данные (например, каждую ночь), вы можете создать CronJob для обработки этих задач.
- Мониторинг и отчетность: CronJob может периодически выполнять задачи мониторинга, такие как проверка работоспособности системы или создание отчетов.
- Автоматическое масштабирование и масштабирование: вы можете создавать задания CronJob, которые автоматически увеличивают или уменьшают количество запущенных модулей по мере необходимости в зависимости от прогнозируемой нагрузки на систему.
- CronJob: CronJob также можно использовать для выполнения любой задачи, которую вы хотите запустить в определенное время.
1. Процесс реализации
1.1 Определение карты конфигурации
cat <<EOF > script-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: script-configmap
data: #shell 脚本的命令,可以根据实际情况创建更复杂的命令
myscript.sh: |
#!/bin/bash
echo "Hello, Kubernetes!"
EOF
1.2 Определение cronjob
cat <<EOF > my-cronjob.yaml
apiVersion: batch/v1 #kubernetes 1.21版本后请使用batch/v1,1.21前使用batch/v1beta1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule: "*/1 * * * *" #每分钟执行一次
concurrencyPolicy: Allow #并发策略,允许并发运行
jobTemplate:
spec:
template:
spec:
volumes:
- name: script-volume
configMap:
name: script-configmap
containers:
- name: my-container
image: centos
volumeMounts:
- name: script-volume
mountPath: /scripts
command: ["/bin/bash", "/scripts/myscript.sh"]
restartPolicy: OnFailure
EOF
Обычно настраиваемые параметры API для cronjob:
- spec.schedule: Планирование, обязательное поле, указывает цикл выполнения задачи, формат такой же, как у Cron
- spec.jobTemplate: шаблон задания, обязательное поле, указывает задачу для запуска, формат такой же, как у задания.
- spec.startingDeadlineSeconds : Крайний срок запуска задания (в секундах), это поле не является обязательным. Если запланированное время пропущено по какой-либо причине, задание, которое пропустило время выполнения, будет считаться невыполненным. Если не указано, нет срока
- spec.concurrencyPolicy: политика параллелизма, это поле также является необязательным. Он указывает, как обрабатывать параллельное выполнение заданий, созданных Cron Job. Разрешается указывать только одну из следующих политик:
a.Разрешить (по умолчанию): Разрешить одновременное выполнение заданий
b.Запретить: Запретить одновременное выполнение, если предыдущее не было завершено, сразу пропустить следующее
c.Заменить: Отменить текущее задание Job, заменить его новым
Обратите внимание, что текущая политика может применяться только к заданиям, созданным одним и тем же заданием cron. Если есть несколько заданий cron, задания, которые они создают, всегда могут выполняться одновременно.
- spec.suspend : приостановка, это поле также является необязательным. Если установлено значение true, все последующие выполнения будут приостановлены. Это не влияет на задания, которые уже начали выполняться. Значение по умолчанию неверно
- spec.successfulJobsHistoryLimit и .spec.failedJobsHistoryLimit: предел истории, является необязательным полем. Они определяют, сколько завершенных и невыполненных заданий можно сохранить.
1.3 Проверьте, правильно ли работает cronjob
#查看cronjob状态
kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
my-cronjob */5 * * * * False 2 19s 23m
#查看job状态
kubectl get jobs
NAME COMPLETIONS DURATION AGE
my-cronjob-28096067 1/1 34s 3m38s
my-cronjob-28096068 1/1 34s 2m38s
my-cronjob-28096069 1/1 34s 98s
#查看pod状态
kubectl get po
NAME READY STATUS RESTARTS AGE
my-cronjob-28096067-qxtqg 0/1 Completed 0 5m54s
my-cronjob-28096068-7scqd 0/1 Completed 0 4m54s
my-cronjob-28096069-gtlzg 0/1 Completed 0 3m54s