kubernetes-sigs / kubernetes-sigs/kustomize

Statefulset volumeClaimTemplates labels not properly merged after patch

Open
#6,000 8 comments 1 reaction 0 assignees View on GitHub
kind/bug needs-triage
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

Open the contributing 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.