From 65dd4bc1e051b0d82fccbf376cbc7ad139efeed2 Mon Sep 17 00:00:00 2001 From: Jose Diaz-Gonzalez Date: Thu, 6 Mar 2025 22:59:35 -0500 Subject: [PATCH] feat: set shm-size volume/volumeMounts on kubernetes deployments --- plugins/scheduler-k3s/template.go | 12 ++++++++++ .../templates/chart/deployment.yaml | 22 +++++++++++++++++++ plugins/scheduler-k3s/triggers.go | 14 ++++++++++++ tests/unit/scheduler-k3s-2.bats | 17 ++++++++++++++ 4 files changed, 65 insertions(+) diff --git a/plugins/scheduler-k3s/template.go b/plugins/scheduler-k3s/template.go index 94bb9baa8..8ce060806 100644 --- a/plugins/scheduler-k3s/template.go +++ b/plugins/scheduler-k3s/template.go @@ -113,6 +113,18 @@ type ProcessValues struct { Replicas int32 `yaml:"replicas"` Resources ProcessResourcesMap `yaml:"resources,omitempty"` Web ProcessWeb `yaml:"web,omitempty"` + Volumes []ProcessVolume `yaml:"volumes,omitempty"` +} + +type ProcessVolume struct { + Name string `yaml:"name"` + MountPath string `yaml:"mount_path"` + EmptyDir *ProcessVolumeEmptyDir `yaml:"empty_dir,omitempty"` +} + +type ProcessVolumeEmptyDir struct { + Medium string `yaml:"medium"` + SizeLimit string `yaml:"size_limit"` } type ProcessAnnotations struct { diff --git a/plugins/scheduler-k3s/templates/chart/deployment.yaml b/plugins/scheduler-k3s/templates/chart/deployment.yaml index 1457ccd5f..3bb1d6e64 100644 --- a/plugins/scheduler-k3s/templates/chart/deployment.yaml +++ b/plugins/scheduler-k3s/templates/chart/deployment.yaml @@ -116,8 +116,30 @@ spec: {{- if $.Values.global.image.working_dir }} workingDir: {{ $.Values.global.image.working_dir }} {{- end }} + {{- if $config.volumes }} + volumeMounts: + {{- range $volume := $config.volumes }} + - name: {{ $volume.name }} + mountPath: {{ $volume.mount_path }} + {{- end }} + {{- end }} {{- if $.Values.global.image.image_pull_secrets }} imagePullSecrets: - name: {{ $.Values.global.image.image_pull_secrets }} {{- end }} serviceAccountName: {{ $.Values.global.app_name }} + {{- if $config.volumes }} + volumes: + {{- range $volume := $config.volumes }} + - name: {{ $volume.name }} + {{- if $volume.empty_dir }} + emptyDir: + {{- if $volume.empty_dir.medium }} + medium: {{ $volume.empty_dir.medium }} + {{- end }} + {{- if $volume.empty_dir.size_limit }} + sizeLimit: {{ $volume.empty_dir.size_limit }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} diff --git a/plugins/scheduler-k3s/triggers.go b/plugins/scheduler-k3s/triggers.go index aede9c473..cb4c27e49 100644 --- a/plugins/scheduler-k3s/triggers.go +++ b/plugins/scheduler-k3s/triggers.go @@ -382,6 +382,18 @@ func TriggerSchedulerDeploy(scheduler string, appName string, imageTag string) e } } + processVolumes := []ProcessVolume{} + if shmSize := getComputedShmSize(appName); shmSize != "" { + processVolumes = append(processVolumes, ProcessVolume{ + Name: "shmem", + MountPath: "/dev/shm", + EmptyDir: &ProcessVolumeEmptyDir{ + Medium: "Memory", + SizeLimit: shmSize, + }, + }) + } + for processType, processCount := range processes { // todo: implement deployment annotations // todo: implement pod annotations @@ -439,6 +451,7 @@ func TriggerSchedulerDeploy(scheduler string, appName string, imageTag string) e ProcessType: ProcessType_Worker, Replicas: int32(processCount), Resources: processResources, + Volumes: processVolumes, } if processType == "web" { @@ -590,6 +603,7 @@ func TriggerSchedulerDeploy(scheduler string, appName string, imageTag string) e ProcessType: ProcessType_Cron, Replicas: 1, Resources: processResources, + Volumes: processVolumes, } values.Processes[cronEntry.ID] = processValues diff --git a/tests/unit/scheduler-k3s-2.bats b/tests/unit/scheduler-k3s-2.bats index 676f5612f..60734ad07 100644 --- a/tests/unit/scheduler-k3s-2.bats +++ b/tests/unit/scheduler-k3s-2.bats @@ -179,12 +179,29 @@ teardown_() { echo "status: $status" assert_success + run /bin/bash -c "dokku scheduler-k3s:set $TEST_APP shm-size 64Mi" + echo "output: $output" + echo "status: $status" + assert_success + run /bin/bash -c "dokku git:sync --build $TEST_APP https://github.com/dokku/smoke-test-app.git" 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 deployment $TEST_APP-web -o json | jq -r '.spec.template.spec.volumes[0].emptyDir.sizeLimit'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "64Mi" + + run /bin/bash -c "kubectl get deployment $TEST_APP-web -o json | jq -r '.spec.template.spec.volumes[0].emptyDir.medium'" + echo "output: $output" + echo "status: $status" + assert_success + assert_output "Memory" } @test "(scheduler-k3s) deploy annotations" {