VictoriaMetrics / VictoriaMetrics/operator
config-reloader ContainerPort ignores configReloaderExtraArgs http.listenAddr (hostNetwork port conflict)
Nobody has claimed this yet.
- Dominant language
- Go
- Stars
- 589
- Forks
- 229
- Avg merge
- 1d 9h
- Merged PRs (30d)
- 77
Description
Summary
The operator always sets containerPort to the constant 8435 (ConfigReloaderDefaultPort in internal/controller/operator/factory/build/container.go) when building the config-reloader sidecar. Changing the process listen address with spec.configReloaderExtraArgs["http.listenAddr"] updates container args only. Neither containerPort nor the generated HTTP liveness/readiness probes respect the overridden port — both stay locked to 8435, so the kube-scheduler still sees a host port conflict even when the process listens elsewhere.
On nodes with hostNetwork: true, that blocks scheduling a second DaemonSet that also needs a config-reloader: Kubernetes reports that the node did not have free ports for the requested pod ports (didn't have free ports…), even when one process listens on 8435 and another on 8436 via http.listenAddr.
CommonConfigReloaderParams is shared across VMAgent, VMAuth, VMSingle, VMAlertmanager, and VMAlert. The bug lives in the common builder build.ConfigReloaderContainer and affects any component that uses configReloaderExtraArgs to change the listen address.
Environment
- Operator: v0.74.0 (also reproduced in source of v0.74.1, v0.75.0-rc1, and current
masteras of 2026-09-04) - Resources: two
VMAgentDaemonSets withhostNetwork: trueon the same node - Sidecar: default VictoriaMetrics config-reloader
Steps to reproduce
- Deploy two
VMAgentCRs as DaemonSets withhostNetwork: true(and otherwise valid scrape config). - On the second agent, override the reloader listen port, for example:
spec:
hostNetwork: true
configReloaderExtraArgs:
http.listenAddr: "127.0.0.1:8436"
- Observe PodSpec of the second DaemonSet:
config-reloaderstill hascontainerPort: 8435and probes targeting8435, while args include--http.listenAddr=127.0.0.1:8436. - Scheduler fails to place the second pod on a node that already runs the first agent’s reloader on host port 8435.
Expected
ContainerPort and HTTP probe ports for config-reloader should follow the port from configReloaderExtraArgs["http.listenAddr"] when set (with fallback to 8435).
Actual
Process listens on the overridden address (127.0.0.1:8436). PodSpec still declares containerPort: 8435 and probes 8435. Scheduler rejects the pod on a node that already exposes host port 8435 for another agent’s reloader.
Proposed fix
- Parse the port from
ConfigReloaderExtraArgs["http.listenAddr"](support:PORT,IP:PORT,[IPv6]:PORT). - Use that port for
ContainerPortand liveness/readiness probes inaddPortProbesToConfigReloaderContainer(default8435if unset/invalid). - Align scrape endpoint builders that hardcode
8435if they scrape the sidecar by numeric port. - Update
configReloaderMetricsURLininternal/controller/operator/factory/reconcile/config_reload.go, which also hardcodesbuild.ConfigReloaderDefaultPort(8435). Controllers that callWaitForConfigReloadHash(e.g.VMAuth) poll/metricson that URL; when the sidecar listen port is overridden, they keep polling8435and eventually time out.configReloaderMetricsURLshould resolve the configured port the same way asContainerPortand probes. - Add unit tests in
container_test.gofor default, overridden, IPv6, and invalid values.
Related
- VictoriaMetrics/operator#1581 — IPv6 /
enableTCP6/http.listenAddrinteraction (different symptom; related listen-address handling). - VictoriaMetrics/operator#1308 — hardcoded config-reloader probes with proxy-protocol (probe port behavior; not hostNetwork /
ContainerPortscheduling).
Related code
internal/controller/operator/factory/build/container.go:ConfigReloaderDefaultPort,ConfigReloaderContainer,addPortProbesToConfigReloaderContainer
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start in internal/controller/operator/factory/build/container.go by reading ConfigReloaderContainer, addPortProbesToConfigReloaderContainer, and ConfigReloaderDefaultPort, then inspect internal/controller/operator/factory/reconcile/config_reload.go for configReloaderMetricsURL. Add the requested cases to container_test.go and verify that container ports, probes, and metrics polling use the configured port with the documented fallback and address forms.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go, kubernetes
- Domain
- devops, infrastructure, testing
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Clearly specified
- Newbie friendliness
- 72/100