Skip to content

Inconsistent behavior for replacements directive #5899

Open
@emirot

Description

@emirot

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    kind/bugCategorizes issue or PR as related to a bug.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