Search code examples
kuberneteskustomize

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?


Solution

  • 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.