Este documento descreve o motor Python do K8s OffHours: fluxo de execucao, modulos, funcoes principais e regras de decisao.
O motor e executado pelo CronJob com ACTION=shutdown ou ACTION=startup.
Arquivos principais:
engine/offhours.py: orquestracao principal e integracao Kubernetes/Argo.engine/offhours_core/settings.py: parsing e validacao de variaveis de ambiente.
main()
-> reset_runtime_caches()
-> validate_env() / load_settings()
-> check_dependencies()
-> resolve escopo (namespace/deployment)
-> processa shutdown ou startup
Arquivo: engine/offhours_core/settings.py
Responsabilidades:
- Ler env vars (
env_str,env_bool,env_int,env_float) - Validar valores obrigatorios e opcoes aceitas
- Montar objeto imutavel
Settings
Validacoes importantes:
ACTIONaceita apenasshutdownoustartupSCHEDULE_SCOPEaceita apenasnamespaceoudeployment- Quando
ARGO_ENABLED=true, exigeARGO_SERVEReARGO_TOKEN
Arquivo: engine/offhours.py
main: inicializa contexto, loga configuracao ativa e direciona o fluxo.
run_cmd/run_json: execucao de comandos e parse JSON.run_kubectl_best_effort: comando best-effort sem abortar o job inteiro.log,warn,err,debug: padrao de logs.
kubectl_get: leitura generica de recursos.get_target_namespaces: alvo por label em namespace scope.get_target_deployment_pairs: alvo por label em deployment scope.get_deployments,get_deployment,get_namespace: leitura com cache em memoria.
save_original_replicas: salva replicas originais em annotation.get_restore_replicas: recupera annotation ou fallbackDEFAULT_STARTUP_REPLICAS.scale_deployment: aplica scale.
Modos:
min-zero: patch deminReplicas=0(best-effort) e restauracao posterior.delete-restore: salva manifesto em ConfigMap tecnico, deleta no shutdown e recria no startup.delete-only: deleta no shutdown e nao restaura no startup.
Precedencia:
delete-restoredelete-onlymin-zero
Funcoes principais:
maybe_handle_hpa_shutdownmaybe_handle_hpa_startupmaybe_delete_hpa_for_restoremaybe_restore_deleted_hpamaybe_set_hpa_min_to_zeromaybe_restore_hpa_min
argo_request: cliente HTTP com retry/backoff.get_all_applications,get_app: leitura de Applications.argo_pause_app: pausa sync.argo_resume_and_sync_app: retoma sync e dispara sync.
get_argocd_apps_from_namespace: descoberta porargopp(manual) e cadeia automatica.get_argocd_app_for_deployment: dono da app por deployment.
handle_shutdown_namespacehandle_startup_namespacehandle_shutdown_deployment_scopehandle_startup_deployment_scope
Esses handlers aplicam:
- protecao por annotation (
offhours.platform.io/protected=true) - regras de strict mode (
PROTECTED_APP_STRICT_MODE) - chamadas de HPA conforme modo ativo
Caches em memoria sao usados para reduzir chamadas repetidas durante o mesmo job:
- lista de deployments por namespace
- objeto de deployment por
(namespace, name) - namespace object
- app list e app objects do Argo
- index de ownership deployment->app
Todos sao limpos no inicio da execucao por reset_runtime_caches.
- Operacoes sao idempotentes sempre que possivel.
- Falhas criticas encerram execucao com
fail. - Operacoes opcionais/auxiliares usam best-effort com warning.
DRY_RUN=trueevita mutacoes e imprime comandos/acoes previstas.
Ordem recomendada:
engine/offhours_core/settings.py(Settings, validacao de env)mainemengine/offhours.py- handlers
handle_* - bloco HPA
- bloco Argo/discovery