kubernetes-sigs / kubernetes-sigs/kustomize
Statefulset volumeClaimTemplates labels not properly merged after patch
- Dominant language
- Go
- Stars
- 12.2k
- Forks
- 2.4k
- Avg merge
- 2d 14h
- Merged PRs (30d)
- 25
Description
### What happened?
I encountered a case were label pairs are not properly merged after applying a patch.
### What did you expect to happen?
I expected source labels pair to be still present in the volumeClaimTemplates[]/metadata/labels.
### How can we reproduce it (as minimally and precisely as possible)?
```yaml
# source/kustomization
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- sts.yaml
labels:
- pairs:
app.kubernetes.io/name: vmcluster
app.kubernetes.io/stack: victoriametrics
includeSelectors: true
includeTemplates: true
```
```yaml
# source/sts.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/component: vmstorage
name: vmstorage
spec:
template:
metadata:
labels:
app.kubernetes.io/component: vmstorage
spec:
containers:
- name: vmstorage
image: quay.io/victoriametrics/vmstorage:v1.128.0-cluster
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
app.kubernetes.io/component: vmstorage
name: vmstorage-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: gp3
volumeMode: Filesystem
```
```yaml
# kustomization
---
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- source
labels:
- pairs:
app.kubernetes.io/instance: vmcluster-internal
includeSelectors: true
includeTemplates: true
patches:
- path: patch.yaml
```
```yaml
# patch.yaml
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/component: vmstorage
name: vmstorage
spec:
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
app.kubernetes.io/component: vmstorage
name: vmstorage-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 600Gi
storageClassName: gp3
volumeMode: Filesystem
```
### Expected output
```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/component: vmstorage
app.kubernetes.io/instance: vmcluster-internal
app.kubernetes.io/name: vmcluster
app.kubernetes.io/stack: victoriametrics
name: vmstorage
spec:
...
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
app.kubernetes.io/component: vmstorage
app.kubernetes.io/instance: vmcluster-internal
app.kubernetes.io/name: vmcluster
app.kubernetes.io/stack: victoriametrics
name: vmstorage-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 600Gi
storageClassName: gp3
volumeMode: Filesystem
```
### Actual output
```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app.kubernetes.io/component: vmstorage
app.kubernetes.io/instance: vmcluster-internal
app.kubernetes.io/name: vmcluster
app.kubernetes.io/stack: victoriametrics
name: vmstorage
spec:
...
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
labels:
app.kubernetes.io/component: vmstorage
app.kubernetes.io/instance: vmcluster-internal
name: vmstorage-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 600Gi
storageClassName: gp3
volumeMode: Filesystem
```
### Kustomize version
v5.7.1
### Operating system
MacOS
Contributor guide
Research direction
Reproduce the issue with the shown source/sts.yaml, kustomization, and patch.yaml inputs using Kustomize v5.7.1, then compare the generated StatefulSet with the expected output. Trace how labels are merged on StatefulSet volumeClaimTemplates after the patch; done means both source label pairs and the outer kustomization label remain in the template metadata.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go
- Domain
- cli, tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Clearly specified
- Newbie friendliness
- 68/100