{"id":48614405,"url":"https://github.com/cronschedules/cronjob-scale-down-operator","last_synced_at":"2026-04-09T01:30:39.383Z","repository":{"id":305564499,"uuid":"921419455","full_name":"cronschedules/cronjob-scale-down-operator","owner":"cronschedules","description":"A very simple Operator to Scale down Deployments or StatefulSets during specific time windows (e.g., at night or on weekends) to save resources.","archived":false,"fork":false,"pushed_at":"2025-12-02T08:06:06.000Z","size":853,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-25T22:41:29.653Z","etag":null,"topics":["cost-optimization","kubernetes","kubernetes-operator"],"latest_commit_sha":null,"homepage":"https://cronschedules.elbazi.co/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cronschedules.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS.md","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-01-23T23:05:42.000Z","updated_at":"2025-12-02T08:04:16.000Z","dependencies_parsed_at":"2025-07-23T22:06:46.711Z","dependency_job_id":null,"html_url":"https://github.com/cronschedules/cronjob-scale-down-operator","commit_stats":null,"previous_names":["z4ck404/cronjob-scale-down-operator","cronschedules/cronjob-scale-down-operator"],"tags_count":12,"template":false,"template_full_name":null,"purl":"pkg:github/cronschedules/cronjob-scale-down-operator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cronschedules%2Fcronjob-scale-down-operator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cronschedules%2Fcronjob-scale-down-operator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cronschedules%2Fcronjob-scale-down-operator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cronschedules%2Fcronjob-scale-down-operator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cronschedules","download_url":"https://codeload.github.com/cronschedules/cronjob-scale-down-operator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cronschedules%2Fcronjob-scale-down-operator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31581864,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cost-optimization","kubernetes","kubernetes-operator"],"created_at":"2026-04-09T01:30:35.782Z","updated_at":"2026-04-09T01:30:39.370Z","avatar_url":"https://github.com/cronschedules.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Logo](./docs/images/logo.png)\n# CronJob-Scale-Down-Operator\n\nA Kubernetes operator that automatically scales down Deployments and StatefulSets during specific time windows (e.g., at night or on weekends) to save resources and costs.\n\n[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/cronschedules)](https://artifacthub.io/packages/search?repo=cronschedules)\n\n## Features\n\n- 🕒 **Cron-based Scheduling**: Uses standard cron expressions with second precision\n- 🌍 **Timezone Support**: Configure schedules in any timezone\n- 📈 **Flexible Scaling**: Scale down and up on different schedules\n- 🎯 **Multiple Resource Types**: Supports Deployments and StatefulSets for scaling\n- 🧹 **Resource Cleanup**: Automatically delete test resources based on annotations\n- 🏷️ **Cleanup-Only Mode**: Pure cleanup functionality without scaling any target resources\n- 📊 **Status Tracking**: Monitor last execution times and current replica counts\n- 🌐 **Web UI Dashboard**: Built-in web interface to monitor all cron jobs and their status\n- 📈 **Prometheus Metrics**: Comprehensive metrics for scaling operations, cleanup activities, and system health\n- ⚡ **Efficient**: Only reconciles when needed, with smart requeue timing\n- 🛡️ **Safe Testing**: Dry-run mode for cleanup operations\n- 🔧 **Graceful Error Handling**: Continues operation even when target resources are missing\n\n## Quick Start\n\n### Prerequisites\n\n- Kubernetes cluster (v1.16+)\n- kubectl configured\n- Cluster admin permissions\n\n### Installation\n\n#### Option 1: Using Helm (Recommended)\n\n**📦 Helm charts have been migrated to a dedicated repository for better management.**\n\n1. **Add the charts repository:**\n   ```bash\n   helm repo add cronschedules https://cronschedules.github.io/charts\n   helm repo update\n   ```\n\n2. **Install the operator:**\n   ```bash\n   helm install cronjob-scale-down-operator cronschedules/cronjob-scale-down-operator\n   ```\n\n3. **Install with custom values:**\n   ```bash\n   helm install cronjob-scale-down-operator cronschedules/cronjob-scale-down-operator \\\n     --set image.tag=0.3.0 \\\n     --set webUI.enabled=true \\\n     --set resources.requests.memory=128Mi\n   ```\n\n4. **Verify installation:**\n   ```bash\n   kubectl get pods -l app.kubernetes.io/name=cronjob-scale-down-operator\n   ```\n\n\u003e **📖 Chart Documentation:** For detailed Helm chart documentation, values, and configuration options, visit the [Charts Repository](https://github.com/cronschedules/charts/tree/main/cronjob-scale-down-operator).\n\n#### Option 2: Using Container Image\n\nThe operator is available as a pre-built container image from multiple registries:\n\n```bash\n# From Docker Hub:\ndocker pull cronschedules/cronjob-scale-down-operator:0.3.0\n\n# From GitHub Container Registry:\ndocker pull ghcr.io/cronschedules/cronjob-scale-down-operator:0.3.0\n```\n\nUse these images in your custom deployments or with the provided Helm chart.\n\n#### Option 3: Using kubectl\n\n1. **Install the CRDs and operator:**\n   ```bash\n   kubectl apply -f config/crd/bases/\n   kubectl apply -f config/rbac/\n   kubectl apply -f config/manager/\n   ```\n\n#### Quick Test\n\n1. **Create a test deployment:**\n   ```bash\n   kubectl apply -f examples/test-deployment.yaml\n   ```\n\n2. **Apply a scaling schedule:**\n   ```bash\n   kubectl apply -f examples/quick-test.yaml\n   ```\n\n3. **Monitor the scaling:**\n   ```bash\n   kubectl get cronjobscaledown -w\n   kubectl get deployment nginx-test -w\n   ```\n\n## 📦 Charts Repository Migration\n\n**Important Notice: Helm charts have been migrated to a dedicated repository for better management and hosting.**\n\n### Migration Details\n\n- **Previous Location**: Charts were located in `/charts` directory of this repository\n- **New Location**: [cronschedules/charts](https://github.com/cronschedules/charts) repository\n- **Helm Repository URL**: `https://cronschedules.github.io/charts`\n\n### Benefits of Migration\n  \n✅ **Centralized Management**: All charts in one dedicated repository  \n✅ **Proper Hosting**: GitHub Pages hosting for Helm repository  \n✅ **Improved CI/CD**: Better error handling and comprehensive testing  \n✅ **Security**: Automated security scanning with Checkov  \n✅ **Standards**: Following Helm chart repository best practices  \n✅ **Automation**: Fully automated releases and index updates  \n\n### For Existing Users\n\nIf you were using the old chart location, please update your installation:\n\n```bash\n# Old way (deprecated)\n# helm install cronjob-scale-down-operator ./charts/cronjob-scale-down-operator\n\n# New way (recommended)\nhelm repo add cronschedules https://cronschedules.github.io/charts\nhelm repo update\nhelm install cronjob-scale-down-operator cronschedules/cronjob-scale-down-operator\n```\n\n### Chart Documentation\n\nFor comprehensive chart documentation, configuration options, values, and advanced usage:\n- 📖 [Chart Repository](https://github.com/cronschedules/charts)\n- 📋 [Chart README](https://github.com/cronschedules/charts/tree/main/cronjob-scale-down-operator)\n- ⚙️ [Configuration Values](https://github.com/cronschedules/charts/blob/main/cronjob-scale-down-operator/values.yaml)\n\n## Examples\n\nThe [`examples/`](./examples/) directory contains various use cases:\n\n| Example | Description | Schedule |\n|---------|-------------|----------|\n| **[quick-test.yaml](./examples/quick-test.yaml)** | Immediate testing | Every minute |\n| **[basic-daily-schedule.yaml](./examples/basic-daily-schedule.yaml)** | Production workload | 10 PM → 6 AM daily |\n| **[weekend-shutdown.yaml](./examples/weekend-shutdown.yaml)** | Weekend cost savings | Friday 6 PM → Monday 8 AM |\n| **[development-testing.yaml](./examples/development-testing.yaml)** | Dev environment | Every 30/45 seconds |\n| **[multi-timezone.yaml](./examples/multi-timezone.yaml)** | Global deployments | Multiple timezones |\n| **[statefulset-example.yaml](./examples/statefulset-example.yaml)** | Database scaling | StatefulSet support |\n| **[resource-cleanup-example.yaml](./examples/resource-cleanup-example.yaml)** | **Resource cleanup** | **Combined scaling + cleanup** |\n| **[cleanup-only-example.yaml](./examples/cleanup-only-example.yaml)** | **Cleanup only** | **Every 6 hours** |\n| **[orphan-cleanup-example.yaml](./examples/orphan-cleanup-example.yaml)** | **Orphan resource cleanup** | **Every 3 AM daily** |\n\n## Cleanup-Only Mode\n\nThe operator supports a cleanup-only mode where it manages resource cleanup without scaling any target resources. This is perfect for environments where you need automated cleanup of test resources, temporary objects, or expired configurations.\n\n### When to Use Cleanup-Only Mode\n\n- **CI/CD Pipelines**: Automatically clean up test resources after builds\n- **Development Environments**: Remove temporary test objects on a schedule\n- **Resource Management**: Clean up expired ConfigMaps, Secrets, or test deployments\n- **Cost Optimization**: Remove unused resources to save cluster costs\n\n### Cleanup-Only Configuration\n\n```yaml\napiVersion: cronschedules.elbazi.co/v1\nkind: CronJobScaleDown\nmetadata:\n  name: cleanup-only-job\n  namespace: default\nspec:\n  # No targetRef needed for cleanup-only mode\n  cleanupSchedule: \"0 0 */6 * * *\"  # Every 6 hours\n  cleanupConfig:\n    annotationKey: \"test.example.com/cleanup-after\"\n    resourceTypes:\n      - \"ConfigMap\"\n      - \"Secret\"\n      - \"Service\"\n      - \"Deployment\"\n    namespaces:\n      - \"test\"\n      - \"staging\"\n    labelSelector:\n      environment: \"test\"\n    dryRun: false\n  timeZone: \"UTC\"\n```\n\n### Combined Scaling + Cleanup\n\nYou can also combine scaling and cleanup in a single resource:\n\n```yaml\napiVersion: cronschedules.elbazi.co/v1\nkind: CronJobScaleDown\nmetadata:\n  name: combined-scaler-cleanup\n  namespace: default\nspec:\n  # Scaling configuration\n  targetRef:\n    name: my-app\n    namespace: default\n    kind: Deployment\n    apiVersion: apps/v1\n  scaleDownSchedule: \"0 0 22 * * *\"  # Scale down at 10 PM\n  scaleUpSchedule: \"0 0 6 * * *\"     # Scale up at 6 AM\n  \n  # Cleanup configuration\n  cleanupSchedule: \"0 0 2 * * *\"     # Clean up at 2 AM\n  cleanupConfig:\n    annotationKey: \"cleanup-after\"\n    resourceTypes: [\"ConfigMap\", \"Secret\"]\n    dryRun: false\n  timeZone: \"UTC\"\n```\n\n## Configuration\n\n### CronJobScaleDown Spec\n\n```yaml\napiVersion: cronschedules.elbazi.co/v1\nkind: CronJobScaleDown\nmetadata:\n  name: my-scaler\n  namespace: default\nspec:\n  # Target resource to scale\n  targetRef:\n    name: my-deployment\n    namespace: default\n    kind: Deployment  # or StatefulSet\n    apiVersion: apps/v1\n  \n  # When to scale down (cron format with seconds)\n  scaleDownSchedule: \"0 0 22 * * *\"  # 10 PM daily\n  \n  # When to scale up (optional)\n  scaleUpSchedule: \"0 0 6 * * *\"     # 6 AM daily\n  \n  # Timezone for schedule interpretation\n  timeZone: \"UTC\"  # or \"America/New_York\", \"Europe/London\", etc.\n```\n\n### Resource Cleanup Configuration\n\nThe operator now supports automatic cleanup of test resources based on annotations:\n\n```yaml\napiVersion: cronschedules.elbazi.co/v1\nkind: CronJobScaleDown\nmetadata:\n  name: test-cleanup\n  namespace: default\nspec:\n  # Optional: You can still use scaling features alongside cleanup\n  targetRef:\n    name: my-deployment\n    namespace: default\n    kind: Deployment\n    apiVersion: apps/v1\n  scaleDownSchedule: \"0 0 22 * * *\"\n  scaleUpSchedule: \"0 0 6 * * *\"\n  \n  # Cleanup configuration\n  cleanupSchedule: \"0 0 2 * * *\"  # Run cleanup at 2 AM daily\n  cleanupConfig:\n    # Annotation key that marks resources for cleanup\n    annotationKey: \"cleanup-after\"\n    \n    # Resource types to cleanup (now includes RBAC and failed resources)\n    resourceTypes:\n      - \"Deployment\"\n      - \"Service\" \n      - \"ConfigMap\"\n      - \"Secret\"\n      - \"StatefulSet\"\n      - \"Pod\"          # Useful for cleaning up evicted or failed pods\n      - \"Job\"          # Useful for cleaning up failed jobs\n      - \"Role\"\n      - \"RoleBinding\"\n      # Note: ClusterRole and ClusterRoleBinding are also supported (cluster-scoped)\n    \n    # Optional: Limit cleanup to specific namespaces\n    namespaces:\n      - \"test\"\n      - \"lab\"\n    \n    # Optional: Additional label selector\n    labelSelector:\n      environment: \"test\"\n    \n    # NEW: Enable orphan resource cleanup (resources without cleanup annotation)\n    cleanupOrphanResources: true\n    # NEW: Maximum age for orphan resources before cleanup\n    orphanResourceMaxAge: \"168h\"  # 7 days\n    \n    # Optional: Enable dry-run mode (default: false)\n    dryRun: false\n  \n  timeZone: \"UTC\"\n```\n\n#### Cleanup Time Formats\n\nResources can be marked for cleanup using various time formats in the annotation value:\n\n- **Duration**: `24h`, `7d`, `30m` (relative to resource creation time)\n- **Absolute time**: `2024-12-31T23:59:59Z` (RFC3339 format)\n- **Date**: `2024-12-31` (cleanup at midnight on that date)\n- **Immediate**: Empty value `\"\"` (cleanup on next schedule run)\n\n#### Example Resource with Cleanup Annotation\n\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: test-deployment\n  namespace: test\n  labels:\n    environment: \"test\"\n  annotations:\n    cleanup-after: \"24h\"  # Delete 24 hours after creation\nspec:\n  # ... deployment spec\n```\n\n#### Orphan Resource Cleanup\n\nThe operator now supports cleaning up \"orphan\" resources - resources that don't have the cleanup annotation but are old and potentially forgotten. This is useful for environments where resources are created during testing but not properly annotated for cleanup.\n\n**How it works:**\n- Enable `cleanupOrphanResources: true` in the cleanup configuration\n- Set `orphanResourceMaxAge` to define how old resources must be before cleanup\n- Only resources matching the label selector (if specified) will be considered\n- Resources without the cleanup annotation that are older than the max age will be deleted\n\n**Example scenario:**\n```yaml\ncleanupConfig:\n  annotationKey: \"cleanup-after\"\n  resourceTypes: [\"ConfigMap\", \"Role\", \"RoleBinding\"]\n  cleanupOrphanResources: true\n  orphanResourceMaxAge: \"168h\"  # 7 days\n  labelSelector:\n    app.kubernetes.io/managed-by: \"test\"\n```\n\nThis configuration will:\n1. Clean up resources WITH the `cleanup-after` annotation according to their specified cleanup time\n2. Clean up resources WITHOUT the annotation that are labeled with `app.kubernetes.io/managed-by: test` and are older than 7 days\n\n**Supported Resource Types:**\n- Standard resources: `Deployment`, `StatefulSet`, `Service`, `ConfigMap`, `Secret`\n- Workload resources: `Pod`, `Job` (useful for cleaning up failed/evicted resources)\n- RBAC resources: `Role`, `RoleBinding`, `ClusterRole`, `ClusterRoleBinding`\n\n**Safety considerations:**\n- Orphan cleanup is opt-in (disabled by default)\n- Always test with `dryRun: true` first\n- Use label selectors to limit scope\n- Set appropriate max age to avoid deleting important resources\n\n### Schedule Format\n\nThe operator supports 6-field cron expressions with second precision:\n\n```\n┌─────────────second (0 - 59)\n│ ┌───────────── minute (0 - 59)\n│ │ ┌───────────── hour (0 - 23)\n│ │ │ ┌───────────── day of month (1 - 31)\n│ │ │ │ ┌───────────── month (1 - 12)\n│ │ │ │ │ ┌───────────── day of week (0 - 6) (0 = Sunday)\n│ │ │ │ │ │\n* * * * * *\n```\n\n#### Common Schedule Examples\n\n| Schedule | Description |\n|----------|-------------|\n| `\"0 0 22 * * *\"` | Every day at 10:00 PM |\n| `\"0 0 6 * * 1-5\"` | Weekdays at 6:00 AM |\n| `\"0 0 18 * * 5\"` | Every Friday at 6:00 PM |\n| `\"0 0 0 * * 0\"` | Every Sunday at midnight |\n| `\"*/30 * * * * *\"` | Every 30 seconds (testing) |\n\n### Supported Timezones\n\nUse standard IANA timezone names:\n- `UTC`\n- `America/New_York`\n- `Europe/London`\n- `Europe/Berlin`\n- `Asia/Tokyo`\n- `Australia/Sydney`\n\n## Monitoring\n\n### Check CronJobScaleDown Status\n\n```bash\nkubectl get cronjobscaledown -o wide\nkubectl describe cronjobscaledown my-scaler\n```\n\n### View Operator Logs\n\n```bash\nkubectl logs -n cronjob-scale-down-operator-system deployment/cronjob-scale-down-operator-controller-manager\n```\n\n### Monitor Target Resources\n\n```bash\nkubectl get deployment my-deployment -w\nkubectl get statefulset my-statefulset -w\n```\n\n### Prometheus Metrics\n\nThe operator exposes comprehensive Prometheus metrics for monitoring scaling operations, cleanup activities, and system health:\n\n```bash\n# Access metrics endpoint\nkubectl port-forward -n cronjob-scale-down-operator-system deployment/cronjob-scale-down-operator-controller-manager 8443:8443\ncurl -k https://localhost:8443/metrics\n```\n\n**Key Metrics Categories:**\n- **Scaling Operations**: `cronjob_scale_down_operations_total`, `cronjob_scale_up_operations_total`\n- **Cleanup Operations**: `cronjob_cleaned_resources_total`, `cronjob_cleanup_operations_total`\n- **Resource Status**: `cronjob_target_resource_replicas_current`, `cronjob_scaled_down_resources_current`\n- **System Health**: `cronjob_reconciliation_errors_total`, `cronjob_reconciliation_duration_seconds`\n- **Schedules**: `cronjob_schedule_next_execution_timestamp`, `cronjob_schedule_last_execution_timestamp`\n\nFor detailed metrics documentation, PromQL queries, and Grafana dashboard examples, see [METRICS.md](./docs/METRICS.md).\n\n## Web UI Dashboard\n\nThe operator includes a built-in web dashboard that provides real-time monitoring of all CronJobScaleDown resources and their target deployments/statefulsets.\n\n![Web UI Dashboard](./docs/images/web-ui.png)\n\n### Accessing the Web UI\n\nBy default, the web UI is available at `http://localhost:8082` when running the operator locally. In a Kubernetes cluster, you can access it by:\n\n1. **Port forwarding** (for development/testing):\n   ```bash\n   kubectl port-forward -n cronjob-scale-down-operator-system deployment/cronjob-scale-down-operator-controller-manager 8082:8082\n   ```\n   Then visit `http://localhost:8082`\n\n2. **Configure ingress** (for production):\n   ```yaml\n   apiVersion: networking.k8s.io/v1\n   kind: Ingress\n   metadata:\n     name: cronjob-scale-down-operator-ui\n   spec:\n     rules:\n     - host: cronjob-ui.example.com\n       http:\n         paths:\n         - path: /\n           pathType: Prefix\n           backend:\n             service:\n               name: cronjob-scale-down-operator-ui\n               port:\n                 number: 8082\n   ```\n\n### Web UI Features\n\n- 📊 **Real-time Dashboard**: Overview of all CronJobScaleDown resources\n- 📈 **Status Monitoring**: Current state of target deployments and statefulsets  \n- 🕒 **Schedule Information**: View scale-up/down schedules and timezones\n- 📋 **Replica Status**: Visual indicators for ready vs desired replicas\n- 📅 **Action History**: Timestamps of last scale operations\n- 🔄 **Auto-refresh**: Updates every 30 seconds automatically\n- 📱 **Responsive Design**: Works on desktop, tablet, and mobile\n\n### Customizing Web UI Port\n\nYou can customize the web UI port using the `--webui-addr` flag:\n\n```bash\n./manager --webui-addr=:8080\n```\n\nFor more details about the web UI, see the [Web UI Documentation](./docs/webui.md).\n\n## Development\n\n### Building from Source\n\n```bash\n# Clone the repository\ngit clone https://github.com/z4ck404/cronjob-scale-down-operator.git\ncd cronjob-scale-down-operator\n\n# Build and run locally\nmake run\n\n# Build Docker image\nmake docker-build IMG=my-registry/cronjob-scale-down-operator:latest\n\n# Deploy to cluster\nmake deploy IMG=my-registry/cronjob-scale-down-operator:latest\n```\n\n### Running Tests\n\n```bash\n# Unit tests\nmake test\n\n# End-to-end tests\nmake test-e2e\n```\n\n## Troubleshooting\n\n### Common Issues\n\n1. **Scaling not happening:**\n   - Check timezone configuration\n   - Verify cron schedule syntax\n   - Check operator logs for errors\n\n2. **Permission errors:**\n   - Ensure RBAC is properly configured\n   - Verify service account permissions\n\n3. **Target resource not found:**\n   - Check namespace and resource name\n   - Verify resource exists and is accessible\n\n### Debug Commands\n\n```bash\n# Check CRD installation\nkubectl get crd cronjobscaledowns.cronschedules.elbazi.co\n\n# Verify operator deployment\nkubectl get deployment -n cronjob-scale-down-operator-system\n\n# Check events\nkubectl get events --sort-by=.metadata.creationTimestamp\n```\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Add tests\n5. Submit a pull request\n\n## License\n\nLicensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for details.\n\n## Support\n\n- 📧 **Issues**: [GitHub Issues](https://github.com/z4ck404/cronjob-scale-down-operator/issues)\n- 📖 **Documentation**: [docs/](./docs/)\n- 💬 **Discussions**: [GitHub Discussions](https://github.com/z4ck404/cronjob-scale-down-operator/discussions)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcronschedules%2Fcronjob-scale-down-operator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcronschedules%2Fcronjob-scale-down-operator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcronschedules%2Fcronjob-scale-down-operator/lists"}