Custom Resource Definitions (CRDs) with Flux CD

Flux CD is an open-source GitOps tool that enables continuous delivery for Kubernetes applications. One of the powerful features of Flux CD is its support for Custom Resource Definitions (CRDs). CRDs allow you to extend the Kubernetes API with custom resources that are specific to your application. In this blog post, we will explore how to use CRDs with Flux CD to manage your application’s configuration.

Prerequisites

Before we begin, make sure you have the following prerequisites:

  • A Kubernetes cluster with Flux CD installed.
  • The kubectl command-line tool installed on your local machine.

Creating a Custom Resource Definition

The first step is to create a Custom Resource Definition (CRD) for your application. A CRD defines the schema for your custom resource and allows you to create, update, and delete instances of that resource using the Kubernetes API.

Create a new file named myapp.yaml with the following content:

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata: name: myapps.example.com
spec: group: example.com names: kind: MyApp listKind: MyAppList plural: myapps singular: myapp scope: Namespaced subresources: status: {} version: v1alpha1
Enter fullscreen mode
Exit fullscreen mode

This YAML file defines a CustomResourceDefinition resource that creates a new custom resource named MyApp in the example.com API group. The plural field specifies the name of the resource in the Kubernetes API, and the kind field specifies the kind of the resource.

Applying the Custom Resource Definition

Next, we need to apply the myapp.yaml file to our Kubernetes cluster using the kubectl command-line tool:

kubectl apply -f myapp.yaml
Enter fullscreen mode
Exit fullscreen mode

This will create the MyApp custom resource in our Kubernetes cluster.

Creating a Custom Resource

Now that we have created the MyApp custom resource, we can create an instance of that resource. Create a new file named myapp-instance.yaml with the following content:

apiVersion: example.com/v1alpha1
kind: MyApp
metadata: name: my-app
spec: replicas: 3 image: my-app:latest
Enter fullscreen mode
Exit fullscreen mode

This YAML file defines a MyApp resource that specifies the desired state of our application. The replicas field specifies the number of replicas of our application, and the image field specifies the Docker image for our application.

Applying the Custom Resource

Next, we need to apply the myapp-instance.yaml file to our Kubernetes cluster using the kubectl command-line tool:

kubectl apply -f myapp-instance.yaml
Enter fullscreen mode
Exit fullscreen mode

This will create a new MyApp resource in our Kubernetes cluster.

Using Flux CD to Manage Custom Resources

Now that we have created a custom resource, we can use Flux CD to manage that resource. Create a new file named flux-config.yaml with the following content:

apiVersion: fluxcd.io/v1
kind: GitRepository
metadata: name: my-app-repo
spec: url: https://github.com/my-org/my-app-repo ref: branch: main interval: 1m
---
apiVersion: fluxcd.io/v1
kind: Kustomization
metadata: name: my-app-kustomization
spec: sourceRef: kind: GitRepository name: my-app-repo path: "kustomize" prune: true interval: 1m dependsOn: - name: my-app-repo
Enter fullscreen mode
Exit fullscreen mode

This YAML file defines a GitRepository resource that references our Git repository, and a Kustomization resource that specifies the path to our Kustomize configuration.

Applying the Flux CD Configuration

Next, we need to apply the flux-config.yaml file to our Kubernetes cluster using the kubectl command-line tool:

kubectl apply -f flux-config.yaml
Enter fullscreen mode
Exit fullscreen mode

This will create a new GitRepository resource and a new Kustomization resource in our Kubernetes cluster.

Creating a Kustomize Configuration

Now that we have configured Flux CD to manage our custom resource, we need to create a Kustomize configuration that references our custom resource. Create a new directory named kustomize in your Git repository, and create a new file named kustomization.yaml with the following content:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- myapp-instance.yaml
Enter fullscreen mode
Exit fullscreen mode

This YAML file defines a Kustomization resource that references our myapp-instance.yaml file.

Committing the Kustomize Configuration

Next, we need to commit the kustomize directory to our Git repository:

git add kustomize
git commit -m "Add Kustomize configuration"
git push
Enter fullscreen mode
Exit fullscreen mode

This will push the kustomize directory to our Git repository.

Verifying the Custom Resource

Finally, we can verify that our custom resource is being managed by Flux CD. Run the following command to view the status of our MyApp resource:

kubectl get myapps.example.com
Enter fullscreen mode
Exit fullscreen mode

This should display the status of our MyApp resource, including the number of replicas and the Docker image.

Conclusion

Custom Resource Definitions (CRDs) are a powerful feature of Kubernetes that allow you to extend the Kubernetes API with custom resources that are specific to your application. By using Flux CD to manage your custom resources, you can ensure that your application’s configuration is kept in sync with your Git repository. In this blog post, we explored how to create a custom resource definition, create an instance of that resource, and use Flux CD to manage that resource. By following the steps outlined in this blog post, you can use CRDs with Flux CD to manage your application’s configuration.


Discover more from Coursity

Subscribe to get the latest posts sent to your email.

Leave a Comment

Your email address will not be published. Required fields are marked *

Discover more from Coursity

Subscribe now to keep reading and get access to the full archive.

Continue reading

Scroll to Top