Exploring Custom Resources and Custom Resource Definitions (CRDs) in Kubernetes

Ayushmaan Srivastav
4 min readMar 29, 2024

--

👫 Conversation between Ramesh and Suresh: Unveiling the Power of CR and CRDs in Kubernetes

Ramesh: Hey Suresh, I’ve been diving into Kubernetes lately, but I keep running into a problem. It seems like there’s no straightforward way to manage our application-specific configurations within Kubernetes. Every time we need to add a new configuration, we have to go through the hassle of updating YAML files and redeploying everything. It’s becoming quite a headache!

Suresh: Ah, I see what you mean, Ramesh. That’s a common pain point when dealing with Kubernetes. But fear not, my friend! There’s a solution to your problem, and it’s called Custom Resources (CR) and Custom Resource Definitions (CRDs).

🔍 Problem: Managing Application-Specific Configurations in Kubernetes

Ramesh: So, Suresh, can you explain how CR and CRDs can help with our configuration management problem?

🛠️ Solution: Understanding CR and CRDs

Suresh: Absolutely, Ramesh! Let me break it down for you.

What are Custom Resources (CRs)?

Custom Resources (CRs) are a Kubernetes feature that allows you to define and use your own custom objects alongside the built-in Kubernetes resources like Pods, Services, Deployments, etc. Essentially, CRs enable you to extend the Kubernetes API with your own domain-specific objects.

What are Custom Resource Definitions (CRDs)?

Now, to define these custom objects, we use Custom Resource Definitions (CRDs). CRDs act as a schema for your custom resources, specifying their structure, validation rules, and behaviors. Once you’ve defined a CRD, Kubernetes knows how to handle your custom resources.

How do CR and CRDs Solve the Problem?

By leveraging CRs and CRDs, we can encapsulate our application-specific configurations into custom resources. Instead of manually editing YAML files for each configuration change, we can simply create, update, or delete custom resources using kubectl or through automation tools.

Example:

Let’s say we have an application that requires different configurations for development, staging, and production environments. We can define a Custom Resource called AppConfig, with fields for environment variables, database connections, etc. Then, we create instances of AppConfig for each environment, and Kubernetes takes care of applying those configurations to our application pods.

Creating Custom Resources (CR) and Custom Resource Definitions (CRDs) in Kubernetes involves defining new object types tailored to your specific application requirements. These custom resources allow you to extend Kubernetes’ functionality beyond its built-in resources like Pods, Deployments, and Services. Below is a detailed sequential step-by-step guide on creating CRs and CRDs:

Step 1: Setup Kubernetes Cluster

Ensure you have a Kubernetes cluster set up and configured. You can use managed Kubernetes services like Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS), or deploy a cluster using tools like Minikube or kubeadm.

Step 2: Define CRD (Custom Resource Definition)

Create CRD YAML file: Define the structure of your custom resource in a YAML file. For example, customresource-definition.yaml.

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: mycustomresources.example.com
spec:
group: example.com
versions:
— name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
# Define properties of your custom resource
foo:
type: string
bar:
type: integer
scope: Namespaced # or Cluster

make the indentation correct

Apply CRD Definition: Use kubectl apply to create the CRD.

kubectl apply -f customresource-definition.yaml

Step 3: Define CR (Custom Resource)

Create CR YAML file: Define an instance of your custom resource in a YAML file. For example, customresource-instance.yaml.

apiVersion: example.com/v1
kind: MyCustomResource
metadata:
name: example-cr
spec:
foo: “value”
bar: 123

Apply CR: Use kubectl apply to create the custom resource instance.

kubectl apply -f customresource-instance.yaml

Step 4: Verify CR

Check Custom Resources: Verify that the custom resource instance has been created.

kubectl get mycustomresources

Step 5: Interact with CRs

View CR Details: Check the details of the custom resource instance.

kubectl get mycustomresource example-cr -o yaml

Update CR: Modify the custom resource YAML file and apply changes.

kubectl apply -f customresource-instance.yaml

Delete CR: Remove the custom resource instance.

kubectl delete mycustomresource example-cr

Additional Tips:

  • Validation: Implement validation in your CRD to ensure data integrity and consistency.
  • Controllers: Implement controllers to manage custom resources’ lifecycle and reconcile desired state.
  • RBAC: Define appropriate Role-Based Access Control (RBAC) rules for managing custom resources.

By following these steps, you can effectively create and manage Custom Resources (CRs) and Custom Resource Definitions (CRDs) in Kubernetes. This allows you to extend Kubernetes’ capabilities to suit your specific use cases and requirements.

--

--

No responses yet