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

*: Allow disabling limits on sidecars

This commit is contained in:
Frederic Branczyk 2019-04-16 15:33:21 +02:00
parent a61cd4c8b3
commit 0e403effb0
No known key found for this signature in database
GPG key ID: 7741A52782A90069
5 changed files with 133 additions and 20 deletions

View file

@ -123,8 +123,8 @@ func init() {
// specified.
flagset.StringVar(&cfg.PrometheusConfigReloaderImage, "prometheus-config-reloader", fmt.Sprintf("quay.io/coreos/prometheus-config-reloader:v%v", version.Version), "Prometheus config reloader image")
flagset.StringVar(&cfg.ConfigReloaderImage, "config-reloader-image", "quay.io/coreos/configmap-reload:v0.0.1", "Reload Image")
flagset.StringVar(&cfg.ConfigReloaderCPU, "config-reloader-cpu", "100m", "Config Reloader CPU")
flagset.StringVar(&cfg.ConfigReloaderMemory, "config-reloader-memory", "25Mi", "Config Reloader Memory")
flagset.StringVar(&cfg.ConfigReloaderCPU, "config-reloader-cpu", "100m", "Config Reloader CPU. Value \"0\" disables it and causes no limit to be configured.")
flagset.StringVar(&cfg.ConfigReloaderMemory, "config-reloader-memory", "25Mi", "Config Reloader Memory. Value \"0\" disables it and causes no limit to be configured.")
flagset.StringVar(&cfg.AlertmanagerDefaultBaseImage, "alertmanager-default-base-image", "quay.io/prometheus/alertmanager", "Alertmanager default base image")
flagset.StringVar(&cfg.PrometheusDefaultBaseImage, "prometheus-default-base-image", "quay.io/prometheus/prometheus", "Prometheus default base image")
flagset.StringVar(&cfg.ThanosDefaultBaseImage, "thanos-default-base-image", "improbable/thanos", "Thanos default base image")

View file

@ -407,6 +407,14 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config) (*appsv1.S
})
}
resources := v1.ResourceRequirements{Limits: v1.ResourceList{}}
if config.ConfigReloaderCPU != "0" {
resources.Limits[v1.ResourceCPU] = resource.MustParse(config.ConfigReloaderCPU)
}
if config.ConfigReloaderMemory != "0" {
resources.Limits[v1.ResourceMemory] = resource.MustParse(config.ConfigReloaderMemory)
}
terminationGracePeriod := int64(0)
finalLabels := config.Labels.Merge(podLabels)
return &appsv1.StatefulSetSpec{
@ -462,12 +470,7 @@ func makeStatefulSetSpec(a *monitoringv1.Alertmanager, config Config) (*appsv1.S
MountPath: alertmanagerConfDir,
},
},
Resources: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceCPU: resource.MustParse(config.ConfigReloaderCPU),
v1.ResourceMemory: resource.MustParse(config.ConfigReloaderMemory),
},
},
Resources: resources,
},
}, a.Spec.Containers...),
Volumes: volumes,

View file

@ -23,6 +23,7 @@ import (
monitoringv1 "github.com/coreos/prometheus-operator/pkg/apis/monitoring/v1"
"github.com/stretchr/testify/require"
"k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
@ -555,3 +556,55 @@ func sliceContains(slice []string, match string) bool {
}
return contains
}
func TestSidecarsNoCPULimits(t *testing.T) {
testConfig := Config{
ConfigReloaderImage: "quay.io/coreos/configmap-reload:latest",
ConfigReloaderCPU: "0",
ConfigReloaderMemory: "25Mi",
AlertmanagerDefaultBaseImage: "quay.io/prometheus/alertmanager",
}
sset, err := makeStatefulSet(&monitoringv1.Alertmanager{
Spec: monitoringv1.AlertmanagerSpec{},
}, nil, testConfig)
if err != nil {
t.Fatalf("Unexpected error while making StatefulSet: %v", err)
}
expectedResources := v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("25Mi"),
},
}
for _, c := range sset.Spec.Template.Spec.Containers {
if c.Name == "config-reloader" && !reflect.DeepEqual(c.Resources, expectedResources) {
t.Fatal("Unexpected resource requests/limits set, when none should be set.")
}
}
}
func TestSidecarsNoMemoryLimits(t *testing.T) {
testConfig := Config{
ConfigReloaderImage: "quay.io/coreos/configmap-reload:latest",
ConfigReloaderCPU: "100m",
ConfigReloaderMemory: "0",
AlertmanagerDefaultBaseImage: "quay.io/prometheus/alertmanager",
}
sset, err := makeStatefulSet(&monitoringv1.Alertmanager{
Spec: monitoringv1.AlertmanagerSpec{},
}, nil, testConfig)
if err != nil {
t.Fatalf("Unexpected error while making StatefulSet: %v", err)
}
expectedResources := v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("100m"),
},
}
for _, c := range sset.Spec.Template.Spec.Containers {
if c.Name == "config-reloader" && !reflect.DeepEqual(c.Resources, expectedResources) {
t.Fatal("Unexpected resource requests/limits set, when none should be set.")
}
}
}

