Repository: VictoriaMetrics/operator

Issue:
VMAgent stuck in reconcile loop
I just deployed my first `VMAgent` via the operator running in helm chart `0.55.3` but it seem to be stuck in a reconcile loop:

```json5
{"level":"info","ts":"2025-10-30T23:37:47Z","logger":"controller.VMAgent","msg":"object has changes with previous state, applying changes","vmagent":"victoria-metrics","namespace":"victoria-metrics"}
{"level":"info","ts":"2025-10-30T23:37:47Z","logger":"controller.VMAgent","msg":"updating Deployment vmagent-victoria-metrics configurationis_prev_equal=false,is_current_equal=false,is_prev_nil=false, prev_spec_diff={v1.DeploymentSpec}.Template.Spec.InitContainers[0].Image:-\"victoriametrics/operator:config-reloader-v0.62.0\" +\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Command:-\"nil\" +\"[/bin/sh]\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[0]:-\"--reload-url=http://localhost:8429/-/reload\" +\"-c\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[1]:-\"--config-envsubst-file=/etc/vmagent/config_out/vmagent.env.yaml\" +\"gunzip -c /etc/vmagent/config/vmagent.yaml.gz > /etc/vmagent/config_out/vmagent.env.yaml\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[?->2]:-\"--config-secret-name=victoria-metrics/vmagent-victoria-metrics\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[?->3]:-\"--config-secret-key=vmagent.yaml.gz\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[?->4]:-\"--only-init-config\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].VolumeMounts[0->?]:-\"nil\" +\"{config false <nil> /etc/vmagent/config  <nil> }\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Image:-\"victoriametrics/operator:config-reloader-v0.62.0\" +\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Command:-\"nil\" +\"[/bin/prometheus-config-reloader]\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Args[2]:-\"--config-secret-name=victoria-metrics/vmagent-victoria-metrics\" +\"--config-file=/etc/vmagent/config/vmagent.yaml.gz\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Args[?->3]:-\"--config-secret-key=vmagent.yaml.gz\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.Containers[0].VolumeMounts[1->?]:-\"nil\" +\"{config false <nil> /etc/vmagent/config  <nil> }\",{v1.DeploymentSpec}.Template.Spec.Containers[1].Image:-\"victoriametrics/vmagent:v1.128.0\" +\"victoriametrics/vmagent:v1.125.0\", curr_spec_diff={v1.DeploymentSpec}.Template.Spec.InitContainers[0].Image:-\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\" +\"victoriametrics/operator:config-reloader-v0.62.0\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[0]:-\"-c\" +\"--reload-url=http://localhost:8429/-/reload\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[1]:-\"gunzip -c /etc/vmagent/config/vmagent.yaml.gz > /etc/vmagent/config_out/vmagent.env.yaml\" +\"--config-envsubst-file=/etc/vmagent/config_out/vmagent.env.yaml\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[2->?]:-\"nil\" +\"--config-secret-name=victoria-metrics/vmagent-victoria-metrics\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[3->?]:-\"nil\" +\"--config-secret-key=vmagent.yaml.gz\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[4->?]:-\"nil\" +\"--only-init-config\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].VolumeMounts[?->0]:-\"{config false <nil> /etc/vmagent/config  <nil> }\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Image:-\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\" +\"victoriametrics/operator:config-reloader-v0.62.0\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Args[2]:-\"--config-file=/etc/vmagent/config/vmagent.yaml.gz\" +\"--config-secret-name=victoria-metrics/vmagent-victoria-metrics\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Args[3->?]:-\"nil\" +\"--config-secret-key=vmagent.yaml.gz\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Ports:-\"nil\" +\"[{reloader-http 0 8435 TCP }]\",{v1.DeploymentSpec}.Template.Spec.Containers[0].VolumeMounts[?->1]:-\"{config false <nil> /etc/vmagent/config  <nil> }\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.Containers[0].LivenessProbe:-\"nil\" +\"&Probe{ProbeHandler:ProbeHandler{Exec:nil,HTTPGet:&HTTPGetAction{Path:/health,Port:{0 8435 },Host:,Scheme:HTTP,HTTPHeaders:[]HTTPHeader{},},TCPSocket:nil,GRPC:nil,},InitialDelaySeconds:0,TimeoutSeconds:1,PeriodSeconds:10,SuccessThreshold:1,FailureThreshold:3,TerminationGracePeriodSeconds:nil,}\",{v1.DeploymentSpec}.Template.Spec.Containers[0].ReadinessProbe:-\"nil\" +\"&Probe{ProbeHandler:ProbeHandler{Exec:nil,HTTPGet:&HTTPGetAction{Path:/health,Port:{0 8435 },Host:,Scheme:HTTP,HTTPHeaders:[]HTTPHeader{},},TCPSocket:nil,GRPC:nil,},InitialDelaySeconds:5,TimeoutSeconds:1,PeriodSeconds:10,SuccessThreshold:1,FailureThreshold:3,TerminationGracePeriodSeconds:nil,}\",{v1.DeploymentSpec}.Template.Spec.Containers[1].Image:-\"victoriametrics/vmagent:v1.125.0\" +\"victoriametrics/vmagent:v1.128.0\"","vmagent":"victoria-metrics","namespace":"victoria-metrics"}
{"level":"info","ts":"2025-10-30T23:37:47Z","logger":"controller.VMAgent","msg":"object was successfully reconciled","vmagent":"victoria-metrics","namespace":"victoria-metrics"}
```

The `VMAgent` in question:

```yaml
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMAgent
metadata:
  name: victoria-metrics
spec:
  port: "8429"

  remoteWrite:
  - url: http://vmsingle-victoria-metrics:8428/api/v1/write

```

The operator is deployed via argocd and kustomize
```yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: victoria-metrics

helmCharts:
  - name: victoria-metrics-operator
    releaseName: victoria-metrics-operator
    repo: https://victoriametrics.github.io/helm-charts
    version: 0.55.3
    includeCRDs: true
    namespace: victoria-metrics
    valuesInline:
      global:
        cluster:
          dnsDomain: cluster.localdomain
      admissionWebhooks:
        enabled: true
        certManager:
          enabled: true
      podSecurityContext:
        runAsNonRoot: true
        runAsUser: 1022
        runAsGroup: 1022
        fsGroup: 1022
```

This is the first time i'm deploying a VMAgent so i've not had one running before the change in `0.64.0` to the custom config reloader.

Hints from issue comments:
@micke: Rolling back to helm chart `0.54.1` and operator version `0.63.0` stops the reconcile loop at least.@AndrewChubatiuk: fixed in operator 0.65.0 and in helm chart 0.55.0@micke: @AndrewChubatiuk Thanks, but unfortunately I'm still seeing the same issue with 0.65.0 and helm chart 0.55.0:

```json5
{"level":"info","ts":"2025-10-31T21:48:25Z","logger":"controller.VMAgent","msg":"object has changes with previous state, applying changes","vmagent":"victoria-metrics","namespace":"victoria-metrics"}
{"level":"info","ts":"2025-10-31T21:48:25Z","logger":"controller.VMAgent","msg":"updating Deployment vmagent-victoria-metrics configurationis_prev_equal=false,is_current_equal=false,is_prev_nil=false, prev_spec_diff={v1.DeploymentSpec}.Template.Spec.InitContainers[0].Image:-\"victoriametrics/operator:config-reloader-v0.62.0\" +\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Image:-\"victoriametrics/operator:config-reloader-v0.62.0\" +\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\",{v1.DeploymentSpec}.Template.Spec.Containers[1].Image:-\"victoriametrics/vmagent:v1.128.0\" +\"victoriametrics/vmagent:v1.125.0\", curr_spec_diff={v1.DeploymentSpec}.Template.Spec.InitContainers[0].Image:-\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\" +\"victoriametrics/operator:config-reloader-v0.62.0\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[0]:-\"-c\" +\"--reload-url=http://localhost:8429/-/reload\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[1]:-\"gunzip -c /etc/vmagent/config/vmagent.yaml.gz > /etc/vmagent/config_out/vmagent.env.yaml\" +\"--config-envsubst-file=/etc/vmagent/config_out/vmagent.env.yaml\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[2->?]:-\"nil\" +\"--config-secret-name=victoria-metrics/vmagent-victoria-metrics\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[3->?]:-\"nil\" +\"--config-secret-key=vmagent.yaml.gz\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].Args[4->?]:-\"nil\" +\"--only-init-config\",{v1.DeploymentSpec}.Template.Spec.InitContainers[0].VolumeMounts[?->0]:-\"{config false <nil> /etc/vmagent/config  <nil> }\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Image:-\"quay.io/prometheus-operator/prometheus-config-reloader:v0.82.1\" +\"victoriametrics/operator:config-reloader-v0.62.0\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Args[2]:-\"--config-file=/etc/vmagent/config/vmagent.yaml.gz\" +\"--config-secret-name=victoria-metrics/vmagent-victoria-metrics\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Args[3->?]:-\"nil\" +\"--config-secret-key=vmagent.yaml.gz\",{v1.DeploymentSpec}.Template.Spec.Containers[0].Ports:-\"nil\" +\"[{reloader-http 0 8435 TCP }]\",{v1.DeploymentSpec}.Template.Spec.Containers[0].VolumeMounts[?->1]:-\"{config false <nil> /etc/vmagent/config  <nil> }\" +\"nil\",{v1.DeploymentSpec}.Template.Spec.Containers[0].LivenessProbe:-\"nil\" +\"&Probe{ProbeHandler:ProbeHandler{Exec:nil,HTTPGet:&HTTPGetAction{Path:/health,Port:{0 8435 },Host:,Scheme:HTTP,HTTPHeaders:[]HTTPHeader{},},TCPSocket:nil,GRPC:nil,},InitialDelaySeconds:0,TimeoutSeconds:1,PeriodSeconds:10,SuccessThreshold:1,FailureThreshold:3,TerminationGracePeriodSeconds:nil,}\",{v1.DeploymentSpec}.Template.Spec.Containers[0].ReadinessProbe:-\"nil\" +\"&Probe{ProbeHandler:ProbeHandler{Exec:nil,HTTPGet:&HTTPGetAction{Path:/health,Port:{0 8435 },Host:,Scheme:HTTP,HTTPHeaders:[]HTTPHeader{},},TCPSocket:nil,GRPC:nil,},InitialDelaySeconds:5,TimeoutSeconds:1,PeriodSeconds:10,SuccessThreshold:1,FailureThreshold:3,TerminationGracePeriodSeconds:nil,}\",{v1.DeploymentSpec}.Template.Spec.Containers[1].Image:-\"victoriametrics/vmagent:v1.125.0\" +\"victoriametrics/vmagent:v1.128.0\"","vmagent":"victoria-metrics","namespace":"victoria-metrics"}
{"level":"info","ts":"2025-10-31T21:48:28Z","logger":"controller.VMAgent","msg":"object was successfully reconciled","vmagent":"victoria-metrics","namespace":"victoria-metrics"}
```@micke: Well now i feel stupid, i apparently had another operator deployed that had not been cleaned up by argocd...

Sorry for the noise, it works great now...

Solution patch:
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index ed9028b8..e0dbb541 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -13,18 +13,20 @@ aliases:
 
 ## tip
 
+* BUGFIX: [vmoperator](https://docs.victoriametrics.com/operator/): properly set default `useVMConfigReloader` value. See [#1589](https://github.com/VictoriaMetrics/operator/issues/1589).
+* 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.
+
 ## [v0.64.1](https://github.com/VictoriaMetrics/operator/releases/tag/v0.64.1)
 
 **Release date:** 30 October 2025
 
-* 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.
 * 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).
 
 ## [v0.64.0](https://github.com/VictoriaMetrics/operator/releases/tag/v0.64.0)
 
 **Release date:** 29 October 2025
 
