Description
What happened?
I really don't understand the behavior of replacements and it looks like a bug to me.
Let me show you how to reproduce
Context: I would like in my ingress resources to add a generated secret in nginx.ingress.kubernetes.io/auth-tls-secret: mynamespace/my-genreated-secret-123ada15b3
I used Vars to do that and worked, trying to convert to replacements to stay compatible with newer Kustomize version but it gives me unexpected results.
Example 1
Resources
Ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: private-http-api-ingress
annotations:
ns: "my-ns"
nolan: "repalce-me"
nginx.ingress.kubernetes.io/auth-tls-secret: "myns/"
spec:
tls:
- hosts:
- test.com
resources:
- ingress.yaml
secretGenerator:
- name: my-generated-secret
type: Opaque
literals:
- username=myuser
- password=mysecurepassword
# E.g 1 will replace result in nolan: my-generated-secret
# Same for kustomze 4.5.7 and 5.6.0
replacements:
- source:
kind: Secret
name: my-generated-secret
version: v1
targets:
- select:
kind: Ingress
group: networking.k8s.io
version: v1
fieldPaths:
- metadata.annotations.nolan
Result
apiVersion: v1
data:
password: bXlzZWN1cmVwYXNzd29yZA==
username: bXl1c2Vy
kind: Secret
metadata:
name: my-generated-secret-h2dm9f76k2
type: Opaque
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-secret: myns/
nolan: my-generated-secret
....
=> It does not give me the generated name my-generated-secret-h2dm9f76k2
Example 2
Ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: private-http-api-ingress
annotations:
ns: "my-ns"
nolan: "repalce-me"
nginx.ingress.kubernetes.io/auth-tls-secret: "myns/"
spec:
tls:
- hosts:
- test.com
Kustomization.yaml
replacements:
- source:
kind: Secret
name: my-generated-secret
version: v1
targets:
- select:
kind: Ingress
group: networking.k8s.io
version: v1
fieldPaths:
- metadata.annotations.[nginx.ingress.kubernetes.io/auth-tls-secret]
Result
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-secret: my-generated-secret-h2dm9f76k2
nolan: repalce-me
ns: my-ns
name: private-http-api-ingress
=> It replaces to the generated name in that case but not if I use metadata.annotations.nolan
I m even more confused now
Example 3:
Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: private-http-api-ingress
annotations:
ns: "my-ns"
nolan: "repalce-me"
nginx.ingress.kubernetes.io/auth-tls-secret: "myns/"
spec:
tls:
- hosts:
- test.com
Kustomization.yaml
replacements:
- source:
kind: Secret
name: my-generated-secret
version: v1
targets:
- select:
kind: Ingress
group: networking.k8s.io
version: v1
fieldPaths:
- metadata.annotations.[nginx.ingress.kubernetes.io/auth-tls-secret]
options:
delimiter: "/" # I m adding `myns/` in the nginx annotation
index: 1
create: false
Result
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-tls-secret: myns/my-generated-secret
nolan: repalce-me
ns: my-ns
name: private-http-api-ingress
=> My adding the option it removed the hash part and put myns/my-generated-secret
What did you expect to happen?
That the generated name will be used consistently my-generated-secret-h2dm9f76k2
but instead those three examples will give 3 different outputs
Kustomize version
5.6.0 also tested with 4.5.7 giving me same results
Operating system
MacOS