Skip to content

Commit a38d2f9

Browse files
Merge branch 'master' into pdb-per-shard
2 parents 9094059 + afbdc3a commit a38d2f9

File tree

17 files changed

+89
-44
lines changed

17 files changed

+89
-44
lines changed

docs/CHANGELOG.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,21 @@ aliases:
1313

1414
## tip
1515

16+
* BUGFIX: [vmoperator](https://docs.victoriametrics.com/operator/): properly set default `useVMConfigReloader` value. See [#1589](https://github.com/VictoriaMetrics/operator/issues/1589).
17+
* BUGFIX: [vmoperator](https://docs.victoriametrics.com/operator/): properly check `StatefulSet` ready status for `rollingUpdateStrategy: RollingUpdate`. See this issue [#1579](https://github.com/VictoriaMetrics/operator/issues/1579) for details.
18+
19+
## [v0.64.1](https://github.com/VictoriaMetrics/operator/releases/tag/v0.64.1)
20+
21+
**Release date:** 30 October 2025
22+
23+
* BUGFIX: [VLCluster](https://docs.victoriametrics.com/operator/resources/vlcluster/): fix `-storageNode` argument generation for vlinsert. Bug was introduced in [ff722eb](https://github.com/VictoriaMetrics/operator/commit/ff722eb3ba4e72765548b4353b5f370b42d143f7).
24+
25+
## [v0.64.0](https://github.com/VictoriaMetrics/operator/releases/tag/v0.64.0)
26+
27+
**Release date:** 29 October 2025
28+
29+
**It isn't recommended to use Operator v0.64.0 because of the bug [#1583](https://github.com/VictoriaMetrics/operator/issues/1583), which incorrectly builds args for `VLCluster` resources. Upgrade to [v0.64.1](https://docs.victoriametrics.com/operator/changelog/#v0641) instead.**
30+
1631
**Update Note 1:** This release deprecates 3rd party config-reloader containers - `jimmidyson/configmap-reload` and `quay.io/prometheus-operator/prometheus-config-reloader` in favor of own implementation -
1732
[victoriametrics/operator:config-reloader](https://github.com/VictoriaMetrics/operator/tree/master/cmd/config-reloader).
1833
This change could be reverted by providing env variable `VM_USECUSTOMCONFIGRELOADER=false` to the operator binary.

internal/config/config.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ type BaseOperatorConf struct {
109109

110110
// enables custom config reloader for vmauth and vmagent,
111111
// it should speed-up config reloading process.
112-
UseCustomConfigReloader bool `default:"true" env:"USECUSTOMCONFIGRELOADER"`
112+
UseVMConfigReloader bool `default:"true" env:"USECUSTOMCONFIGRELOADER"`
113113
// container registry name prefix, e.g. docker.io
114114
ContainerRegistry string `default:"" env:"CONTAINERREGISTRY"`
115-
CustomConfigReloaderImage string `default:"victoriametrics/operator:config-reloader-v0.62.0" env:"CUSTOMCONFIGRELOADERIMAGE"`
115+
VMConfigReloaderImage string `default:"victoriametrics/operator:config-reloader-v0.62.0" env:"CUSTOMCONFIGRELOADERIMAGE"`
116116
parsedConfigReloaderImageVersion *version.Version
117117
PSPAutoCreateEnabled bool `default:"false" env:"PSPAUTOCREATEENABLED"`
118118

@@ -581,15 +581,15 @@ func (boc *BaseOperatorConf) ResyncAfterDuration() time.Duration {
581581
return boc.ForceResyncInterval + time.Duration(p*float64(dv))
582582
}
583583

584-
// CustomConfigReloaderImageVersion returns version of custom config-reloader
585-
func (boc *BaseOperatorConf) CustomConfigReloaderImageVersion() *version.Version {
584+
// VMConfigReloaderImageVersion returns version of custom config-reloader
585+
func (boc *BaseOperatorConf) VMConfigReloaderImageVersion() *version.Version {
586586
return boc.parsedConfigReloaderImageVersion
587587
}
588588

589-
// parseAndSetCustomConfigReloadImageVersion parses custom config reloader image version and returns result
589+
// parseAndSetVMConfigReloadImageVersion parses custom config reloader image version and returns result
590590
// in case of parsing error (if tag was incorrectly set by user), returns empty version 0.0
591-
func parseAndSetCustomConfigReloadImageVersion(boc *BaseOperatorConf) error {
592-
reloaderImage := boc.CustomConfigReloaderImage
591+
func parseAndSetVMConfigReloadImageVersion(boc *BaseOperatorConf) error {
592+
reloaderImage := boc.VMConfigReloaderImage
593593
idx := strings.LastIndex(reloaderImage, ":")
594594
if idx > 0 {
595595
imageVersion := reloaderImage[idx+1:]
@@ -723,7 +723,7 @@ func MustGetBaseConfig() *BaseOperatorConf {
723723
if err := c.Validate(); err != nil {
724724
panic(err)
725725
}
726-
if err := parseAndSetCustomConfigReloadImageVersion(&c); err != nil {
726+
if err := parseAndSetVMConfigReloadImageVersion(&c); err != nil {
727727
panic(err)
728728
}
729729
opConf = &c
@@ -877,7 +877,7 @@ func ConfigAsMetrics(r metrics.RegistererGatherer, cfg *BaseOperatorConf) {
877877
strTagAsMetric("ClusterDomainName", cfgRootElems, cfg.ClusterDomainName)
878878

879879
boolTagAsMetric("EnableStrictSecurity", cfgRootElems, cfg.EnableStrictSecurity)
880-
boolTagAsMetric("UseCustomConfigReloader", cfgRootElems, cfg.UseCustomConfigReloader)
880+
boolTagAsMetric("UseVMConfigReloader", cfgRootElems, cfg.UseVMConfigReloader)
881881

882882
boolTagAsMetric("EnabledPrometheusConverterOwnerReferences", cfgRootElems, cfg.EnabledPrometheusConverterOwnerReferences)
883883
cfgPromElems := reflect.TypeOf(&cfg.EnabledPrometheusConverter).Elem()
@@ -896,7 +896,7 @@ func ConfigAsMetrics(r metrics.RegistererGatherer, cfg *BaseOperatorConf) {
896896
strTagAsMetric("AnomalyVersion", cfgRootElems, cfg.AnomalyVersion)
897897
strTagAsMetric("LogsVersion", cfgRootElems, cfg.LogsVersion)
898898
strTagAsMetric("MetricsVersion", cfgRootElems, cfg.MetricsVersion)
899-
strTagAsMetric("CustomConfigReloaderImage", cfgRootElems, cfg.CustomConfigReloaderImage)
899+
strTagAsMetric("VMConfigReloaderImage", cfgRootElems, cfg.VMConfigReloaderImage)
900900

901901
r.MustRegister(metric)
902902
}

internal/controller/operator/factory/build/container.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ func AddConfigReloadAuthKeyToReloader(container *corev1.Container, spec *vmv1bet
373373
if spec.ConfigReloadAuthKeySecret == nil {
374374
return
375375
}
376-
useVMConfigReloader := ptr.Deref(spec.UseVMConfigReloader, false)
376+
useVMConfigReloader := ptr.Deref(spec.UseVMConfigReloader, getCfg().UseVMConfigReloader)
377377
if !useVMConfigReloader {
378378
return
379379
}

internal/controller/operator/factory/build/defaults.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -583,11 +583,11 @@ func addDefaultsToCommonParams(common *vmv1beta1.CommonDefaultableParams, licens
583583
func addDefaultsToConfigReloader(common *vmv1beta1.CommonConfigReloaderParams, useDefaultResources bool, appDefaults *config.ApplicationDefaults) {
584584
c := getCfg()
585585
if common.UseVMConfigReloader == nil {
586-
common.UseVMConfigReloader = &c.UseCustomConfigReloader
586+
common.UseVMConfigReloader = &c.UseVMConfigReloader
587587
}
588588
if common.ConfigReloaderImageTag == "" {
589-
if ptr.Deref(common.UseVMConfigReloader, false) {
590-
common.ConfigReloaderImageTag = c.CustomConfigReloaderImage
589+
if *common.UseVMConfigReloader {
590+
common.ConfigReloaderImageTag = c.VMConfigReloaderImage
591591
} else {
592592
common.ConfigReloaderImageTag = appDefaults.ConfigReloadImage
593593
}

internal/controller/operator/factory/reconcile/deploy.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ func waitDeploymentReady(ctx context.Context, rclient client.Client, dep *appsv1
102102
// (https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#complete-deployment)
103103
// this function uses the deployment readiness detection algorithm from `kubectl rollout status` command
104104
// (https://github.com/kubernetes/kubectl/blob/6e4fe32a45fdcbf61e5c30ebdc511d75e7242432/pkg/polymorphichelpers/rollout_status.go#L76)
105-
if actualDeploy.Generation > actualDeploy.Status.ObservedGeneration {
105+
if actualDeploy.Generation > actualDeploy.Status.ObservedGeneration ||
106+
// special case to prevent possible race condition between updated object and local cache
107+
// See this issue https://github.com/VictoriaMetrics/operator/issues/1579
108+
dep.Generation > actualDeploy.Generation {
106109
// Waiting for deployment spec update to be observed by controller...
107110
return false, nil
108111
}

internal/controller/operator/factory/reconcile/statefulset.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ func waitForStatefulSetReady(ctx context.Context, rclient client.Client, newSts
4848
if err := rclient.Get(ctx, types.NamespacedName{Namespace: newSts.Namespace, Name: newSts.Name}, &stsForStatus); err != nil {
4949
return false, err
5050
}
51-
if stsForStatus.Generation > stsForStatus.Status.ObservedGeneration {
51+
if stsForStatus.Generation > stsForStatus.Status.ObservedGeneration ||
52+
// special case to prevent possible race condition between updated object and local cache
53+
// See this issue https://github.com/VictoriaMetrics/operator/issues/1579
54+
newSts.Generation > stsForStatus.Generation {
5255
return false, nil
5356
}
5457
if *newSts.Spec.Replicas != stsForStatus.Status.ReadyReplicas || *newSts.Spec.Replicas != stsForStatus.Status.UpdatedReplicas {

internal/controller/operator/factory/vlcluster/vlcluster_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -155,17 +155,17 @@ func TestCreateOrUpdate(t *testing.T) {
155155
Spec: vmv1.VLClusterSpec{
156156
VLInsert: &vmv1.VLInsert{
157157
CommonApplicationDeploymentParams: vmv1beta1.CommonApplicationDeploymentParams{
158-
ReplicaCount: ptr.To(int32(1)),
158+
ReplicaCount: ptr.To(int32(2)),
159159
},
160160
},
161161
VLStorage: &vmv1.VLStorage{
162162
CommonApplicationDeploymentParams: vmv1beta1.CommonApplicationDeploymentParams{
163-
ReplicaCount: ptr.To(int32(1)),
163+
ReplicaCount: ptr.To(int32(2)),
164164
},
165165
},
166166
VLSelect: &vmv1.VLSelect{
167167
CommonApplicationDeploymentParams: vmv1beta1.CommonApplicationDeploymentParams{
168-
ReplicaCount: ptr.To(int32(1)),
168+
ReplicaCount: ptr.To(int32(2)),
169169
},
170170
},
171171
},
@@ -182,15 +182,15 @@ func TestCreateOrUpdate(t *testing.T) {
182182
assert.Nil(t, rclient.Get(ctx, types.NamespacedName{Name: cr.GetVLInsertName(), Namespace: cr.Namespace}, &dep))
183183
assert.Len(t, dep.Spec.Template.Spec.Containers, 1)
184184
cnt := dep.Spec.Template.Spec.Containers[0]
185-
assert.Equal(t, cnt.Args, []string{"-httpListenAddr=:9481", "-internalselect.disable=true", "-storageNode=vlstorage-base-0.vlstorage-base.default:9491"})
185+
assert.Equal(t, cnt.Args, []string{"-httpListenAddr=:9481", "-internalselect.disable=true", "-storageNode=vlstorage-base-0.vlstorage-base.default:9491,vlstorage-base-1.vlstorage-base.default:9491"})
186186
assert.Nil(t, dep.Annotations)
187187
assert.Equal(t, dep.Labels, cr.FinalLabels(cr.VLInsertSelectorLabels()))
188188

189189
// check select
190190
assert.Nil(t, rclient.Get(ctx, types.NamespacedName{Name: cr.GetVLSelectName(), Namespace: cr.Namespace}, &dep))
191191
assert.Len(t, dep.Spec.Template.Spec.Containers, 1)
192192
cnt = dep.Spec.Template.Spec.Containers[0]
193-
assert.Equal(t, cnt.Args, []string{"-httpListenAddr=:9471", "-internalinsert.disable=true", "-storageNode=vlstorage-base-0.vlstorage-base.default:9491"})
193+
assert.Equal(t, cnt.Args, []string{"-httpListenAddr=:9471", "-internalinsert.disable=true", "-storageNode=vlstorage-base-0.vlstorage-base.default:9491,vlstorage-base-1.vlstorage-base.default:9491"})
194194
assert.Nil(t, dep.Annotations)
195195
assert.Equal(t, dep.Labels, cr.FinalLabels(cr.VLSelectSelectorLabels()))
196196

internal/controller/operator/factory/vlcluster/vlinsert.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"fmt"
66
"path"
77
"sort"
8-
"strings"
98

109
appsv1 "k8s.io/api/apps/v1"
1110
autoscalingv2 "k8s.io/api/autoscaling/v2"
@@ -138,13 +137,14 @@ func buildVLInsertPodSpec(cr *vmv1.VLCluster) (*corev1.PodTemplateSpec, error) {
138137
}
139138

140139
if cr.Spec.VLStorage != nil && cr.Spec.VLStorage.ReplicaCount != nil {
141-
storageArg := "-storageNode="
142-
for _, i := range cr.AvailableStorageNodeIDs("insert") {
140+
storageNodeFlag := build.NewFlag("-storageNode", "")
141+
storageNodeIds := cr.AvailableStorageNodeIDs("insert")
142+
for idx, i := range storageNodeIds {
143143
// TODO: introduce TLS webserver config for storage nodes
144-
storageArg += build.PodDNSAddress(cr.GetVLStorageName(), i, cr.Namespace, cr.Spec.VLStorage.Port, cr.Spec.ClusterDomainName)
144+
storageNodeFlag.Add(build.PodDNSAddress(cr.GetVLStorageName(), i, cr.Namespace, cr.Spec.VLStorage.Port, cr.Spec.ClusterDomainName), idx)
145145
}
146-
storageArg = strings.TrimSuffix(storageArg, ",")
147-
args = append(args, storageArg)
146+
totalNodes := len(storageNodeIds)
147+
args = build.AppendFlagsToArgs(args, totalNodes, storageNodeFlag)
148148
}
149149
if len(cr.Spec.VLInsert.ExtraEnvs) > 0 || len(cr.Spec.VLInsert.ExtraEnvsFrom) > 0 {
150150
args = append(args, "-envflag.enable=true")

internal/controller/operator/factory/vmagent/vmagent.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ const (
4747
kubeNodeEnvTemplate = "%{" + kubeNodeEnvName + "}"
4848
)
4949

50+
var defaultConfig = config.MustGetBaseConfig()
51+
5052
func createOrUpdateService(ctx context.Context, rclient client.Client, cr, prevCR *vmv1beta1.VMAgent) (*corev1.Service, error) {
5153

5254
var prevService, prevAdditionalService *corev1.Service
@@ -656,7 +658,7 @@ func makeSpec(cr *vmv1beta1.VMAgent, ac *build.AssetsCache) (*corev1.PodSpec, er
656658
operatorContainers = append(operatorContainers, configReloader)
657659
if !cr.Spec.IngestOnlyMode {
658660
ic = append(ic,
659-
buildInitConfigContainer(ptr.Deref(cr.Spec.UseVMConfigReloader, false), cr, configReloader.Args)...)
661+
buildInitConfigContainer(ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader), cr, configReloader.Args)...)
660662
build.AddStrictSecuritySettingsToContainers(cr.Spec.SecurityContext, ic, useStrictSecurity)
661663
}
662664
}
@@ -1115,7 +1117,7 @@ func buildRemoteWriteArgs(cr *vmv1beta1.VMAgent, ac *build.AssetsCache) ([]strin
11151117

11161118
func buildConfigReloaderContainer(cr *vmv1beta1.VMAgent, extraWatchsMounts []corev1.VolumeMount) corev1.Container {
11171119
var configReloadVolumeMounts []corev1.VolumeMount
1118-
useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
1120+
useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
11191121
if !cr.Spec.IngestOnlyMode {
11201122
configReloadVolumeMounts = append(configReloadVolumeMounts,
11211123
corev1.VolumeMount{
@@ -1185,7 +1187,7 @@ func buildConfigReloaderArgs(cr *vmv1beta1.VMAgent, extraWatchVolumes []corev1.V
11851187
args := []string{
11861188
fmt.Sprintf("--reload-url=%s", vmv1beta1.BuildReloadPathWithPort(cr.Spec.ExtraArgs, cr.Spec.Port)),
11871189
}
1188-
useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
1190+
useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
11891191

11901192
if !cr.Spec.IngestOnlyMode {
11911193
args = append(args, fmt.Sprintf("--config-envsubst-file=%s", path.Join(vmAgentConfOutDir, configEnvsubstFilename)))

internal/controller/operator/factory/vmagent/vmagent_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2175,6 +2175,9 @@ func Test_buildConfigReloaderArgs(t *testing.T) {
21752175
},
21762176
Spec: vmv1beta1.VMAgentSpec{
21772177
CommonDefaultableParams: vmv1beta1.CommonDefaultableParams{Port: "8429"},
2178+
CommonConfigReloaderParams: vmv1beta1.CommonConfigReloaderParams{
2179+
UseVMConfigReloader: ptr.To(false),
2180+
},
21782181
},
21792182
},
21802183
want: []string{
@@ -2207,6 +2210,9 @@ func Test_buildConfigReloaderArgs(t *testing.T) {
22072210
Namespace: "default",
22082211
},
22092212
Spec: vmv1beta1.VMAgentSpec{
2213+
CommonConfigReloaderParams: vmv1beta1.CommonConfigReloaderParams{
2214+
UseVMConfigReloader: ptr.To(false),
2215+
},
22102216
CommonDefaultableParams: vmv1beta1.CommonDefaultableParams{Port: "8429"},
22112217
IngestOnlyMode: false,
22122218
InlineRelabelConfig: []*vmv1beta1.RelabelConfig{{TargetLabel: "test"}},
@@ -2240,6 +2246,9 @@ func Test_buildConfigReloaderArgs(t *testing.T) {
22402246
Namespace: "default",
22412247
},
22422248
Spec: vmv1beta1.VMAgentSpec{
2249+
CommonConfigReloaderParams: vmv1beta1.CommonConfigReloaderParams{
2250+
UseVMConfigReloader: ptr.To(false),
2251+
},
22432252
CommonDefaultableParams: vmv1beta1.CommonDefaultableParams{Port: "8429"},
22442253
CommonApplicationDeploymentParams: vmv1beta1.CommonApplicationDeploymentParams{
22452254
ConfigMaps: []string{"cm-0", "cm-1"},

0 commit comments

Comments
 (0)