Skip to content

nameSuffix improperly adds suffix to base resource deployment persistentVolumeClaim/claimName #5856

@conlon

Description

@conlon

What happened?

When building a base resource deployment and an overlay resource deployment together from a parent kustomization.yaml, persistentVolumeClaim/claimName is patched on both the base resource and the overlay resource.

Example configuration below.
I've observed this behavior on MacOS kustomize 5.4.1 and 5.6.0, and in my cluster running on Linux in kustomize-controller of flux v2.2.2 (uncertain of the kustomize version embedded there)

What did you expect to happen?

The overlay deployment should be the only resource whose persistentVolumeClaim/claimName gets patched with the nameSuffix

How can we reproduce it (as minimally and precisely as possible)?

# myapp/kustomization.yaml
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - pvc.yaml
# myapp/deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: mynamespace
  labels:
    app: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    spec:
      containers:
        - name: myapp
          image: lscr.io/linuxserver/myapp:4.7.5

          volumeMounts:
            - name: myapp-configs
              mountPath: /config

      volumes:
        - name: myapp-configs
          persistentVolumeClaim:
            claimName: myapp-configs
# myapp/pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-configs
  namespace: mynamespace
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi

# myapp-variant/kustomization.yaml
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - ../myapp

labels:
  - pairs:
      app: myapp-variant
    includeSelectors: true

nameSuffix: -variant

# parent kustomization.yaml
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - myapp
  - myapp-variant

Expected output

When built from parent kustomization.yaml

$ kustomize build .
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-configs
  namespace: mynamespace
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: longhorn
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: myapp-variant
  name: myapp-configs-variant
  namespace: mynamespace
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: longhorn
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp
  name: myapp
  namespace: mynamespace
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    spec:
      containers:
      - image: lscr.io/linuxserver/myapp:4.7.5
        name: myapp
        volumeMounts:
        - mountPath: /config
          name: myapp-configs
      volumes:
      - name: myapp-configs
        persistentVolumeClaim:
          claimName: myapp-configs               <-------- this should remain as defined in the base config
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp-variant
  name: myapp-variant
  namespace: mynamespace
spec:
  selector:
    matchLabels:
      app: myapp-variant
  template:
    metadata:
      labels:
        app: myapp-variant
    spec:
      containers:
      - image: lscr.io/linuxserver/myapp:4.7.5
        name: myapp
        volumeMounts:
        - mountPath: /config
          name: myapp-configs
      volumes:
      - name: myapp-configs
        persistentVolumeClaim:
          claimName: myapp-configs-variant

Actual output

Correct output when building each app independently:

$ kustomize build myapp
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-configs
  namespace: mynamespace
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: longhorn
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp
  name: myapp
  namespace: mynamespace
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    spec:
      containers:
      - image: lscr.io/linuxserver/myapp:4.7.5
        name: myapp
        volumeMounts:
        - mountPath: /config
          name: myapp-configs
      volumes:
      - name: myapp-configs
        persistentVolumeClaim:
          claimName: myapp-configs
$ kustomize build myapp-variant
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: myapp-variant
  name: myapp-configs-variant
  namespace: mynamespace
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: longhorn
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp-variant
  name: myapp-variant
  namespace: mynamespace
spec:
  selector:
    matchLabels:
      app: myapp-variant
  template:
    metadata:
      labels:
        app: myapp-variant
    spec:
      containers:
      - image: lscr.io/linuxserver/myapp:4.7.5
        name: myapp
        volumeMounts:
        - mountPath: /config
          name: myapp-configs
      volumes:
      - name: myapp-configs
        persistentVolumeClaim:
          claimName: myapp-configs-variant

BUT, incorrect output in one spot when building from parent kustomization.yaml

$ kustomize build .
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myapp-configs
  namespace: mynamespace
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: longhorn
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  labels:
    app: myapp-variant
  name: myapp-configs-variant
  namespace: mynamespace
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: longhorn
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp
  name: myapp
  namespace: mynamespace
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    spec:
      containers:
      - image: lscr.io/linuxserver/myapp:4.7.5
        name: myapp
        volumeMounts:
        - mountPath: /config
          name: myapp-configs
      volumes:
      - name: myapp-configs
        persistentVolumeClaim:
          claimName: myapp-configs-variant                     <-------- why is nameSuffix added here?
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: myapp-variant
  name: myapp-variant
  namespace: mynamespace
spec:
  selector:
    matchLabels:
      app: myapp-variant
  template:
    metadata:
      labels:
        app: myapp-variant
    spec:
      containers:
      - image: lscr.io/linuxserver/myapp:4.7.5
        name: myapp
        volumeMounts:
        - mountPath: /config
          name: myapp-configs
      volumes:
      - name: myapp-configs
        persistentVolumeClaim:
          claimName: myapp-configs-variant

Kustomize version

5.6.0

Operating system

MacOS

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugCategorizes issue or PR as related to a bug.lifecycle/rottenDenotes an issue or PR that has aged beyond stale and will be auto-closed.needs-triageIndicates an issue or PR lacks a `triage/foo` label and requires one.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions