Этот пример относится к заданиям cron в Kubernetes, но его можно применить к чему угодно!
В Kubernetes вы можете установить suspend: true или suspend: false для задания cron.
Это удобно, потому что приостановленное задание не будет запускаться, что часто более удобно для пользователя, чем временное удаление всего задания и его последующее добавление.
Это особенно актуально, если вы придерживаетесь философии GitOps и используете такие инструменты, как Argo CD, для мониторинга состояния git-репо и синхронизации его с истинным состоянием вашего кластера.
Другими словами, когда вы хотите внести изменения в свой кластер, вы фиксируете и продвигаете изменения в конфигурационных файлах, а не запускаете команды kubectl непосредственно на кластере.
Вы можете временно приостановить выполнение заданий cron, если переводите сайт в режим обслуживания, например, при выполнении крупных обновлений базы данных.
Вы можете заблокировать доступ к вашему публичному сайту на уровне брандмауэра, но внутри вашего Kubernetes задания cron все равно будут выполняться, если вы их не приостановите.
Допустим, у вас есть 3 разных приложения, и каждое из них имеет от 2 до 15 cron-заданий.
Итого, допустим, 20 заданий.
Открывать редактор кода и делать поиск/замену по всему проекту, чтобы установить suspend: true или suspend: false, чтобы потом зафиксировать эти изменения, мягко говоря, раздражает.
Было бы здорово, если бы у вас был ярлык запуска скрипта, где вы могли бы выполнить ./run cronjobs:disable и ./run cronjobs:enable.
function cronjobs:disable {
find "kubernetes/apps/overlays/"*"/cron-job.yaml" -type f \
-exec perl -pi -e "s/^ suspend: false$/ suspend: true/g" {} \;
}
function cronjobs:enable {
find "kubernetes/apps/overlays/"*"/cron-job.yaml" -type f \
-exec perl -pi -e "s/^ suspend: true$/ suspend: false/g" {} \;
}
В приведенном выше случае kubernetes/apps/overlays/”*”/cron-job.yaml – это путь к месту, где вы храните свои конфигурации Kubernetes.
Мне нравится использовать Kustomize, но здесь это не важно.
В данном случае символ * будет распространяться на все ваши приложения, например, app a, b и c.
Таким образом, все файлы cron-job.yaml ваших приложений будут изменены.
Мы используем perl вместо sed, потому что я обнаружил, что он более портативен как в Linux, так и в macOS, когда речь идет о внесении изменений на месте.
Версия sed на macOS не работает так же, как GNU-версия sed, а perl работает.
Но если вы хотите использовать sed вместо него, вы можете это сделать.
Одна и та же логика применима к обоим вариантам.
Мы ищем очень конкретные строки в файле, а затем глобально заменяем их.
🐧 Как раскомментировать строки в файле с помощью SED на Linux
Вот как может выглядеть конфигурация задания Kubernetes cron.
В данном случае это задание cron, которое запускается каждые 5 минут и при выполнении скручивает определенную конечную точку API.
Обратите внимание на свойство suspend в строке 7, это то, что заменяет строку:
---
apiVersion: "batch/v1"
kind: "CronJob"
metadata:
name: "app-do-something"
spec:
suspend: false
schedule: "*/5 * * * *"
concurrencyPolicy: "Forbid"
jobTemplate:
spec:
backoffLimit: 3
template:
spec:
restartPolicy: "OnFailure"
containers:
- name: "app"
imagePullPolicy: "Always"
image: "curlimages/curl:8.5.0"
command:
- "ash"
- "-c"
- |-
curl -s \
-H "Authorization:Bearer ${APP_API_BEARER_TOKEN}" \
-X POST \
http://a-app/api/v1/do_something
см. также:
- ☸️ Как создать job Kubernetes из работы cron job
- ☸️ Как создать в Kubernetes службу / аккаунт пользователя и ограничить его одним пространством имен с помощью RBAC
- 🏌️♂️ Как запустить задание cron в определенные дни недели
- Как отправить оповещение по электронной почте при обнаружении аппаратных ошибок