mirror of
https://github.com/coreos/prometheus-operator.git
synced 2026-02-05 15:46:31 +01:00
This commit avoids the situation where the operator would update the StatefulSet because the concatenation of configured rules exceeds the maximum ConfigMap size. To alleviate the issue, the operator now configures the StatefulSet to always mount 3 "rule" ConfigMaps with "optional: true". When the operator generates an additional ConfigMap, it will get mounted automatically into the pod and the config-reloader sidecar will detect and apply the new configuration. When the number of "concrete" ConfigMaps decreases, the operation is also non-disruptive. The number has been chosen arbitrarily and it could change in the future but 3 seems a good choice (original reports were complaining about the number of ConfigMaps fluctuating between 1 and 2). The change applies both to Prometheus and ThanosRuler. Closes #5085 Signed-off-by: Simon Pasquier <spasquie@redhat.com>
104 lines
2.4 KiB
Go
104 lines
2.4 KiB
Go
// Copyright 2016 The prometheus-operator Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package framework
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
|
|
v1 "k8s.io/api/core/v1"
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/util/wait"
|
|
)
|
|
|
|
func MakeConfigMapWithCert(ns, name, keyKey, certKey, caKey string,
|
|
keyBytes, certBytes, caBytes []byte) *v1.ConfigMap {
|
|
|
|
cm := &v1.ConfigMap{
|
|
ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: ns},
|
|
Data: map[string]string{},
|
|
}
|
|
|
|
if keyBytes != nil {
|
|
cm.Data[keyKey] = string(keyBytes)
|
|
}
|
|
|
|
if certBytes != nil {
|
|
cm.Data[certKey] = string(certBytes)
|
|
}
|
|
|
|
if caBytes != nil {
|
|
cm.Data[caKey] = string(caBytes)
|
|
}
|
|
|
|
return cm
|
|
}
|
|
|
|
func (f *Framework) WaitForConfigMapExist(ctx context.Context, ns, name string) (*v1.ConfigMap, error) {
|
|
var (
|
|
configMap *v1.ConfigMap
|
|
getErr error
|
|
)
|
|
err := wait.PollUntilContextTimeout(ctx, 2*time.Second, f.DefaultTimeout, true, func(ctx context.Context) (bool, error) {
|
|
configMap, getErr = f.
|
|
KubeClient.
|
|
CoreV1().
|
|
ConfigMaps(ns).
|
|
Get(ctx, name, metav1.GetOptions{})
|
|
|
|
if getErr != nil {
|
|
return false, nil
|
|
}
|
|
|
|
return true, nil
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%w: %w", err, getErr)
|
|
}
|
|
|
|
return configMap, nil
|
|
}
|
|
|
|
func (f *Framework) WaitForConfigMapNotExist(ctx context.Context, ns, name string) error {
|
|
var getErr error
|
|
err := wait.PollUntilContextTimeout(ctx, 2*time.Second, f.DefaultTimeout, true, func(ctx context.Context) (bool, error) {
|
|
_, getErr = f.
|
|
KubeClient.
|
|
CoreV1().
|
|
ConfigMaps(ns).
|
|
Get(ctx, name, metav1.GetOptions{})
|
|
|
|
if getErr != nil {
|
|
if apierrors.IsNotFound(getErr) {
|
|
return true, nil
|
|
}
|
|
|
|
return false, nil
|
|
}
|
|
|
|
getErr = errors.New("configmap found")
|
|
return false, nil
|
|
})
|
|
|
|
if err != nil {
|
|
return fmt.Errorf("%w: %w", err, getErr)
|
|
}
|
|
return nil
|
|
}
|