mirror of https://github.com/portainer/portainer
fix(app): use standard resource request units [r8s-122] (#15)
parent
c88382ec1f
commit
a06a09afcf
|
@ -13,7 +13,7 @@ import (
|
||||||
|
|
||||||
// @id GetApplicationsResources
|
// @id GetApplicationsResources
|
||||||
// @summary Get the total resource requests and limits of all applications
|
// @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.
|
// @description **Access policy**: Authenticated user.
|
||||||
// @tags kubernetes
|
// @tags kubernetes
|
||||||
// @security ApiKeyAuth || jwt
|
// @security ApiKeyAuth || jwt
|
||||||
|
|
|
@ -133,27 +133,16 @@ func (kcl *KubeClient) GetApplicationsResource(namespace, node string) (models.K
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, pod := range pods.Items {
|
for _, pod := range pods.Items {
|
||||||
for _, container := range pod.Spec.Containers {
|
podResources := calculateResourceUsage(pod)
|
||||||
resource.CPURequest += float64(container.Resources.Requests.Cpu().MilliValue())
|
resource.CPURequest += podResources.CPURequest
|
||||||
resource.CPULimit += float64(container.Resources.Limits.Cpu().MilliValue())
|
resource.CPULimit += podResources.CPULimit
|
||||||
resource.MemoryRequest += container.Resources.Requests.Memory().Value()
|
resource.MemoryRequest += podResources.MemoryRequest
|
||||||
resource.MemoryLimit += container.Resources.Limits.Memory().Value()
|
resource.MemoryLimit += podResources.MemoryLimit
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return resource, nil
|
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
|
// GetApplicationsFromConfigMap gets a list of applications that use a specific ConfigMap
|
||||||
// by checking all pods in the same namespace as the 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) {
|
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
|
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 {
|
func calculateResourceUsage(pod corev1.Pod) models.K8sApplicationResource {
|
||||||
resource := models.K8sApplicationResource{}
|
resource := models.K8sApplicationResource{}
|
||||||
for _, container := range pod.Spec.Containers {
|
for _, container := range pod.Spec.Containers {
|
||||||
resource.CPURequest += float64(container.Resources.Requests.Cpu().MilliValue())
|
// CPU cores as a decimal
|
||||||
resource.CPULimit += float64(container.Resources.Limits.Cpu().MilliValue())
|
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.MemoryRequest += container.Resources.Requests.Memory().Value()
|
||||||
resource.MemoryLimit += container.Resources.Limits.Memory().Value()
|
resource.MemoryLimit += container.Resources.Limits.Memory().Value()
|
||||||
}
|
}
|
||||||
return convertApplicationResourceUnits(resource)
|
return resource
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetApplicationFromServiceSelector gets applications based on service selectors
|
// GetApplicationFromServiceSelector gets applications based on service selectors
|
||||||
|
|
|
@ -363,7 +363,9 @@ class KubernetesNodeController {
|
||||||
useServerMetrics: this.endpoint.Kubernetes.Configuration.UseServerMetrics,
|
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.availableEffects = _.values(KubernetesNodeTaintEffects);
|
||||||
this.formValues = KubernetesNodeConverter.nodeToFormValues(this.node);
|
this.formValues = KubernetesNodeConverter.nodeToFormValues(this.node);
|
||||||
|
@ -371,7 +373,6 @@ class KubernetesNodeController {
|
||||||
this.formValues.Labels = KubernetesNodeHelper.reorderLabels(this.formValues.Labels);
|
this.formValues.Labels = KubernetesNodeHelper.reorderLabels(this.formValues.Labels);
|
||||||
|
|
||||||
this.resourceReservation = await getTotalResourcesForAllApplications(this.$state.params.endpointId, this.node.Name);
|
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.resourceReservation.MemoryRequest = KubernetesResourceReservationHelper.megaBytesValue(this.resourceReservation.MemoryRequest);
|
||||||
this.node.Memory = KubernetesResourceReservationHelper.megaBytesValue(this.node.Memory);
|
this.node.Memory = KubernetesResourceReservationHelper.megaBytesValue(this.node.Memory);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue