CKA Certification Course - Certified Kubernetes Administrator

2025 Updates Kustomize Basics

Transformers Demo

In this lesson, we explore how to use several common transformations in Kustomize, including the image transformer. The demo utilizes a structured Kubernetes (K8s) directory setup containing two folders—one for API components and one for database components.

At the API level, you will find:

  • An API deployment YAML file
  • An API service YAML file
  • A kustomization.yaml file that imports these resources

Similarly, the database folder contains:

  • A Database deployment YAML file
  • A Database service YAML file
  • A configuration file (config.yaml)
  • A dedicated kustomization.yaml file that imports the database-related Kubernetes configurations

At the root level, the main kustomization.yaml brings together both the API and database directories:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - api/
  - db/

Adding a Common Label

To streamline management, you can add a common label to every resource in your environment. By updating the root kustomization.yaml file, you can apply a global label. For example, add the label department: engineering as shown below:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - api/
  - db/
commonLabels:
  department: engineering

After saving the file, execute the following command in your terminal to build the configurations:

kustomize build k8s

The output confirms that every resource (such as ConfigMap, Service, and Deployment) now has the new label applied. Here is a snippet of the generated output:

apiVersion: v1
data:
  password: example
  username: root
kind: ConfigMap
metadata:
  labels:
    department: engineering
  name: db-credentials
---
apiVersion: v1
kind: Service
metadata:
  labels:
    department: engineering
  name: api-service
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 3000

Every resource within both the API and database folders now includes the department: engineering label.

Applying Labels in Subdirectory kustomization.yaml Files

In some scenarios, you might prefer to apply a label only to resources defined within a specific folder. For example, to add a label feature: api specifically for the API components, update the API folder’s kustomization.yaml as follows:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - api-depl.yaml
  - api-service.yaml
commonLabels:
  feature: api

When you run the build command, resources in the API directory will display both department: engineering (from the root configuration) and feature: api (from the subdirectory). In contrast, resources in the database folder will not show the feature: api label.

Similarly, to add a label for the database folder, include the following in its kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - db-config.yaml
  - db-depl.yaml
  - db-service.yaml
commonLabels:
  feature: db

After building, the database deployment, service, and config map will reflect the feature: db label.

Adding a Namespace

Applying a namespace to all resources is as simple as adding the namespace field to the root kustomization.yaml file. For example, to assign the namespace debugging, update the file accordingly:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - api/
  - db/
commonLabels:
  department: engineering
namespace: debugging

After running kustomize build, every resource—including those from the API and database folders—will have the namespace debugging.

Setting Name Prefixes and Suffixes

You may also want to add a name prefix and folder-specific suffix to your resources. Suppose you want to prefix every resource’s name with KodeKloud- and apply a suffix of -web to API objects and -storage to database objects.

To add a global name prefix, include it in the root kustomization.yaml:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - api/
  - db/
commonLabels:
  department: engineering
namespace: debugging
namePrefix: KodeKloud-

Then, within each subdirectory’s kustomization.yaml, add a name suffix. For the API folder, update the file as follows:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - api-depl.yaml
  - api-service.yaml
commonLabels:
  feature: api
nameSuffix: -web

For the database folder:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - db-config.yaml
  - db-depl.yaml
  - db-service.yaml
commonLabels:
  feature: db
nameSuffix: -storage

After building the configurations, the API deployment might be named KodeKloud-api-deployment-web and the database deployment KodeKloud-db-deployment-storage.

Adding a Global Annotation

To attach an annotation to every resource, include the commonAnnotations field in the root kustomization.yaml file. For instance, to add an annotation logging: verbose, update the file as follows:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - api/
  - db/
commonLabels:
  department: engineering
commonAnnotations:
  logging: verbose
namespace: debugging
namePrefix: KodeKloud-

Every resource will now feature the annotation logging: verbose in its metadata.

Using an Image Transformer

The image transformer is a powerful feature that enables you to modify container image references directly in your configuration files. Suppose the current database deployment uses the Mongo image and you want to replace it with Postgres. Open the kustomization.yaml file in the database folder and add the following image transformer section:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - db-config.yaml
  - db-depl.yaml
  - db-service.yaml
commonLabels:
  feature: db
nameSuffix: -storage
images:
  - name: mongo
    newName: postgres
    newTag: "4.2"

This configuration replaces any reference to the Mongo image with the Postgres image tagged as "4.2". Note that only the image reference is modified—the container name remains unchanged.

Warning

If you encounter an error like:

Error: accumulating resources: accumulation err='accumulating resources from 'db/': 
couldn't make target for path '...': json: cannot unmarshal number into Go struct field Image.images.newTag of type string

ensure that the tag value is quoted so that it is processed as a string.

After applying the image transformation, the final rendered output for the database deployment will display the updated container image:

...
containers:
  - name: mongo
    image: postgres:4.2
...

Other image references remain unchanged.

Conclusion

In this lesson, we demonstrated various techniques to modify Kubernetes configurations using Kustomize transformations. The key topics covered include:

  • Importing resources using kustomization.yaml files
  • Applying common labels and annotations globally and at the folder level
  • Setting namespaces for resource segmentation
  • Modifying resource names with prefixes and folder-specific suffixes
  • Transforming container images using the image transformer

In the next section, you will have the opportunity to participate in a lab exercise to gain hands-on experience with these Kustomize transformations and further refine your Kubernetes configurations.

For more detailed information on Kubernetes configuration management, visit the Kubernetes Documentation.

Watch Video

Watch video content

Practice Lab

Practice lab

Previous
Image Transformers