1
0
Fork 0
mirror of https://github.com/prometheus-operator/prometheus-operator.git synced 2025-04-21 11:48:53 +00:00

prometheus: Add ensure memory request is smaller or equal to limit

This commit is contained in:
Frederic Branczyk 2018-01-11 10:57:42 +01:00
parent dcff2ccc7b
commit 8ed746c214
No known key found for this signature in database
GPG key ID: 7741A52782A90069
2 changed files with 69 additions and 4 deletions

View file

@ -100,8 +100,19 @@ func makeStatefulSet(p monitoringv1.Prometheus, old *v1beta1.StatefulSet, config
if p.Spec.Resources.Requests == nil {
p.Spec.Resources.Requests = v1.ResourceList{}
}
if _, ok := p.Spec.Resources.Requests[v1.ResourceMemory]; !ok {
p.Spec.Resources.Requests[v1.ResourceMemory] = resource.MustParse("2Gi")
_, memoryRequestFound := p.Spec.Resources.Requests[v1.ResourceMemory]
memoryLimit, memoryLimitFound := p.Spec.Resources.Limits[v1.ResourceMemory]
if !memoryRequestFound {
defaultMemoryRequest := resource.MustParse("2Gi")
compareResult := memoryLimit.Cmp(defaultMemoryRequest)
// If limit is given and smaller or equal to 2Gi, then set memory
// request to the given limit. This is necessary as if limit < request,
// then a Pod is not schedulable.
if memoryLimitFound && compareResult <= 0 {
p.Spec.Resources.Requests[v1.ResourceMemory] = memoryLimit
} else {
p.Spec.Resources.Requests[v1.ResourceMemory] = defaultMemoryRequest
}
}
spec, err := makeStatefulSetSpec(p, config, ruleConfigMaps)

View file

@ -15,13 +15,15 @@
package prometheus
import (
"reflect"
"testing"
monitoringv1 "github.com/coreos/prometheus-operator/pkg/client/monitoring/v1"
"github.com/stretchr/testify/require"
"k8s.io/api/apps/v1beta1"
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"reflect"
"testing"
)
var (
@ -248,6 +250,58 @@ func TestDeterministicRuleFileHashing(t *testing.T) {
}
}
func TestMemoryRequestNotAdjustedWhenLimitLarger2Gi(t *testing.T) {
sset, err := makeStatefulSet(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
Resources: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("3Gi"),
},
},
},
}, nil, defaultTestConfig, []*v1.ConfigMap{})
if err != nil {
t.Fatalf("Unexpected error while making StatefulSet: %v", err)
}
resourceRequest := sset.Spec.Template.Spec.Containers[0].Resources.Requests[v1.ResourceMemory]
requestString := resourceRequest.String()
resourceLimit := sset.Spec.Template.Spec.Containers[0].Resources.Limits[v1.ResourceMemory]
limitString := resourceLimit.String()
if requestString != "2Gi" {
t.Fatalf("Resource request is expected to be 1Gi, instead found %s", resourceRequest)
}
if limitString != "3Gi" {
t.Fatalf("Resource limit is expected to be 1Gi, instead found %s", resourceLimit)
}
}
func TestMemoryRequestAdjustedWhenOnlyLimitGiven(t *testing.T) {
sset, err := makeStatefulSet(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{
Resources: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("1Gi"),
},
},
},
}, nil, defaultTestConfig, []*v1.ConfigMap{})
if err != nil {
t.Fatalf("Unexpected error while making StatefulSet: %v", err)
}
resourceRequest := sset.Spec.Template.Spec.Containers[0].Resources.Requests[v1.ResourceMemory]
requestString := resourceRequest.String()
resourceLimit := sset.Spec.Template.Spec.Containers[0].Resources.Limits[v1.ResourceMemory]
limitString := resourceLimit.String()
if requestString != "1Gi" {
t.Fatalf("Resource request is expected to be 1Gi, instead found %s", resourceRequest)
}
if limitString != "1Gi" {
t.Fatalf("Resource limit is expected to be 1Gi, instead found %s", resourceLimit)
}
}
func makeConfigMap() *v1.ConfigMap {
res := &v1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{