Kubernetes: How to Delete a Resource with Kustomize

Kustomize is a tool for customizing Kubernetes resources based on yaml manifests. It’s easy to add more resources, or modify manifests for different environments. But I struggled to find a solution for how to delete a resource with kustomize, but here is what I found — https://github.com/benkn/kustomize-patch-example.

Problem Setup

My file structure looks like this:

hello-world/
|-- base/
|---- deployment.yaml
|---- ingress.yaml
|---- networkpolicy.yaml
|---- service.yaml
|---- kustomization.yaml

In this, I have all of my manifests together in the base directory, as well as the kustomization.yaml to import all of the manifests. Each manifest contains the yaml definition of the Kubernetes resource. Here is the contents of the kustomization.yaml:

resources:
- hello-world-deployment.yaml
- hello-world-networkpolicy.yaml
- hello-world-ingress.yaml
- hello-world-svc.yaml

When I run kustomize build base then I get all the manifests from the base joined together.

Overlay to Remove Networking

The problem is I need a specific overlay to remove all networking resources. To achieve this, I need kustomize to not include the network resources in the output manifests. So, I created an overlay directory specifically for my no-network need. In it, I added this file to utilize the $patch: delete operation in this file rm-networking.yaml:

# This patch removes the NetworkPolicy with the given name
$patch: delete
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: hello-world
---
# This patch removes the Ingress with the given name
$patch: delete
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-world

To use this patch file, the kustomization.yaml in the overlay/no-network directory contains:

bases:
- ../../base

# Apply patches with these files
patchesStrategicMerge:
- rm-networking.yaml

# Ensure the namespace on all resources is the same
namespace: hello-world

The outcome? Running kustomize build overlays/no-network results in the Ingress and NetworkPolicy excluded from the manifest! 🎉

How? Kustomize pulls in the manifests from ../../base and performs a merge to apply patch operations.

Final Folder Structure

hello-world/
|-- base/
|---- deployment.yaml
|---- ingress.yaml
|---- networkpolicy.yaml
|---- service.yaml
|---- kustomization.yaml
|-- overlays/
|---- no-network/
|------- kustomization.yaml
|------- rm-networking.yaml