View file

@ -628,12 +628,14 @@ func makeStatefulSetSpec(p monitoringv1.Prometheus, c *Config, ruleConfigMapName
fmt.Sprintf("--webhook-url=%s", localReloadURL),
},
VolumeMounts: []v1.VolumeMount{},
Resources: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceCPU: resource.MustParse(c.ConfigReloaderCPU),
v1.ResourceMemory: resource.MustParse(c.ConfigReloaderMemory),
},
},
Resources: v1.ResourceRequirements{Limits: v1.ResourceList{}},
}
if c.ConfigReloaderCPU != "0" {
container.Resources.Limits[v1.ResourceCPU] = resource.MustParse(c.ConfigReloaderCPU)
}
if c.ConfigReloaderMemory != "0" {
container.Resources.Limits[v1.ResourceMemory] = resource.MustParse(c.ConfigReloaderMemory)
}
for _, name := range ruleConfigMapNames {
@ -841,6 +843,14 @@ func makeStatefulSetSpec(p monitoringv1.Prometheus, c *Config, ruleConfigMapName
prometheusImage = *p.Spec.Image
}
prometheusConfigReloaderResources := v1.ResourceRequirements{Limits: v1.ResourceList{}}
if c.ConfigReloaderCPU != "0" {
prometheusConfigReloaderResources.Limits[v1.ResourceCPU] = resource.MustParse(c.ConfigReloaderCPU)
}
if c.ConfigReloaderMemory != "0" {
prometheusConfigReloaderResources.Limits[v1.ResourceMemory] = resource.MustParse(c.ConfigReloaderMemory)
}
return &appsv1.StatefulSetSpec{
ServiceName: governingServiceName,
Replicas: p.Spec.Replicas,
@ -881,12 +891,7 @@ func makeStatefulSetSpec(p monitoringv1.Prometheus, c *Config, ruleConfigMapName
Command: []string{"/bin/prometheus-config-reloader"},
Args: configReloadArgs,
VolumeMounts: configReloadVolumeMounts,
Resources: v1.ResourceRequirements{
Limits: v1.ResourceList{
v1.ResourceCPU: resource.MustParse(c.ConfigReloaderCPU),
v1.ResourceMemory: resource.MustParse(c.ConfigReloaderMemory),
},
},
Resources: prometheusConfigReloaderResources,
},
}, additionalContainers...),
SecurityContext: securityContext,

View file

@ -646,3 +646,55 @@ func TestRetention(t *testing.T) {
}
}
}
func TestSidecarsNoCPULimits(t *testing.T) {
testConfig := &Config{
ConfigReloaderImage: "quay.io/coreos/configmap-reload:latest",
ConfigReloaderCPU: "0",
ConfigReloaderMemory: "50Mi",
PrometheusConfigReloaderImage: "quay.io/coreos/prometheus-config-reloader:latest",
PrometheusDefaultBaseImage: "quay.io/prometheus/prometheus",
ThanosDefaultBaseImage: "improbable/thanos",
}
sset, err := makeStatefulSet(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{},
}, testConfig, nil, "")
if err != nil {
t.Fatalf("Unexpected error while making StatefulSet: %v", err)
}
expectedResources := v1.ResourceRequirements{Limits: v1.ResourceList{
v1.ResourceMemory: resource.MustParse("50Mi"),
}}
for _, c := range sset.Spec.Template.Spec.Containers {
if (c.Name == "prometheus-config-reloader" || c.Name == "rules-configmap-reloader") && !reflect.DeepEqual(c.Resources, expectedResources) {
t.Fatal("Unexpected resource requests/limits set, when none should be set.")
}
}
}
func TestSidecarsNoMemoryLimits(t *testing.T) {
testConfig := &Config{
ConfigReloaderImage: "quay.io/coreos/configmap-reload:latest",
ConfigReloaderCPU: "100m",
ConfigReloaderMemory: "0",
PrometheusConfigReloaderImage: "quay.io/coreos/prometheus-config-reloader:latest",
PrometheusDefaultBaseImage: "quay.io/prometheus/prometheus",
ThanosDefaultBaseImage: "improbable/thanos",
}
sset, err := makeStatefulSet(monitoringv1.Prometheus{
Spec: monitoringv1.PrometheusSpec{},
}, testConfig, nil, "")
if err != nil {
t.Fatalf("Unexpected error while making StatefulSet: %v", err)
}
expectedResources := v1.ResourceRequirements{Limits: v1.ResourceList{
v1.ResourceCPU: resource.MustParse("100m"),
}}
for _, c := range sset.Spec.Template.Spec.Containers {
if (c.Name == "prometheus-config-reloader" || c.Name == "rules-configmap-reloader") && !reflect.DeepEqual(c.Resources, expectedResources) {
t.Fatal("Unexpected resource requests/limits set, when none should be set.")
}
}
}