From a06a09afcf3bf4fa4d36bc1ce065946c98b85f7d Mon Sep 17 00:00:00 2001 From: Ali <83188384+testA113@users.noreply.github.com> Date: Mon, 14 Oct 2024 11:27:22 +1300 Subject: [PATCH] fix(app): use standard resource request units [r8s-122] (#15) --- api/http/handler/kubernetes/application.go | 2 +- api/kubernetes/cli/applications.go | 31 +++++++------------ .../views/cluster/node/nodeController.js | 5 +-- 3 files changed, 15 insertions(+), 23 deletions(-) diff --git a/api/http/handler/kubernetes/application.go b/api/http/handler/kubernetes/application.go index 5434522ca..2da8d0fd4 100644 --- a/api/http/handler/kubernetes/application.go +++ b/api/http/handler/kubernetes/application.go @@ -13,7 +13,7 @@ import ( // @id GetApplicationsResources // @summary Get the total resource requests and limits of all applications -// @description Get the total CPU (cores) and memory requests (MB) and limits of all applications across all namespaces. +// @description Get the total CPU (cores) and memory (bytes) requests and limits of all applications across all namespaces. // @description **Access policy**: Authenticated user. // @tags kubernetes // @security ApiKeyAuth || jwt diff --git a/api/kubernetes/cli/applications.go b/api/kubernetes/cli/applications.go index 03f623d9e..d12ab0575 100644 --- a/api/kubernetes/cli/applications.go +++ b/api/kubernetes/cli/applications.go @@ -133,27 +133,16 @@ func (kcl *KubeClient) GetApplicationsResource(namespace, node string) (models.K } for _, pod := range pods.Items { - for _, container := range pod.Spec.Containers { - resource.CPURequest += float64(container.Resources.Requests.Cpu().MilliValue()) - resource.CPULimit += float64(container.Resources.Limits.Cpu().MilliValue()) - resource.MemoryRequest += container.Resources.Requests.Memory().Value() - resource.MemoryLimit += container.Resources.Limits.Memory().Value() - } + podResources := calculateResourceUsage(pod) + resource.CPURequest += podResources.CPURequest + resource.CPULimit += podResources.CPULimit + resource.MemoryRequest += podResources.MemoryRequest + resource.MemoryLimit += podResources.MemoryLimit } return resource, nil } -// convertApplicationResourceUnits converts the resource units from milli to core and bytes to mega bytes -func convertApplicationResourceUnits(resource models.K8sApplicationResource) models.K8sApplicationResource { - return models.K8sApplicationResource{ - CPURequest: resource.CPURequest / 1000, - CPULimit: resource.CPULimit / 1000, - MemoryRequest: resource.MemoryRequest / 1024 / 1024, - MemoryLimit: resource.MemoryLimit / 1024 / 1024, - } -} - // GetApplicationsFromConfigMap gets a list of applications that use a specific ConfigMap // by checking all pods in the same namespace as the ConfigMap func (kcl *KubeClient) GetApplicationNamesFromConfigMap(configMap models.K8sConfigMap, pods []corev1.Pod, replicaSets []appsv1.ReplicaSet) ([]string, error) { @@ -351,16 +340,18 @@ func updateApplicationWithService(application models.K8sApplication, services [] return application } -// calculateResourceUsage calculates the resource usage for a pod +// calculateResourceUsage calculates the resource usage for a pod in CPU cores and Bytes func calculateResourceUsage(pod corev1.Pod) models.K8sApplicationResource { resource := models.K8sApplicationResource{} for _, container := range pod.Spec.Containers { - resource.CPURequest += float64(container.Resources.Requests.Cpu().MilliValue()) - resource.CPULimit += float64(container.Resources.Limits.Cpu().MilliValue()) + // CPU cores as a decimal + resource.CPURequest += float64(container.Resources.Requests.Cpu().MilliValue()) / 1000 + resource.CPULimit += float64(container.Resources.Limits.Cpu().MilliValue()) / 1000 + // Bytes resource.MemoryRequest += container.Resources.Requests.Memory().Value() resource.MemoryLimit += container.Resources.Limits.Memory().Value() } - return convertApplicationResourceUnits(resource) + return resource } // GetApplicationFromServiceSelector gets applications based on service selectors diff --git a/app/kubernetes/views/cluster/node/nodeController.js b/app/kubernetes/views/cluster/node/nodeController.js index 29b1d3820..ab57c0ad9 100644 --- a/app/kubernetes/views/cluster/node/nodeController.js +++ b/app/kubernetes/views/cluster/node/nodeController.js @@ -363,7 +363,9 @@ class KubernetesNodeController { useServerMetrics: this.endpoint.Kubernetes.Configuration.UseServerMetrics, }; - await Promise.allSettled([this.getNodes(), this.getEvents(), this.getEndpoints(), this.getNodeUsage()]); + // getEvents depends on nodes, so get nodes first + await this.getNodes(); + await Promise.allSettled([this.getEvents(), this.getEndpoints(), this.getNodeUsage()]); this.availableEffects = _.values(KubernetesNodeTaintEffects); this.formValues = KubernetesNodeConverter.nodeToFormValues(this.node); @@ -371,7 +373,6 @@ class KubernetesNodeController { this.formValues.Labels = KubernetesNodeHelper.reorderLabels(this.formValues.Labels); this.resourceReservation = await getTotalResourcesForAllApplications(this.$state.params.endpointId, this.node.Name); - this.resourceReservation.CpuRequest = Math.round(this.resourceReservation.CpuRequest / 1000); this.resourceReservation.MemoryRequest = KubernetesResourceReservationHelper.megaBytesValue(this.resourceReservation.MemoryRequest); this.node.Memory = KubernetesResourceReservationHelper.megaBytesValue(this.node.Memory);