-**It isn't recommended to use Operator  v0.64.1 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.**
+**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.**
 
 **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 - 
 [victoriametrics/operator:config-reloader](https://github.com/VictoriaMetrics/operator/tree/master/cmd/config-reloader).
diff --git a/internal/config/config.go b/internal/config/config.go
index ab680064..8a8ee88a 100644
--- a/internal/config/config.go
+++ b/internal/config/config.go
@@ -109,10 +109,10 @@ type BaseOperatorConf struct {
 
 	// enables custom config reloader for vmauth and vmagent,
 	// it should speed-up config reloading process.
-	UseCustomConfigReloader bool `default:"true" env:"USECUSTOMCONFIGRELOADER"`
+	UseVMConfigReloader bool `default:"true" env:"USECUSTOMCONFIGRELOADER"`
 	// container registry name prefix, e.g. docker.io
 	ContainerRegistry                string `default:"" env:"CONTAINERREGISTRY"`
-	CustomConfigReloaderImage        string `default:"victoriametrics/operator:config-reloader-v0.62.0" env:"CUSTOMCONFIGRELOADERIMAGE"`
+	VMConfigReloaderImage            string `default:"victoriametrics/operator:config-reloader-v0.62.0" env:"CUSTOMCONFIGRELOADERIMAGE"`
 	parsedConfigReloaderImageVersion *version.Version
 	PSPAutoCreateEnabled             bool `default:"false" env:"PSPAUTOCREATEENABLED"`
 
@@ -581,15 +581,15 @@ func (boc *BaseOperatorConf) ResyncAfterDuration() time.Duration {
 	return boc.ForceResyncInterval + time.Duration(p*float64(dv))
 }
 
-// CustomConfigReloaderImageVersion returns version of custom config-reloader
-func (boc *BaseOperatorConf) CustomConfigReloaderImageVersion() *version.Version {
+// VMConfigReloaderImageVersion returns version of custom config-reloader
+func (boc *BaseOperatorConf) VMConfigReloaderImageVersion() *version.Version {
 	return boc.parsedConfigReloaderImageVersion
 }
 
-// parseAndSetCustomConfigReloadImageVersion parses custom config reloader image version and returns result
+// parseAndSetVMConfigReloadImageVersion parses custom config reloader image version and returns result
 // in case of parsing error (if tag was incorrectly set by user), returns empty version 0.0
-func parseAndSetCustomConfigReloadImageVersion(boc *BaseOperatorConf) error {
-	reloaderImage := boc.CustomConfigReloaderImage
+func parseAndSetVMConfigReloadImageVersion(boc *BaseOperatorConf) error {
+	reloaderImage := boc.VMConfigReloaderImage
 	idx := strings.LastIndex(reloaderImage, ":")
 	if idx > 0 {
 		imageVersion := reloaderImage[idx+1:]
@@ -723,7 +723,7 @@ func MustGetBaseConfig() *BaseOperatorConf {
 		if err := c.Validate(); err != nil {
 			panic(err)
 		}
-		if err := parseAndSetCustomConfigReloadImageVersion(&c); err != nil {
+		if err := parseAndSetVMConfigReloadImageVersion(&c); err != nil {
 			panic(err)
 		}
 		opConf = &c
@@ -877,7 +877,7 @@ func ConfigAsMetrics(r metrics.RegistererGatherer, cfg *BaseOperatorConf) {
 	strTagAsMetric("ClusterDomainName", cfgRootElems, cfg.ClusterDomainName)
 
 	boolTagAsMetric("EnableStrictSecurity", cfgRootElems, cfg.EnableStrictSecurity)
-	boolTagAsMetric("UseCustomConfigReloader", cfgRootElems, cfg.UseCustomConfigReloader)
+	boolTagAsMetric("UseVMConfigReloader", cfgRootElems, cfg.UseVMConfigReloader)
 
 	boolTagAsMetric("EnabledPrometheusConverterOwnerReferences", cfgRootElems, cfg.EnabledPrometheusConverterOwnerReferences)
 	cfgPromElems := reflect.TypeOf(&cfg.EnabledPrometheusConverter).Elem()
@@ -896,7 +896,7 @@ func ConfigAsMetrics(r metrics.RegistererGatherer, cfg *BaseOperatorConf) {
 	strTagAsMetric("AnomalyVersion", cfgRootElems, cfg.AnomalyVersion)
 	strTagAsMetric("LogsVersion", cfgRootElems, cfg.LogsVersion)
 	strTagAsMetric("MetricsVersion", cfgRootElems, cfg.MetricsVersion)
-	strTagAsMetric("CustomConfigReloaderImage", cfgRootElems, cfg.CustomConfigReloaderImage)
+	strTagAsMetric("VMConfigReloaderImage", cfgRootElems, cfg.VMConfigReloaderImage)
 
 	r.MustRegister(metric)
 }
diff --git a/internal/controller/operator/factory/build/container.go b/internal/controller/operator/factory/build/container.go
index 66f289b0..edc7e4da 100644
--- a/internal/controller/operator/factory/build/container.go
+++ b/internal/controller/operator/factory/build/container.go
@@ -373,7 +373,7 @@ func AddConfigReloadAuthKeyToReloader(container *corev1.Container, spec *vmv1bet
 	if spec.ConfigReloadAuthKeySecret == nil {
 		return
 	}
-	useVMConfigReloader := ptr.Deref(spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(spec.UseVMConfigReloader, getCfg().UseVMConfigReloader)
 	if !useVMConfigReloader {
 		return
 	}
diff --git a/internal/controller/operator/factory/build/defaults.go b/internal/controller/operator/factory/build/defaults.go
index ffd4b4ef..ae93aa01 100644
--- a/internal/controller/operator/factory/build/defaults.go
+++ b/internal/controller/operator/factory/build/defaults.go
@@ -583,11 +583,11 @@ func addDefaultsToCommonParams(common *vmv1beta1.CommonDefaultableParams, licens
 func addDefaultsToConfigReloader(common *vmv1beta1.CommonConfigReloaderParams, useDefaultResources bool, appDefaults *config.ApplicationDefaults) {
 	c := getCfg()
 	if common.UseVMConfigReloader == nil {
-		common.UseVMConfigReloader = &c.UseCustomConfigReloader
+		common.UseVMConfigReloader = &c.UseVMConfigReloader
 	}
 	if common.ConfigReloaderImageTag == "" {
-		if ptr.Deref(common.UseVMConfigReloader, false) {
-			common.ConfigReloaderImageTag = c.CustomConfigReloaderImage
+		if *common.UseVMConfigReloader {
+			common.ConfigReloaderImageTag = c.VMConfigReloaderImage
 		} else {
 			common.ConfigReloaderImageTag = appDefaults.ConfigReloadImage
 		}
diff --git a/internal/controller/operator/factory/vmagent/vmagent.go b/internal/controller/operator/factory/vmagent/vmagent.go
index df3e81b2..4176156e 100644
--- a/internal/controller/operator/factory/vmagent/vmagent.go
+++ b/internal/controller/operator/factory/vmagent/vmagent.go
@@ -52,6 +52,8 @@ const (
 // To save compatibility in the single-shard version still need to fill in %SHARD_NUM% placeholder
 var defaultPlaceholders = map[string]string{shardNumPlaceholder: "0"}
 
+var defaultConfig = config.MustGetBaseConfig()
+
 func createOrUpdateService(ctx context.Context, rclient client.Client, cr, prevCR *vmv1beta1.VMAgent) (*corev1.Service, error) {
 
 	var prevService, prevAdditionalService *corev1.Service
@@ -756,7 +758,7 @@ func makeSpec(cr *vmv1beta1.VMAgent, ac *build.AssetsCache) (*corev1.PodSpec, er
 		operatorContainers = append(operatorContainers, configReloader)
 		if !cr.Spec.IngestOnlyMode {
 			ic = append(ic,
-				buildInitConfigContainer(ptr.Deref(cr.Spec.UseVMConfigReloader, false), cr, configReloader.Args)...)
+				buildInitConfigContainer(ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader), cr, configReloader.Args)...)
 			build.AddStrictSecuritySettingsToContainers(cr.Spec.SecurityContext, ic, useStrictSecurity)
 		}
 	}
@@ -1227,7 +1229,7 @@ func buildRemoteWriteArgs(cr *vmv1beta1.VMAgent, ac *build.AssetsCache) ([]strin
 
 func buildConfigReloaderContainer(cr *vmv1beta1.VMAgent, extraWatchsMounts []corev1.VolumeMount) corev1.Container {
 	var configReloadVolumeMounts []corev1.VolumeMount
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 	if !cr.Spec.IngestOnlyMode {
 		configReloadVolumeMounts = append(configReloadVolumeMounts,
 			corev1.VolumeMount{
@@ -1297,7 +1299,7 @@ func buildConfigReloaderArgs(cr *vmv1beta1.VMAgent, extraWatchVolumes []corev1.V
 	args := []string{
 		fmt.Sprintf("--reload-url=%s", vmv1beta1.BuildReloadPathWithPort(cr.Spec.ExtraArgs, cr.Spec.Port)),
 	}
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 
 	if !cr.Spec.IngestOnlyMode {
 		args = append(args, fmt.Sprintf("--config-envsubst-file=%s", path.Join(vmAgentConfOutDir, configEnvsubstFilename)))
diff --git a/internal/controller/operator/factory/vmalert/vmalert.go b/internal/controller/operator/factory/vmalert/vmalert.go
index c978a10c..a36cc7cf 100644
--- a/internal/controller/operator/factory/vmalert/vmalert.go
+++ b/internal/controller/operator/factory/vmalert/vmalert.go
@@ -34,6 +34,8 @@ const (
 	tlsAssetsDir            = "/etc/vmalert-tls/certs"
 )
 
+var defaultConfig = config.MustGetBaseConfig()
+
 // createOrUpdateService creates service for vmalert
 func createOrUpdateService(ctx context.Context, rclient client.Client, cr, prevCR *vmv1beta1.VMAlert) (*corev1.Service, error) {
 
@@ -655,7 +657,7 @@ func buildNotifiersArgs(cr *vmv1beta1.VMAlert, ac *build.AssetsCache) ([]string,
 func buildConfigReloaderContainer(cr *vmv1beta1.VMAlert, ruleConfigMapNames []string, extraWatchVolumeMounts []corev1.VolumeMount) corev1.Container {
 	volumeWatchArg := "-volume-dir"
 	reloadURLArg := "-webhook-url"
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 	if useVMConfigReloader {
 		volumeWatchArg = "--watched-dir"
 		reloadURLArg = "--reload-url"
diff --git a/internal/controller/operator/factory/vmalertmanager/alertmanager.go b/internal/controller/operator/factory/vmalertmanager/alertmanager.go
index c72dd168..23c377ae 100644
--- a/internal/controller/operator/factory/vmalertmanager/alertmanager.go
+++ b/internal/controller/operator/factory/vmalertmanager/alertmanager.go
@@ -51,7 +51,7 @@ func CreateOrUpdateAlertManager(ctx context.Context, cr *vmv1beta1.VMAlertmanage
 		if err := reconcile.ServiceAccount(ctx, rclient, build.ServiceAccount(cr), prevSA); err != nil {
 			return fmt.Errorf("failed create service account: %w", err)
 		}
-		if ptr.Deref(cr.Spec.UseVMConfigReloader, false) {
+		if ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader) {
 			if err := createConfigSecretAccess(ctx, rclient, cr, prevCR); err != nil {
 				return err
 			}
diff --git a/internal/controller/operator/factory/vmalertmanager/statefulset.go b/internal/controller/operator/factory/vmalertmanager/statefulset.go
index 25a01898..a49df185 100644
--- a/internal/controller/operator/factory/vmalertmanager/statefulset.go
+++ b/internal/controller/operator/factory/vmalertmanager/statefulset.go
@@ -20,6 +20,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	vmv1beta1 "github.com/VictoriaMetrics/operator/api/operator/v1beta1"
+	"github.com/VictoriaMetrics/operator/internal/config"
 	"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/build"
 	"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/k8stools"
 	"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/logger"
@@ -47,6 +48,8 @@ receivers:
 `
 )
 
+var defaultConfig = config.MustGetBaseConfig()
+
 func newStsForAlertManager(cr *vmv1beta1.VMAlertmanager) (*appsv1.StatefulSet, error) {
 	if cr.Spec.Retention == "" {
 		cr.Spec.Retention = defaultRetention
@@ -151,7 +154,7 @@ func createOrUpdateAlertManagerService(ctx context.Context, rclient client.Clien
 
 func makeStatefulSetSpec(cr *vmv1beta1.VMAlertmanager) (*appsv1.StatefulSetSpec, error) {
 
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 	image := fmt.Sprintf("%s:%s", cr.Spec.Image.Repository, cr.Spec.Image.Tag)
 
 	amArgs := []string{
@@ -597,7 +600,7 @@ func buildConfigSecretMeta(cr *vmv1beta1.VMAlertmanager) *metav1.ObjectMeta {
 }
 
 func buildInitConfigContainer(cr *vmv1beta1.VMAlertmanager) []corev1.Container {
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 	if !useVMConfigReloader {
 		return nil
 	}
@@ -634,7 +637,7 @@ func buildVMAlertmanagerConfigReloader(cr *vmv1beta1.VMAlertmanager, crVolumeMou
 	if cr.Spec.WebConfig != nil && cr.Spec.WebConfig.TLSServerConfig != nil {
 		localReloadURL.Scheme = "https"
 	}
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 
 	var args []string
 	if useVMConfigReloader {
diff --git a/internal/controller/operator/factory/vmauth/vmauth.go b/internal/controller/operator/factory/vmauth/vmauth.go
index 652a7e13..eafbbe63 100644
--- a/internal/controller/operator/factory/vmauth/vmauth.go
+++ b/internal/controller/operator/factory/vmauth/vmauth.go
@@ -22,6 +22,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	vmv1beta1 "github.com/VictoriaMetrics/operator/api/operator/v1beta1"
+	"github.com/VictoriaMetrics/operator/internal/config"
 	"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/build"
 	"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/finalize"
 	"github.com/VictoriaMetrics/operator/internal/controller/operator/factory/k8stools"
@@ -39,6 +40,8 @@ const (
 	internalPortName      = "internal"
 )
 
+var defaultConfig = config.MustGetBaseConfig()
+
 // CreateOrUpdate - handles VMAuth deployment reconciliation.
 func CreateOrUpdate(ctx context.Context, cr *vmv1beta1.VMAuth, rclient client.Client) error {
 
@@ -55,7 +58,7 @@ func CreateOrUpdate(ctx context.Context, cr *vmv1beta1.VMAuth, rclient client.Cl
 		if err := reconcile.ServiceAccount(ctx, rclient, build.ServiceAccount(cr), prevSA); err != nil {
 			return fmt.Errorf("failed create service account: %w", err)
 		}
-		if ptr.Deref(cr.Spec.UseVMConfigReloader, false) {
+		if ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader) {
 			if err := createVMAuthSecretAccess(ctx, rclient, cr, prevCR); err != nil {
 				return err
 			}
@@ -188,7 +191,7 @@ func makeSpecForVMAuth(cr *vmv1beta1.VMAuth) (*corev1.PodTemplateSpec, error) {
 	}
 
 	useStrictSecurity := ptr.Deref(cr.Spec.UseStrictSecurity, false)
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 
 	var volumes []corev1.Volume
 	var volumeMounts []corev1.VolumeMount
@@ -531,7 +534,7 @@ func buildConfigReloaderContainer(cr *vmv1beta1.VMAuth) corev1.Container {
 		fmt.Sprintf("--reload-url=%s", vmv1beta1.BuildReloadPathWithPort(cr.Spec.ExtraArgs, port)),
 		fmt.Sprintf("--config-envsubst-file=%s", path.Join(vmAuthConfigFolder, vmAuthConfigName)),
 	}
-	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, false)
+	useVMConfigReloader := ptr.Deref(cr.Spec.UseVMConfigReloader, defaultConfig.UseVMConfigReloader)
 	if useVMConfigReloader {
 		args = append(args, fmt.Sprintf("--config-secret-name=%s/%s", cr.Namespace, cr.ConfigSecretName()))
 		if len(cr.Spec.InternalListenPort) == 0 && useProxyProtocol(cr) {



Test patch:
diff --git a/internal/controller/operator/factory/vmagent/vmagent_test.go b/internal/controller/operator/factory/vmagent/vmagent_test.go
index 2c58fc86..2d88b5c0 100644
--- a/internal/controller/operator/factory/vmagent/vmagent_test.go
+++ b/internal/controller/operator/factory/vmagent/vmagent_test.go
@@ -2175,6 +2175,9 @@ func Test_buildConfigReloaderArgs(t *testing.T) {
 				},
 				Spec: vmv1beta1.VMAgentSpec{
 					CommonDefaultableParams: vmv1beta1.CommonDefaultableParams{Port: "8429"},
+					CommonConfigReloaderParams: vmv1beta1.CommonConfigReloaderParams{
+						UseVMConfigReloader: ptr.To(false),
+					},
 				},
 			},
 			want: []string{
@@ -2207,6 +2210,9 @@ func Test_buildConfigReloaderArgs(t *testing.T) {
 					Namespace: "default",
 				},
 				Spec: vmv1beta1.VMAgentSpec{
+					CommonConfigReloaderParams: vmv1beta1.CommonConfigReloaderParams{
+						UseVMConfigReloader: ptr.To(false),
+					},
 					CommonDefaultableParams: vmv1beta1.CommonDefaultableParams{Port: "8429"},
 					IngestOnlyMode:          false,
 					InlineRelabelConfig:     []*vmv1beta1.RelabelConfig{{TargetLabel: "test"}},
@@ -2240,6 +2246,9 @@ func Test_buildConfigReloaderArgs(t *testing.T) {
 					Namespace: "default",
 				},
 				Spec: vmv1beta1.VMAgentSpec{
+					CommonConfigReloaderParams: vmv1beta1.CommonConfigReloaderParams{
+						UseVMConfigReloader: ptr.To(false),
+					},
 					CommonDefaultableParams: vmv1beta1.CommonDefaultableParams{Port: "8429"},
 					CommonApplicationDeploymentParams: vmv1beta1.CommonApplicationDeploymentParams{
 						ConfigMaps: []string{"cm-0", "cm-1"},
diff --git a/internal/controller/operator/factory/vmalert/vmalert_test.go b/internal/controller/operator/factory/vmalert/vmalert_test.go
index 327b0bdf..d11a10e8 100644
--- a/internal/controller/operator/factory/vmalert/vmalert_test.go
+++ b/internal/controller/operator/factory/vmalert/vmalert_test.go
@@ -853,6 +853,11 @@ func TestBuildConfigReloaderContainer(t *testing.T) {
 			Namespace: "default",
 			Name:      "base",
 		},
+		Spec: vmv1beta1.VMAlertSpec{
+			CommonConfigReloaderParams: vmv1beta1.CommonConfigReloaderParams{
+				UseVMConfigReloader: ptr.To(false),
+			},
+		},
 	}
 	cmNames := []string{"cm-0", "cm-1"}
 	expected := corev1.Container{
diff --git a/internal/controller/operator/factory/vmauth/vmauth_test.go b/internal/controller/operator/factory/vmauth/vmauth_test.go
index cf098f86..c8974dbf 100644
--- a/internal/controller/operator/factory/vmauth/vmauth_test.go
+++ b/internal/controller/operator/factory/vmauth/vmauth_test.go
@@ -129,7 +129,7 @@ func TestCreateOrUpdate(t *testing.T) {
 					},
 				},
 				c: mutateConf(func(c *config.BaseOperatorConf) {
-					c.UseCustomConfigReloader = true
+					c.UseVMConfigReloader = true
 				}),
 			},
 			predefinedObjects: []runtime.Object{