Kubernetes Custom Resource Definition (CRD) Scope: A Comprehensive Guide
Table of Contents
- Core Concepts of Kubernetes CRD Scope
- Typical Usage Examples
- Common Practices
- Best Practices
- Conclusion
- References
Core Concepts of Kubernetes CRD Scope
Namespaced Scope
A CRD with a namespaced scope means that the custom resources created from it are scoped to a specific namespace within the Kubernetes cluster. Namespaces are a way to divide cluster resources between multiple users or teams. When a CRD has a namespaced scope, each namespace can have its own set of custom resources of that type. For example, if you have a custom resource for managing database configurations, different teams in different namespaces can have their own database configuration resources without interfering with each other.
Cluster Scope
On the other hand, a CRD with a cluster scope means that the custom resources are available across the entire Kubernetes cluster. There is no namespace isolation for these resources. Cluster - scoped resources are typically used for cluster - wide configurations or resources that need to be accessible from any part of the cluster. For instance, a custom resource for managing cluster - wide network policies would be a good candidate for a cluster - scoped CRD.
How Scope is Defined in a CRD
When creating a CRD, the scope is defined in the spec.scope field of the CRD YAML file. For a namespaced scope, the value is set to Namespaced, and for a cluster scope, it is set to Cluster. Here is an example of a CRD YAML file with a namespaced scope:
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
scope: Namespaced
names:
plural: mycustomresources
singular: mycustomresource
kind: MyCustomResource
shortNames:
- mcr
Typical Usage Examples
Namespaced Scope Example
Let’s say you are building a custom resource for managing application configurations. Each team in your organization has its own namespace. You create a CRD with a namespaced scope for this custom resource. Team A can create their application configuration resources in their namespace, and Team B can create theirs in their own namespace.
# Create a namespace for Team A
kubectl create namespace team-a
# Create a custom resource in the team-a namespace
kubectl apply -f - <<EOF
apiVersion: example.com/v1
kind: MyCustomResource
metadata:
name: app-config-team-a
namespace: team-a
spec:
config: |
key1: value1
key2: value2
EOF
Cluster Scope Example
Suppose you are building a custom resource for managing cluster - wide backup policies. You create a CRD with a cluster scope. This way, any part of the cluster can access and use the backup policy resources.
# Create a cluster - scoped custom resource
kubectl apply -f - <<EOF
apiVersion: example.com/v1
kind: ClusterBackupPolicy
metadata:
name: cluster - wide - backup - policy
spec:
schedule: "0 2 * * *"
destination: "s3://backup - bucket"
EOF
Common Practices
Start with Namespaced Scope
When creating a new CRD, it is often a good idea to start with a namespaced scope. This provides isolation between different users or teams in the cluster. It also allows for easier testing and development, as you can create and manage resources in a specific namespace without affecting the entire cluster.
Use Cluster Scope for Cluster - Wide Resources
Reserve the cluster scope for resources that truly need to be accessible across the entire cluster. Examples include cluster - wide security policies, network configurations, or cluster - level monitoring resources.
Follow Kubernetes Naming Conventions
When naming your custom resources, follow the Kubernetes naming conventions. Use meaningful names that clearly indicate the purpose of the resource. Also, use proper naming for the CRD itself, including a well - defined group and version.
Best Practices
Document the Scope Clearly
When creating a CRD, document the scope clearly in the documentation for the custom resource. This helps other developers understand how the resource should be used and where it can be created.
Implement RBAC for Access Control
Regardless of the scope, implement Role - Based Access Control (RBAC) to control who can create, read, update, and delete the custom resources. This ensures that only authorized users can manage the resources.
Test Thoroughly
Before deploying a CRD to a production cluster, test it thoroughly in a development or staging environment. Test both the namespaced and cluster - scoped scenarios to ensure that the resources behave as expected.
Conclusion
Understanding the Kubernetes CRD scope is essential for effectively managing custom resources in a Kubernetes cluster. The scope determines where the resources can be created and accessed, and choosing the right scope is crucial for proper resource isolation and management. By following the common and best practices outlined in this article, intermediate - to - advanced software engineers can build and manage custom Kubernetes resources with confidence.
References
- Kubernetes official documentation: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
- Kubernetes API reference: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.23/#customresourcedefinition-v1-apiextensions-k8s-io