{"id":13560966,"url":"https://github.com/gocrane/crane-scheduler","last_synced_at":"2025-04-04T11:12:28.828Z","repository":{"id":37039653,"uuid":"465948104","full_name":"gocrane/crane-scheduler","owner":"gocrane","description":"Crane scheduler is a Kubernetes scheduler which can schedule pod based on actual node load.","archived":false,"fork":false,"pushed_at":"2024-06-20T11:37:58.000Z","size":349,"stargazers_count":236,"open_issues_count":25,"forks_count":66,"subscribers_count":10,"default_branch":"main","last_synced_at":"2025-03-28T10:08:03.493Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gocrane.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-04T01:59:50.000Z","updated_at":"2025-03-21T12:26:35.000Z","dependencies_parsed_at":"2022-06-29T10:42:02.595Z","dependency_job_id":"66b97519-6507-4c3c-a29f-03a47d98c405","html_url":"https://github.com/gocrane/crane-scheduler","commit_stats":{"total_commits":46,"total_committers":9,"mean_commits":5.111111111111111,"dds":0.5652173913043479,"last_synced_commit":"c2c05338a5d75c0a6d92bd16a1cf257b48b30ef8"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gocrane%2Fcrane-scheduler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gocrane%2Fcrane-scheduler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gocrane%2Fcrane-scheduler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gocrane%2Fcrane-scheduler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gocrane","download_url":"https://codeload.github.com/gocrane/crane-scheduler/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247166168,"owners_count":20894654,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":[],"created_at":"2024-08-01T13:00:51.220Z","updated_at":"2025-04-04T11:12:28.804Z","avatar_url":"https://github.com/gocrane.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# Crane-scheduler\n\n## Overview\nCrane-scheduler is a collection of scheduler plugins based on [scheduler framework](https://kubernetes.io/docs/concepts/scheduling-eviction/scheduling-framework/), including:\n\n- [Dynamic scheduler: a load-aware scheduler plugin](doc/dynamic-scheduler.md)\n## Get Started\n### 1. Install Prometheus\nMake sure your kubernetes cluster has Prometheus installed. If not, please refer to [Install Prometheus](https://github.com/gocrane/fadvisor/blob/main/README.md#prerequests).\n### 2. Configure Prometheus Rules\nConfigure the rules of Prometheus to get expected aggregated data:\n```yaml\napiVersion: monitoring.coreos.com/v1\nkind: PrometheusRule\nmetadata:\n    name: example-record\n    labels:\n        prometheus: k8s\n        role: alert-rules\nspec:\n    groups:\n    - name: cpu_mem_usage_active\n      interval: 30s\n      rules:\n      - record: cpu_usage_active\n        expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[30s])) * 100)\n      - record: mem_usage_active\n        expr: 100*(1-node_memory_MemAvailable_bytes/node_memory_MemTotal_bytes)\n    - name: cpu-usage-5m\n      interval: 5m\n      rules:\n      - record: cpu_usage_max_avg_1h\n        expr: max_over_time(cpu_usage_avg_5m[1h])\n      - record: cpu_usage_max_avg_1d\n        expr: max_over_time(cpu_usage_avg_5m[1d])\n    - name: cpu-usage-1m\n      interval: 1m\n      rules:\n      - record: cpu_usage_avg_5m\n        expr: avg_over_time(cpu_usage_active[5m])\n    - name: mem-usage-5m\n      interval: 5m\n      rules:\n      - record: mem_usage_max_avg_1h\n        expr: max_over_time(mem_usage_avg_5m[1h])\n      - record: mem_usage_max_avg_1d\n        expr: max_over_time(mem_usage_avg_5m[1d])\n    - name: mem-usage-1m\n      interval: 1m\n      rules:\n      - record: mem_usage_avg_5m\n        expr: avg_over_time(mem_usage_active[5m])\n```\n\u003e**⚠️Troubleshooting:** The sampling interval of Prometheus must be less than 30 seconds, otherwise the above rules(such as cpu_usage_active) may not take effect.\n\n### 3. Install Crane-scheduler\nThere are two options:\n1) Install Crane-scheduler as a second scheduler:\n   ```bash\n   helm repo add crane https://gocrane.github.io/helm-charts\n   helm install scheduler -n crane-system --create-namespace --set global.prometheusAddr=\"REPLACE_ME_WITH_PROMETHEUS_ADDR\" crane/scheduler\n   ```\n2) Replace native Kube-scheduler with Crane-scheduler:\n   1) Backup `/etc/kubernetes/manifests/kube-scheduler.yaml`\n   ```bash\n   cp /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes/\n   ```\n   2) Modify configfile of kube-scheduler(`scheduler-config.yaml`) to enable Dynamic scheduler plugin and configure plugin args:\n   ```yaml\n   apiVersion: kubescheduler.config.k8s.io/v1beta2\n   kind: KubeSchedulerConfiguration\n   ...\n   profiles:\n   - schedulerName: default-scheduler\n     plugins:\n       filter:\n         enabled:\n         - name: Dynamic\n       score:\n         enabled:\n         - name: Dynamic\n           weight: 3\n     pluginConfig:\n     - name: Dynamic\n        args:\n         policyConfigPath: /etc/kubernetes/policy.yaml\n   ...\n   ```\n   3) Create `/etc/kubernetes/policy.yaml`, using as scheduler policy of Dynamic plugin:\n   ```yaml\n    apiVersion: scheduler.policy.crane.io/v1alpha1\n    kind: DynamicSchedulerPolicy\n    spec:\n      syncPolicy:\n        ##cpu usage\n        - name: cpu_usage_avg_5m\n          period: 3m\n        - name: cpu_usage_max_avg_1h\n          period: 15m\n        - name: cpu_usage_max_avg_1d\n          period: 3h\n        ##memory usage\n        - name: mem_usage_avg_5m\n          period: 3m\n        - name: mem_usage_max_avg_1h\n          period: 15m\n        - name: mem_usage_max_avg_1d\n          period: 3h\n\n      predicate:\n        ##cpu usage\n        - name: cpu_usage_avg_5m\n          maxLimitPecent: 0.65\n        - name: cpu_usage_max_avg_1h\n          maxLimitPecent: 0.75\n        ##memory usage\n        - name: mem_usage_avg_5m\n          maxLimitPecent: 0.65\n        - name: mem_usage_max_avg_1h\n          maxLimitPecent: 0.75\n\n      priority:\n        ##cpu usage\n        - name: cpu_usage_avg_5m\n          weight: 0.2\n        - name: cpu_usage_max_avg_1h\n          weight: 0.3\n        - name: cpu_usage_max_avg_1d\n          weight: 0.5\n        ##memory usage\n        - name: mem_usage_avg_5m\n          weight: 0.2\n        - name: mem_usage_max_avg_1h\n          weight: 0.3\n        - name: mem_usage_max_avg_1d\n          weight: 0.5\n\n      hotValue:\n        - timeRange: 5m\n          count: 5\n        - timeRange: 1m\n          count: 2\n   ```\n   4) Modify `kube-scheduler.yaml` and replace kube-scheduler image with Crane-scheduler：\n   ```yaml\n   ...\n    image: docker.io/gocrane/crane-scheduler:0.0.23\n   ...\n   ```\n   1) Install [crane-scheduler-controller](deploy/controller/deployment.yaml):\n    ```bash\n    kubectl apply ./deploy/controller/rbac.yaml \u0026\u0026 kubectl apply -f ./deploy/controller/deployment.yaml\n    ```\n\n### 4. Schedule Pods With Crane-scheduler\nTest Crane-scheduler with following example:\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: cpu-stress\nspec:\n  selector:\n    matchLabels:\n      app: cpu-stress\n  replicas: 1\n  template:\n    metadata:\n      labels:\n        app: cpu-stress\n    spec:\n      schedulerName: crane-scheduler\n      hostNetwork: true\n      tolerations:\n      - key: node.kubernetes.io/network-unavailable\n        operator: Exists\n        effect: NoSchedule\n      containers:\n      - name: stress\n        image: docker.io/gocrane/stress:latest\n        command: [\"stress\", \"-c\", \"1\"]\n        resources:\n          requests:\n            memory: \"1Gi\"\n            cpu: \"1\"\n          limits:\n            memory: \"1Gi\"\n            cpu: \"1\"\n```\n\u003e**Note:** Change `crane-scheduler` to `default-scheduler` if `crane-scheduler` is used as default.\n\nThere will be the following event if the test pod is successfully scheduled:\n```bash\nType    Reason     Age   From             Message\n----    ------     ----  ----             -------\nNormal  Scheduled  28s   crane-scheduler  Successfully assigned default/cpu-stress-7669499b57-zmrgb to vm-162-247-ubuntu\n```\n\n## Compatibility Matrix\n\n|  Scheduler Image Version       | Supported Kubernetes Version |\n| ------------------------------ | :--------------------------: | \n|         0.0.23                 |        \u003e=1.22.0              |\n|         0.0.20                 |        \u003e=1.18.0              | \n\nThe default scheudler image version is `0.0.23`, and you can run the following command for quick replacement:\n\n```bash\n KUBE_EDITOR=\"sed -i 's/v1beta2/v1beta1/g'\" kubectl edit cm scheduler-config -n crane-system \u0026\u0026 KUBE_EDITOR=\"sed -i 's/0.0.23/0.0.20/g'\" kubectl edit deploy crane-scheduler -n crane-system\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgocrane%2Fcrane-scheduler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgocrane%2Fcrane-scheduler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgocrane%2Fcrane-scheduler/lists"}