kustomize: kyaml is not respecting `$patch replace|retainKeys` directives
tree:
.
├── base
│ ├── kafka.yaml
│ └── kustomization.yaml
└── overlays
├── kustomization.yaml
├── output.yaml
└── patch.yaml
base content:
# kustomization.yaml
resources:
- kafka.yaml
# kafka.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: kafka-broker01
spec:
replicas: 1
template:
spec:
containers:
- name: broker
imagePullPolicy: Always
image: kafka:cloudera-2.1.0
args: ["start", "broker"]
volumeMounts:
- name: kafka-broker01
mountPath: "/kafka/kafka-logs"
- name: jaas-config
mountPath: "/opt/jaas-config"
env:
- name: BROKER_ID
value: "0"
volumes:
- name: kafka-broker01
emptyDir: {}
- name: jaas-config
configMap:
name: jaas-config
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: kafka-broker02
spec:
replicas: 1
template:
spec:
containers:
- name: broker
imagePullPolicy: Always
image: kafka:cloudera-2.1.0
args: ["start", "broker"]
volumeMounts:
- name: kafka-broker02
mountPath: "/kafka/kafka-logs"
- name: jaas-config
mountPath: "/opt/jaas-config"
env:
- name: BROKER_ID
value: "1"
volumes:
- name: kafka-broker02
emptyDir: {}
- name: jaas-config
configMap:
name: jaas-config
overlay contents:
# kustomization.yaml
bases:
- ../base
patchesStrategicMerge:
- patch.yaml
# patch.yaml
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: kafka-broker01
spec:
template:
spec:
volumes:
- name: kafka-broker01
persistentVolumeClaim:
claimName: kafka-broker01
---
kind: Deployment
apiVersion: apps/v1
metadata:
name: kafka-broker02
spec:
template:
spec:
volumes:
- name: kafka-broker02
persistentVolumeClaim:
claimName: kafka-broker02
cd overlays && kustomize build . > output.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-broker01
spec:
replicas: 1
template:
spec:
containers:
- args:
- start
- broker
env:
- name: BROKER_ID
value: "0"
image: kafka:cloudera-2.1.0
imagePullPolicy: Always
name: broker
volumeMounts:
- mountPath: /kafka/kafka-logs
name: kafka-broker01
- mountPath: /opt/jaas-config
name: jaas-config
volumes:
- emptyDir: {} # NOTE: unexpected
name: kafka-broker01
persistentVolumeClaim:
claimName: kafka-broker01
- configMap:
name: jaas-config
name: jaas-config
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kafka-broker02
spec:
replicas: 1
template:
spec:
containers:
- args:
- start
- broker
env:
- name: BROKER_ID
value: "1"
image: kafka:cloudera-2.1.0
imagePullPolicy: Always
name: broker
volumeMounts:
- mountPath: /kafka/kafka-logs
name: kafka-broker02
- mountPath: /opt/jaas-config
name: jaas-config
volumes:
- emptyDir: {} # NOTE: unexpected
name: kafka-broker02
persistentVolumeClaim:
claimName: kafka-broker02
- configMap:
name: jaas-config
name: jaas-config
In the output both emptyDir and persistentVolumeClaim field exists.
How to change volumes from emptyDir to PVC use kustomize?
About this issue
- Original URL
- State: open
- Created 4 years ago
- Reactions: 7
- Comments: 27 (3 by maintainers)
After searching for information and testing, I found two methods:
I dug into this a bit more and I now believe the underlying problem is that the kyaml implementation of strategic merge patch does not respect the
retainKeysstrategy communicated in the openapi’sx-kubernetes-patch-strategyfield (confirmed to be in kustomize’s embedded copy). That strategy only appears two places: in volumes (here) and deployment update strategy. I confirmed the latter is affected too:Result:
Here are the PRs that implemented this in k/k for refrence: https://github.com/kubernetes/kubernetes/pull/50296 https://github.com/kubernetes/kubernetes/pull/44597
/triage accepted /area openapi /area kyaml
cc @mengqiy @natasha41575
Same I have also worked around the problem with
key: null.This is very much an issue, I was able to reproduce it in Kustomize 3.8.1
Raw Deployment:
Patch:
Unexpected output:
Which produces the following error: