Josiah
Josiah

Reputation: 2866

Exclude Resource in kustomization.yaml

I have a kustomize base that I'd like to re-use without editing it. Unfortunately, it creates a namespace I don't want to create. I'd like to simply remove that resource from consideration when compiling the manifests and add a resource for mine since I can't patch a namespace to change the name.

Can this be done? How?

Upvotes: 43

Views: 52042

Answers (4)

CommonSenseCode
CommonSenseCode

Reputation: 25369

Easy use $patch: delete

  1. Imagine this is your base resource:
kind: Secret
metadata:
  name: foobar
# more config not important...
  1. Now in matching overlay resource just add $patch: delete:
kind: Secret
metadata:
  name: foobar
$patch: delete # This will let kustomize know to not include it in overlay

Upvotes: 2

Toshinori Sugita
Toshinori Sugita

Reputation: 1974

You can omit the specific resource by using a delete directive of Strategic Merge Patch like this.

Folder structure

$ tree .
.
├── base
│   ├── kustomization.yaml
│   └── namespace.yaml
└── overlays
    ├── dev
    │   └── kustomization.yaml
    └── prod
        ├── delete-ns-b.yaml
        └── kustomization.yaml

File content

$ cat base/kustomization.yaml
resources:
  - namespace.yaml

$  cat base/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: ns-a
---
apiVersion: v1
kind: Namespace
metadata:
  name: ns-b

$ cat overlays/dev/kustomization.yaml
bases:
  - ../../base

$ cat overlays/prod/delete-ns-b.yaml
$patch: delete
apiVersion: v1
kind: Namespace
metadata:
  name: ns-b

$ cat overlays/prod/kustomization.yaml
bases:
  - ../../base
patches:
  - path: delete-ns-b.yaml

Behavior of kustomize

$ kustomize build overlays/dev
apiVersion: v1
kind: Namespace
metadata:
  name: ns-a
---
apiVersion: v1
kind: Namespace
metadata:
  name: ns-b

$ kustomize build overlays/prod
apiVersion: v1
kind: Namespace
metadata:
  name: ns-a

In this case, we have two namespaces in the base folder. In dev, kustomize produces 2 namespaces because there is no patch. But, in prod, kustomize produces only one namespace because delete patch deletes namespace ns-b.

Upvotes: 92

Ben Davies
Ben Davies

Reputation: 647

I encountered this problem and eventually took a different approach to solving it. It's worth thinking back through your requirements and asking yourself why you would want kustomize to omit a resource? In my case - and I would imagine this is the most common use-case - I wanted kustomize to omit a resource because I didn't want to apply it to the target kubernetes cluster but kustomize doesn't provide an easy way to do this. Would it not be better for the filtration to take place when applying the resource to the cluster rather than when generating them? The solution which I eventually applied was to filter the resources by label when applying to the cluster. You can add an exclusion label in an overlay to prevent the resource from being applied.

e.g.

$ kustomize build . | kubectl apply -l apply-resource!=no -f -

Upvotes: 10

Josiah
Josiah

Reputation: 2866

I found that my understanding of not being able to change a namespace name was incorrect. Using the patch capability, you actually can change the name of a resource including namespaces.

This is what I ended up using:

patches:
- target:
    kind: Namespace
    name: application
  patch: |-
    - op: replace
      path: /metadata/name
      value: my-application

Upvotes: 8

Related Questions