Как запускать команды kubectl в cron

Я создал конфигурацию расписания внутри своего проекта Gcloud для создания снимков группы виртуальных дисков.

Теперь я хочу добавить свою конфигурацию расписания на свои диски, но я не знаю, как сделать это автоматически, потому что у меня более 1200 дисков.

Я попытался использовать POD с cron внутри, но не могу выполнить команду kubectl, чтобы вывести список всех моих постоянных томов:

kubectl describe pv | grep "Name" | awk 'NR % 2 == 1' | awk '{print $2}'

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

gcloud compute disks add-resource-policies [DISK_NAME] --resource-policies [SCHEDULE_NAME] --zone [ZONE]

Заранее спасибо за помощь.

Изменить 1: после некоторых комментариев я изменил свой код, чтобы добавить Kubernetes CronJob, но результат тот же, код не работает (модуль создается, но дает мне ошибку: ImagePullBackOff):

resource "kubernetes_cron_job" "schedulerdemo" {
  metadata {
    name = "schedulerdemo"
  }
  spec {
    concurrency_policy            = "Replace"
    failed_jobs_history_limit     = 5
    schedule                      = "*/5 * * * *"
    starting_deadline_seconds     = 10
    successful_jobs_history_limit = 10
    job_template {
      metadata {}
      spec {
        backoff_limit = 2
        ttl_seconds_after_finished    = 10
        template {
          metadata {}
          spec {
            container {
              name    = "scheduler"
              image   = "imgscheduler"
              command = ["/bin/sh", "-c", "date; kubectl describe pv | grep 'Name' | awk 'NR % 2 == 1' | awk '{print $2}'"]
            }
          }
        }
      }
    }
  }
}

person Barragán Louisenbairn    schedule 16.10.2020    source источник
comment
что вы имеете в виду, говоря, что я не могу выполнить команду kubectl? кроме того, вероятно, было бы лучше не запускать cron внутри модуля, а использовать вместо него kubernetes CronJob ressource (kubernetes.io/docs/concepts/workloads/controllers/cron-jobs).   -  person Markus Dresch    schedule 16.10.2020
comment
Причина, по которой kubectl может не работать, заключается в том, что вы не предоставили ему ServiceAccount, и поэтому kubectl не может аутентифицироваться в вашем кластере. Однако, следуя решению Маркуса, я бы также предпочел использовать ресурс Cronjob и запустить сценарий оболочки, который выдает команду gcloud. Чтобы полностью решить эту проблему, вам понадобится всего одна учетная запись ServiceAccount, которая может перечислять и описывать постоянные диски, а также использовать ту же учетную запись службы, чтобы связать ее с объектом IAM в GCP.   -  person tuxiedev    schedule 16.10.2020
comment
Я следил за вашими комментариями и немного изменил код в моем коде terraform, чтобы создать CronJob: я вставил код в вопрос.   -  person Barragán Louisenbairn    schedule 19.10.2020
comment
ImagePullBackOff ошибка означает, что не удается найти изображение, как указано в атрибуте image. Этот образ находится в вашем реестре контейнеров?   -  person Dawid Kruk    schedule 19.10.2020
comment
Хорошо, позор мне, неправильное имя изображения. Теперь у меня ошибка в журнале контейнера: / bin / sh: kubectl: not found   -  person Barragán Louisenbairn    schedule 20.10.2020


Ответы (1)


Отвечая на комментарий:

Хорошо, позор мне, неправильное имя изображения. Теперь у меня ошибка в журнале контейнера: / bin / sh: kubectl: not found

Это означает, что в образе, который вы используете, не установлен kubectl (или его нет в PATH). Вы можете использовать изображение: google/cloud-sdk:latest. В этом образе уже установлено cloud-sdk, которое включает:

  • gcloud
  • kubectl

Чтобы запустить CronJob, который получит информацию о PV и изменит конфигурацию хранилища GCP, вам потребуются следующие обращения:

  • Kubernetes/GKE API (kubectl) - ServiceAccount с Role и RoleBinding.
  • GCP API (gcloud) - Google Service account с IAM разрешениями на операции хранения.

Я нашел эти ссылки полезными при назначении разрешений для списка PV:

Рекомендуемый способ назначения определенных разрешений для GCP доступа:

Идентификация рабочей нагрузки - это рекомендуемый способ доступа к сервисам Google Cloud из приложений, работающих в GKE, благодаря улучшенным свойствам безопасности и управляемости.

- Cloud.google.com: Kubernetes Engine: Идентификация рабочей нагрузки: как сделать

Я рекомендую вам прочитать документацию, указанную мной выше, и проверить другие альтернативы.


Что касается сценария, используемого внутри CronJob. Вам следует искать pdName вместо Name, поскольку pdName - это представление gce-pd диска в GCP (при условии, что мы говорим о подключаемом модуле в дереве).

У вас будет несколько вариантов получения имени диска из API, чтобы использовать его в команде gcloud.

Один из вариантов:

kubectl get pv -o yaml | grep "pdName" | cut -d " " -f 8 | xargs -n 1 gcloud compute disks add-resource-policies --zone=ZONE --resource-policies=POLICY

Заявление об ограничении ответственности!

Рассматривайте приведенную выше команду только как пример.

Вышеупомянутая команда получит атрибут PDName из PV и выполнит итерацию с каждым из них в команде после xargs.

Некоторые вещи, которые следует учитывать при создании скрипта / программы:

  • Выполнение этой команды более одного раза на одном диске вызовет ошибку, из-за которой нельзя назначить несколько политик. У вас может быть список уже настроенных дисков, для которых не требуется назначать политику.
  • Рассмотрите возможность использования .spec.concurrencyPolicy: Forbid вместо Replace. Замененный CronJob начнется с самого начала, перебирая все эти диски. Команда не может быть завершена в желаемое время, и CronJob будет заменен.
  • Вам нужно будет проверить правильность kubectl версии, поскольку официальная поддержка допускает + 1 / -1 разницу в версии между клиентом и сервером (cloud-sdk:latest использует v1.19.3).

Я настоятельно рекомендую вам изучить другие методы резервного копирования ваших PVC (например, VolumeSnapshots).

Взгляните на ссылки ниже для получения дополнительной информации / идей:

Стоит отметить, что:

Драйверы CSI - это будущее расширения хранилища в Kubernetes. Kubernetes объявил, что плагины томов в дереве будут удалены из Kubernetes в версии 1.21. Подробнее см. Kubernetes In-Tree в CSI Перенос тома на бета-версию. После того, как это изменение произойдет, существующие тома, использующие подключаемые модули томов в дереве, вместо этого будут взаимодействовать через драйверы CSI.

- Cloud.google.com: Kubernetes Engine: постоянные тома: драйвер GCE PD CSI: преимущества использования

Переключение на плагин CSI для вашего StorageClass позволит вам использовать Volume Snapshots внутри GKE:

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

- Cloud.google.com : Kubernetes Engine: Постоянные тома: Моментальные снимки томов: Инструкции


Дополнительные ресурсы:

person Dawid Kruk    schedule 26.10.2020
comment
OMG, столько информации! Большое спасибо! Я прочитаю все, а затем протестирую некоторые решения, которые вы мне предложили. Прямо сейчас, чтобы избежать использования cron, я запустил команды Google, чтобы проверить, работают ли они. И да, я обнаружил, что ошибка нескольких политик запрещена. - person Barragán Louisenbairn; 26.10.2020
comment
Еще один вопрос по этому поводу: есть ли способ восстановить снимок GCE в постоянный том без использования драйвера CSI? - person Barragán Louisenbairn; 27.10.2020
comment
@ BarragánLouisenbairn. Да, взгляните сюда: и здесь: использовать существующий диск в качестве PV. - person Dawid Kruk; 29.10.2020
comment
После некоторого теста я изменил свой проект на кластер с драйвером CSI. Я изменил все версии (кластер + узлы), настроил драйвер CSI и настроил свое постоянное утверждение тома на standard-rwo storageClass. Теперь я пытаюсь понять, как создать класс тома моментального снимка. - person Barragán Louisenbairn; 30.10.2020
comment
@ BarragánLouisenbairn, пожалуйста, ознакомьтесь с этой документацией: cloud.google.com/kubernetes-engine/docs/how-to/ - person Dawid Kruk; 03.11.2020