Утилита для автоматического управления ресурсами Yandex Cloud (ВМ и Kubernetes) по расписанию.
yc-scheduler позволяет автоматизировать включение/выключение
виртуальных машин и управление ресурсами Kubernetes в Yandex Cloud по
заданному расписанию.
Поддерживает различные типы планирования:
cron, ежедневные, еженедельные и ежемесячные задачи.
- Сервисный аккаунт Yandex Cloud и ключ в формате JSON
- (опционально) OAuth/IAM токен Yandex Cloud (не рекомендуется для долгоживущих процессов)
- Конфигурационный файл в формате YAML или JSON
# Базовый запуск с ключом сервисного аккаунта из файла
yc-scheduler --config config.yaml --sa-key /path/to/sa-key.json
# Запуск, когда путь к конфигу передан через переменную окружения
export YC_SHEDULER_CONFIG="config.yaml"
yc-scheduler --sa-key /path/to/sa-key.json
# Базовый запуск с ключом сервисного аккаунта из переменной окружения
export YC_SA_KEY_FILE="/path/to/sa-key.json"
yc-scheduler --config config.yaml
# Запуск с токеном (короткоживущий IAM/OAuth токен, не рекомендуется)
yc-scheduler --config config.yaml --token $(yc iam create-token)
# Режим dry-run (без реальных изменений)
yc-scheduler --config config.yaml --sa-key /path/to/sa-key.json --dry-run
# Запуск с настройкой логирования
yc-scheduler --config config.yaml --sa-key /path/to/sa-key.json --log-level debug --log-format json-c, --config(обязательно) — путь к конфигурационному файлу (можно передать через переменную окруженияYC_SHEDULER_CONFIG)--sa-key— путь к JSON ключу сервисного аккаунта Yandex Cloud (можно передать через переменную окруженияYC_SA_KEY_FILE)-t, --token(опционально) — IAM/OAuth токен Yandex Cloud (переопределяет переменную окруженияYC_TOKEN, не рекомендуется для длительных процессов)-n, --dry-run— режим тестового запуска без выполнения операций--version— вывести информацию о версии и завершить работу--log-level— уровень логирования (trace,debug,info,warn,error) (по умолчаниюinfo, можно передать через переменную окруженияLOG_LEVEL)--log-format— формат логирования (jsonилиconsole) (по умолчаниюconsole, можно передать через переменную окруженияLOG_FORMAT)
Для удобства можно использовать переменные окружения вместо флагов:
YC_SHEDULER_CONFIG— путь к конфигурационному файлуYC_SA_KEY_FILE— путь к файлу ключа сервисного аккаунтаYC_TOKEN— IAM/OAuth токен (не рекомендуется для длительных процессов)LOG_LEVEL— уровень логирования (trace,debug,info,warn,error)LOG_FORMAT— формат логирования (jsonилиconsole)
Пример конфигурационного файла (config.yaml):
# Глобальные настройки
timezone: Europe/Moscow # Таймзона для расписаний (по умолчанию системная)
max_concurrent_jobs: 5 # Максимальное количество одновременных задач (по умолчанию 5)
validation_interval: 10m # Интервал проверки состояния ресурсов (по умолчанию 10m)
shutdown_timeout: 5m # Таймаут graceful shutdown (по умолчанию 5m)
metrics_enabled: false # Включить Prometheus метрики (по умолчанию false)
metrics_port: 9090 # Порт для метрик (по умолчанию 9090)
schedules_dir: ./examples/schedules # Каталог с schedule-манифестами YAMLПример schedule-документа (examples/schedules/vm-daily.yaml):
apiVersion: scheduler.yc/v1alpha1
kind: Schedule
metadata:
name: vm-production-workhours
spec:
type: daily
resource:
type: vm
id: fhm1234567890abcdef
folder_id: b1g1234567890abcdef
actions:
start:
enabled: true
time: 09:00
stop:
enabled: true
time: 18:00Полный пример конфигурации см. в config.example.yaml.
Примеры schedule-манифестов см. в examples/schedules/.
Один YAML-файл может содержать несколько документов через ---.
Приложение автоматически отслеживает изменения файлов *.yaml/*.yml в
schedules_dir.
- Если обновленные манифесты невалидны, текущие расписания продолжают использоваться.
- Если задача уже выполняется в момент изменения расписания, текущий запуск не прерывается; изменения применяются только к следующим срабатываниям.
Для развёртывания выполните:
# (опционально) создать namespace
kubectl create namespace yc-scheduler
# создать Secret с ключом сервисного аккаунта
kubectl -n yc-scheduler create secret generic yc-sa-key \
--from-file=sa-key.json=/path/to/sa-key.json
# развернуть yc-scheduler
kubectl apply -k deploy/Внутри контейнера:
- конфигурация будет доступна по пути
/config/config.yaml; - schedule-манифесты будут доступны по пути
/schedules/*.yaml; - ключ сервисного аккаунта — по пути
/sa/sa-key.json; - путь до этих файлов также проброшен через переменные окружения
YC_SHEDULER_CONFIGиYC_SA_KEY_FILE.
- daily — ежедневно в указанное время
- weekly — еженедельно в указанный день недели
- monthly — ежемесячно в указанный день месяца
- cron — по cron-выражению
- vm — виртуальная машина
- k8s_cluster — кластер Kubernetes
Для каждого ресурса можно настроить действия:
- start — запуск ресурса
- stop — остановка ресурса
При включении метрик (metrics_enabled: true) доступны следующие эндпоинты:
http://localhost:9090/metrics— метрики Prometheushttp://localhost:9090/health/live— liveness probehttp://localhost:9090/health/ready— readiness probehttp://localhost:9090/— информация о сборке приложения (JSON с версией, коммитом, временем сборки)
Метрика yc_scheduler_operations_total содержит счетчики операций с лейблами:
resource_type— тип ресурса (vm, k8s_cluster)action— действие (start, stop)status— статус (success, error, dry_run)
Валидатор периодически проверяет состояние ресурсов и автоматически исправляет расхождения с расписанием:
- Запускается с интервалом, заданным в
validation_interval(по умолчанию 10 минут) - Определяет ожидаемое состояние ресурса на основе последних времен выполнения
действий
startиstopиз расписания - Если последнее действие
stopбыло позже последнегоstart, ресурс должен быть остановлен, и наоборот - При обнаружении несоответствия создает корректирующую задачу для приведения ресурса в ожидаемое состояние
- Пропускает проверку для ресурсов в переходных состояниях (PROVISIONING, STOPPING, STARTING и т.д.)
Проект использует Makefile для управления сборкой и разработкой.
Быстрый старт:
make init- инициализация проектаmake build- сборка бинарникаmake check- перед коммитом запустите полную проверку кодаmake release- сборка для всех платформ
При сборке автоматически заполняются следующие переменные:
Version- версия из git тегаCommit- SHA коммитаBuildTime- время сборки в UTCURL- URL репозитория