Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Custom Resource Definitions (CRDs) in Kubernetes
📖 Scenario: You are working with Kubernetes and want to extend its capabilities by creating your own custom resource type. This allows you to manage new kinds of objects just like built-in Kubernetes resources.
🎯 Goal: Build a simple Custom Resource Definition (CRD) YAML manifest step-by-step. You will define a new resource called Book with fields for title and author. Then, you will create an instance of this resource and finally display its details using kubectl.
📋 What You'll Learn
Create a CRD YAML manifest with apiVersion, kind, metadata, and spec
Define the Book resource with title and author fields
Create a YAML manifest for a Book instance with specific values
Use kubectl commands to apply and display the custom resource
💡 Why This Matters
🌍 Real World
Custom Resource Definitions let you extend Kubernetes with your own resource types. This is useful when you want Kubernetes to manage new kinds of objects specific to your applications or infrastructure.
💼 Career
Understanding CRDs is important for Kubernetes administrators and DevOps engineers who build custom automation and extend Kubernetes capabilities in real-world cloud environments.
Progress0 / 4 steps
1
Create the Custom Resource Definition (CRD) YAML
Create a YAML manifest called book-crd.yaml that defines a Custom Resource Definition with apiVersion: apiextensions.k8s.io/v1, kind: CustomResourceDefinition, and metadata name books.example.com. In the spec, set group to example.com, versions with name v1, served and storage set to true, and a schema defining title and author as string properties under spec. Set scope to Namespaced and names with plural: books, singular: book, kind: Book, and shortNames: [bk].
Kubernetes
Hint
Remember to follow the Kubernetes CRD structure carefully. Use openAPIV3Schema to define the fields title and author under spec.
2
Create a Book custom resource instance YAML
Create a YAML manifest called mybook.yaml for a Book resource with apiVersion: example.com/v1, kind: Book, metadata name my-first-book, and spec with title: "The DevOps Journey" and author: "Alex Dev".
Kubernetes
Hint
Use three dashes --- to separate the CRD and the resource instance in the same YAML file or create a separate file. Make sure the apiVersion matches the group and version defined in the CRD.
3
Apply the CRD and create the Book resource
Use the kubectl apply -f book-crd.yaml command to create the Custom Resource Definition in your Kubernetes cluster. Then use kubectl apply -f mybook.yaml to create the Book resource instance.
Kubernetes
Hint
Use kubectl apply -f to create or update resources from YAML files.
4
Display the Book resource details
Use the command kubectl get book my-first-book -o yaml to display the details of the Book resource you created.
Kubernetes
Hint
The output should show the full YAML of your Book resource including the spec fields.
Practice
(1/5)
1. What is the main purpose of a Custom Resource Definition (CRD) in Kubernetes?
easy
A. To add new resource types to Kubernetes that are not built-in
B. To update the Kubernetes version automatically
C. To manage user permissions in Kubernetes
D. To monitor cluster health and performance
Solution
Step 1: Understand what CRDs do
CRDs allow users to create their own resource types beyond the default Kubernetes resources.
Step 2: Compare options
Automatic version updates, user permissions (RBAC), and cluster monitoring are separate Kubernetes features unrelated to CRDs.
Final Answer:
To add new resource types to Kubernetes that are not built-in -> Option A
Quick Check:
CRDs = add custom resource types [OK]
Hint: CRDs = add your own resource types [OK]
Common Mistakes:
Confusing CRDs with RBAC for permissions
Thinking CRDs update Kubernetes versions
Assuming CRDs monitor cluster health
2. Which of the following is the correct YAML key to define the API version for a CRD?
easy
A. version
B. api_version
C. apiVersion
D. apiVer
Solution
Step 1: Recall Kubernetes YAML syntax
Kubernetes uses camelCase keys like apiVersion to specify API versions.
Step 2: Check other options
version, api_version, and apiVer use incorrect formats not recognized by Kubernetes.
Final Answer:
apiVersion -> Option C
Quick Check:
Correct YAML key = apiVersion [OK]
Hint: Use camelCase keys like apiVersion in Kubernetes YAML [OK]
Common Mistakes:
Using underscores instead of camelCase
Using incomplete or shortened keys
Confusing version with apiVersion
3. Given this CRD snippet, what is the scope of the custom resource?
Hint: scope: Namespaced means resource lives inside namespaces [OK]
Common Mistakes:
Confusing Namespaced with Cluster scope
Assuming default namespace only
Thinking scope relates to nodes
4. You applied a CRD YAML but get an error: "unknown field 'kindd'". What is the most likely cause?
medium
A. Typo in the YAML key 'kindd' instead of 'kind'
B. Missing apiVersion field
C. CRD name is not unique
D. Cluster role permissions missing
Solution
Step 1: Analyze the error message
The error says "unknown field 'kindd'", indicating a typo in the YAML key.
Step 2: Identify the correct key
The correct key is kind, so kindd is a misspelling causing the error.
Final Answer:
Typo in the YAML key 'kindd' instead of 'kind' -> Option A
Quick Check:
YAML key typos cause unknown field errors [OK]
Hint: Check YAML keys carefully for typos [OK]
Common Mistakes:
Ignoring spelling errors in YAML keys
Assuming missing fields cause unknown field errors
Blaming permissions for syntax errors
5. You want to create a CRD for a resource named Gadget that is cluster-scoped and has a plural name gadgets. Which YAML snippet correctly defines this?
The resource must be cluster-scoped, so scope: Cluster is correct.
Step 2: Verify kind and plural names
kind should be capitalized as Gadget and plural should be gadgets (plural lowercase).
Step 3: Compare options
The snippet with scope: Cluster, kind: Gadget, plural: gadgets matches all requirements. Snippets with scope: Namespaced, lowercase kind: gadget, or singular plural: gadget are incorrect.