Skip to content

VMAgent DaemonSetMode: volumes/volumeMounts not working properly #1677

@lexfrei

Description

@lexfrei

Describe the bug

Multiple issues with volume configuration in daemonSetMode:

  1. extraVolumes/extraVolumeMounts fields are ignored - CRD accepts them (due to x-kubernetes-preserve-unknown-fields), but operator code reads cr.Spec.Volumes, not cr.Spec.ExtraVolumes

  2. volumes field doesn't override default - operator always creates persistent-queue-data as emptyDir first, user volumes are appended but don't replace it

  3. volumeMounts field is not applied to DaemonSet containers

Documentation states:

Volume for the persistent-queue could be mounted with volumes and must have either hostPath or emptyDir.

None of these work as documented.

To Reproduce

apiVersion: operator.victoriametrics.com/v1beta1
kind: VMAgent
metadata:
  name: vmagent
  namespace: monitoring
spec:
  daemonSetMode: true
  selectAllByDefault: true
  remoteWrite:
    - url: http://vmsingle.monitoring.svc:8428/api/v1/write
  extraArgs:
    remoteWrite.tmpDataPath: /vmagent-wal
  volumes:
    - name: vmagent-wal-host
      hostPath:
        path: /var/lib/vmagent-wal
        type: DirectoryOrCreate
  volumeMounts:
    - name: vmagent-wal-host
      mountPath: /vmagent-wal

Result:

  • Volume vmagent-wal-host IS added to DaemonSet
  • VolumeMount is NOT added to container
  • persistent-queue-data remains emptyDir
# Volumes - vmagent-wal-host present, but persistent-queue-data still emptyDir
kubectl get ds -n monitoring vmagent-vmagent -o jsonpath='{.spec.template.spec.volumes}' | jq .

# VolumeMounts - only config-out, user volumeMounts missing
kubectl get ds -n monitoring vmagent-vmagent -o jsonpath='{.spec.template.spec.containers[0].volumeMounts}' | jq .

Root cause analysis

Issue 1: extraVolumes ignored

Code in vmagent.go line 549:

volumes = append(volumes, cr.Spec.Volumes...)

Uses Volumes, not ExtraVolumes.

Issue 2: volumes don't override default

Code in vmagent.go around line 545:

if !cr.Spec.StatefulMode {
    volumes = append(volumes, corev1.Volume{
        Name: vmAgentPersistentQueueMountName,
        VolumeSource: corev1.VolumeSource{EmptyDir: &corev1.EmptyDirVolumeSource{}},
    })
}
volumes = append(volumes, cr.Spec.Volumes...)

Default emptyDir created first, user volumes appended (no override).

Issue 3: volumeMounts not applied

Code in vmagent.go line 536:

agentVolumeMounts = append(agentVolumeMounts, cr.Spec.VolumeMounts...)

VolumeMounts are added to agentVolumeMounts, but somewhere between newPodSpec() and final DaemonSet creation they are lost.

Environment

  • Operator version: v0.66.1
  • Kubernetes: v1.34.2+k3s1

Related

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions