From 13068953ef92b06ee43dc1f9e3488765b8833570 Mon Sep 17 00:00:00 2001 From: zzjin Date: Wed, 16 Oct 2024 21:36:48 +0800 Subject: [PATCH] Update devbox controller, add support init request ephemeral storage. (#5156) * Update devbox controller, add support init request ephemeral storage. Signed-off-by: zzjin * Fix controller reconcile ignore. Signed-off-by: zzjin * Fix typo. Signed-off-by: zzjin --------- Signed-off-by: zzjin --- controllers/devbox/cmd/main.go | 19 +++++++------ .../internal/controller/devbox_controller.go | 7 +++-- .../internal/controller/helper/devbox.go | 28 +++++++++++++++---- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/controllers/devbox/cmd/main.go b/controllers/devbox/cmd/main.go index 75e046aa587..fba7e1dd261 100644 --- a/controllers/devbox/cmd/main.go +++ b/controllers/devbox/cmd/main.go @@ -69,7 +69,8 @@ func main() { var registryUser string var registryPassword string var authAddr string - var ephemeralStorage string + var requestEphemeralStorage string + var limitEphemeralStorage string var debugMode bool flag.StringVar(®istryAddr, "registry-addr", "sealos.hub:5000", "The address of the registry") flag.StringVar(®istryUser, "registry-user", "admin", "The user of the registry") @@ -86,7 +87,8 @@ func main() { flag.BoolVar(&enableHTTP2, "enable-http2", false, "If set, HTTP/2 will be enabled for the metrics and webhook servers") flag.BoolVar(&debugMode, "debug", false, "If set, debug mode will be enabled") - flag.StringVar(&ephemeralStorage, "ephemeral-storage", "2000Mi", "The maximum value of equatorial storage in devbox.") + flag.StringVar(&requestEphemeralStorage, "request-ephemeral-storage", "500Mi", "The request value of ephemeral storage in devbox.") + flag.StringVar(&limitEphemeralStorage, "limit-ephemeral-storage", "10Gi", "The limit value of ephemeral storage in devbox.") opts := zap.Options{ Development: true, } @@ -177,12 +179,13 @@ func main() { } if err = (&controller.DevboxReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - CommitImageRegistry: registryAddr, - Recorder: mgr.GetEventRecorderFor("devbox-controller"), - EquatorialStorage: ephemeralStorage, - DebugMode: debugMode, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + CommitImageRegistry: registryAddr, + Recorder: mgr.GetEventRecorderFor("devbox-controller"), + RequestEphemeralStorage: requestEphemeralStorage, + LimitEphemeralStorage: limitEphemeralStorage, + DebugMode: debugMode, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Devbox") os.Exit(1) diff --git a/controllers/devbox/internal/controller/devbox_controller.go b/controllers/devbox/internal/controller/devbox_controller.go index a74fef4893e..8cef15bade5 100644 --- a/controllers/devbox/internal/controller/devbox_controller.go +++ b/controllers/devbox/internal/controller/devbox_controller.go @@ -44,8 +44,9 @@ import ( // DevboxReconciler reconciles a Devbox object type DevboxReconciler struct { - CommitImageRegistry string - EquatorialStorage string + CommitImageRegistry string + RequestEphemeralStorage string + LimitEphemeralStorage string DebugMode bool @@ -526,7 +527,7 @@ func (r *DevboxReconciler) generateDevboxPod(devbox *devboxv1alpha1.Devbox, runt WorkingDir: helper.GenerateWorkingDir(devbox, runtime), Command: helper.GenerateCommand(devbox, runtime), Args: helper.GenerateDevboxArgs(devbox, runtime), - Resources: helper.GenerateResourceRequirements(devbox, r.EquatorialStorage), + Resources: helper.GenerateResourceRequirements(devbox, r.RequestEphemeralStorage, r.LimitEphemeralStorage), }, } diff --git a/controllers/devbox/internal/controller/helper/devbox.go b/controllers/devbox/internal/controller/helper/devbox.go index 7ce9ac497f5..a84032eb48a 100644 --- a/controllers/devbox/internal/controller/helper/devbox.go +++ b/controllers/devbox/internal/controller/helper/devbox.go @@ -218,6 +218,16 @@ func PodMatchExpectations(expectPod *corev1.Pod, pod *corev1.Pod) bool { return false } + // Check Ephemeral Storage changes + if container.Resources.Requests.StorageEphemeral().Cmp(*expectContainer.Resources.Requests.StorageEphemeral()) != 0 { + slog.Info("Ephemeral-Storage requests are not equal") + return false + } + if container.Resources.Limits.StorageEphemeral().Cmp(*expectContainer.Resources.Limits.StorageEphemeral()) != 0 { + slog.Info("Ephemeral-Storage limits are not equal") + return false + } + // Check environment variables if len(container.Env) != len(expectContainer.Env) { return false @@ -370,18 +380,19 @@ func GenerateSSHVolume(devbox *devboxv1alpha1.Devbox) corev1.Volume { } } -func GenerateResourceRequirements(devbox *devboxv1alpha1.Devbox, equatorialStorage string) corev1.ResourceRequirements { +func GenerateResourceRequirements(devbox *devboxv1alpha1.Devbox, requestEphemeralStorage, limitEphemeralStorage string) corev1.ResourceRequirements { return corev1.ResourceRequirements{ Requests: calculateResourceRequest( corev1.ResourceList{ - corev1.ResourceCPU: devbox.Spec.Resource["cpu"], - corev1.ResourceMemory: devbox.Spec.Resource["memory"], + corev1.ResourceCPU: devbox.Spec.Resource["cpu"], + corev1.ResourceMemory: devbox.Spec.Resource["memory"], + corev1.ResourceEphemeralStorage: resource.MustParse(requestEphemeralStorage), }, ), Limits: corev1.ResourceList{ - "cpu": devbox.Spec.Resource["cpu"], - "memory": devbox.Spec.Resource["memory"], - "ephemeral-storage": resource.MustParse(equatorialStorage), + corev1.ResourceCPU: devbox.Spec.Resource["cpu"], + corev1.ResourceMemory: devbox.Spec.Resource["memory"], + corev1.ResourceEphemeralStorage: resource.MustParse(limitEphemeralStorage), }, } } @@ -403,6 +414,11 @@ func calculateResourceRequest(limit corev1.ResourceList) corev1.ResourceList { memoryRequest := memoryValue / rate request[corev1.ResourceMemory] = *resource.NewQuantity(int64(memoryRequest), resource.BinarySI) } + + if ephemeralStorage, ok := limit[corev1.ResourceEphemeralStorage]; ok { + request[corev1.ResourceEphemeralStorage] = ephemeralStorage + } + return request }