☸️ Автоматизация приостановки Kubernetes CronJobs с помощью find и sed

by itisgood

Этот пример относится к заданиям 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

см. также:

You may also like

Leave a Comment