diff --git a/docs/deployment/schedulers/k3s.md b/docs/deployment/schedulers/k3s.md index 573a2eb2d..a63ca3e3a 100644 --- a/docs/deployment/schedulers/k3s.md +++ b/docs/deployment/schedulers/k3s.md @@ -366,7 +366,7 @@ The `k3s` scheduler supports a minimal list of resource _limits_ and _reservatio - cpu: is specified in number of CPUs a process can access. - memory: should be specified with a suffix of `b` (bytes), `Ki` (kilobytes), `Mi` (megabytes), `Gi` (gigabytes). Default unit is `Mi` (megabytes). -If unspecified for any task, the default reservation will be .1 CPU and 128Mi RAM, with no limit set for either CPU or RAM. This is to avoid issues with overscheduling pods on a cluster. To avoid issues, set more specific values for at least resource reservations. +If unspecified for any task, the default reservation will be `.1` CPU and `128Mi` RAM, with no limit set for either CPU or RAM. This is to avoid issues with overscheduling pods on a cluster. To avoid issues, set more specific values for at least resource reservations. If unbounded utilization is desired, set CPU and Memory to `0m` and `0Mi`, respectively. > [!NOTE] > Cron tasks retrieve resource limits based on the computed cron task ID. diff --git a/plugins/scheduler-k3s/functions.go b/plugins/scheduler-k3s/functions.go index 4c8b17355..365d1268d 100644 --- a/plugins/scheduler-k3s/functions.go +++ b/plugins/scheduler-k3s/functions.go @@ -832,10 +832,8 @@ func getProcessResources(appName string, processType string) (ProcessResourcesMa } emptyValues := map[string]bool{ - "": true, - "0": true, - "0m": true, - "0Mi": true, + "": true, + "0": true, } result, err := common.CallPlugnTrigger(common.PlugnTriggerInput{ @@ -849,6 +847,8 @@ func getProcessResources(appName string, processType string) (ProcessResourcesMa } if quantity.MilliValue() != 0 { processResources.Limits.CPU = quantity.String() + } else { + processResources.Limits.CPU = "" } } nvidiaGpuLimit, err := common.PlugnTriggerOutputAsString("resource-get-property", []string{appName, processType, "limit", "nvidia-gpu"}...) @@ -870,6 +870,8 @@ func getProcessResources(appName string, processType string) (ProcessResourcesMa } if quantity != "0Mi" { processResources.Limits.Memory = quantity + } else { + processResources.Limits.Memory = "" } } @@ -884,6 +886,8 @@ func getProcessResources(appName string, processType string) (ProcessResourcesMa } if quantity.MilliValue() != 0 { processResources.Requests.CPU = quantity.String() + } else { + processResources.Requests.CPU = "" } } result, err = common.CallPlugnTrigger(common.PlugnTriggerInput{ @@ -897,6 +901,8 @@ func getProcessResources(appName string, processType string) (ProcessResourcesMa } if quantity != "0Mi" { processResources.Requests.Memory = quantity + } else { + processResources.Requests.Memory = "" } } diff --git a/tests/unit/scheduler-k3s.bats b/tests/unit/scheduler-k3s.bats index 6b0c9b8c1..c78e1f785 100644 --- a/tests/unit/scheduler-k3s.bats +++ b/tests/unit/scheduler-k3s.bats @@ -70,22 +70,6 @@ uninstall_k3s() { assert_success } -@test "(scheduler-k3s) install traefik" { - if [[ -z "$DOCKERHUB_USERNAME" ]] || [[ -z "$DOCKERHUB_TOKEN" ]]; then - skip "skipping due to missing docker.io credentials DOCKERHUB_USERNAME:DOCKERHUB_TOKEN" - fi - - install_k3s -} - -@test "(scheduler-k3s) install nginx" { - if [[ -z "$DOCKERHUB_USERNAME" ]] || [[ -z "$DOCKERHUB_TOKEN" ]]; then - skip "skipping due to missing docker.io credentials DOCKERHUB_USERNAME:DOCKERHUB_TOKEN" - fi - - INGRESS_CLASS=nginx install_k3s -} - @test "(scheduler-k3s) install traefik with taint" { if [[ -z "$DOCKERHUB_USERNAME" ]] || [[ -z "$DOCKERHUB_TOKEN" ]]; then skip "skipping due to missing docker.io credentials DOCKERHUB_USERNAME:DOCKERHUB_TOKEN" @@ -102,7 +86,7 @@ uninstall_k3s() { INGRESS_CLASS=nginx TAINT_SCHEDULING=true install_k3s } -@test "(scheduler-k3s) deploy traefik" { +@test "(scheduler-k3s) deploy traefik [resource]" { if [[ -z "$DOCKERHUB_USERNAME" ]] || [[ -z "$DOCKERHUB_TOKEN" ]]; then skip "skipping due to missing docker.io credentials DOCKERHUB_USERNAME:DOCKERHUB_TOKEN" fi @@ -130,6 +114,77 @@ uninstall_k3s() { assert_success assert_http_localhost_response "http" "$TEST_APP.dokku.me" "80" "" "python/http.server" + + # include resource tests + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.requests.cpu}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "100m" + + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.requests.memory}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "128Mi" + + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.limits.cpu}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "" + + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.limits.memory}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "" + + run /bin/bash -c "dokku resource:reserve $TEST_APP --memory 300 --cpu 0m --process-type web" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku resource:limit $TEST_APP --memory 512 --process-type web" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "dokku ps:rebuild $TEST_APP" + echo "output: $output" + echo "status: $status" + assert_success + + run /bin/bash -c "sleep 20" + echo "output: $output" + echo "status: $status" + assert_success + + assert_http_localhost_response "http" "$TEST_APP.dokku.me" "80" "" "python/http.server" + + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.requests.cpu}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "" + + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.requests.memory}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "300Mi" + + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.limits.cpu}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "" + + run /bin/bash -c "kubectl get pods -o=jsonpath='{.items[*]..resources.limits.memory}'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "512Mi" } @test "(scheduler-k3s) deploy nginx" {