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:
parent
dcff2ccc7b
commit
8ed746c214
2 changed files with 69 additions and 4 deletions
pkg/prometheus
|
@ -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)
|
||||
|
|
|
@ -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{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue