Project Layout

A description of the layout of projects built with Operator SDK

Operator SDK Project Layout

All projects initialized with operator-sdk init have a common base structure which builds on kubebuilder’s project layout. Each project type is customized further with code of that type’s language.

Common Base

The common structure contains the following items:

File/Directory Description
Dockerfile The Dockerfile of your operator project, used to build the image with make docker-build.
Makefile Build file with helper targets to help you work with your project.
PROJECT This file represents the project’s configuration and is used to track useful information for the CLI and plugins.
bin/ This directory contains useful binaries such as the manager which is used to run your project locally and the kustomize utility used for the project configuration. For other language types, it might have other binaries useful for developing your operator.
bundle/ This directory contains all the files used to integrate your project with OLM with the bundle format. It is built from the Makefile target make bundle.
bundle/manifests/ This directory has the OLM manifests of your bundle.
bundle/metadata/ This directory has the OLM metadata of your bundle e.g the index image annotations.
bundle/tests/ This directory has the Scorecard tests shipped with your operator bundle.
config/ Contains configuration files to launch your project on a cluster. Plugins might use it to provide functionality. For example, for the CLI to help create your operator bundle it will look for the CRD’s and CR’s which are scaffolded in this directory. You will also find all Kustomize YAML definitions as well.
config/crd/ Contains the Custom Resources Definitions.
config/default/ Contains a Kustomize base for launching the controller in a standard configuration.
config/manager/ Contains the manifests to launch your operator project as pods on the cluster.
config/manifests/ Contains the base to generate your OLM manifests in the bundle directory.
config/prometheus/ Contains the manifests required to enable project to serve metrics to Prometheus such as the ServiceMonitor resource.
config/scorecard/ Contains the manifests required to allow you test your project with Scorecard.
config/rbac/ Contains the RBAC permissions required to run your project.
config/samples/ Contains the Custom Resources.
bundle.Dockerfile The Dockerfile to build the bundle image. Used to build the operator bundle image with `make bundle-build. |


Now, let’s look at the files and directories specific to Ansible-based operators.

File/Directory Description
config/testing/ Manifest files to help you test your project. For example, to change the image policy for your Molecule tests or to enable debug level in the Ansible logs.
molecule/ Contain the manifests for your Molecule tests.
molecule/default Contains the default Molecule task.
molecule/kind Contains the Molecule task to be executed on the cluster.
playbooks/ Contains the Ansible playbooks.
roles/ Contains the Ansible role files for each Kind scaffold.
requirements.yml This file specifies Ansible dependencies that need to be installed for your operator to function.
watches.yaml Contains Group, Version, Kind, and the playbooks and rules location. Used to configure the Ansible watches.


Now, let’s look at the files and directories specific to Go-based operators.

File/Directory Description
api/ Contains the api definition
config/certmanager Contains the Kustomize manifests which configure the cert-manager by the Webhooks.
config/webhook Contains the Kustomize manifests to configure the Webhook.
controllers Contains the controllers.
main.go Implements the project initialization.
hack/ Contains utility files, e.g. the file used to scaffold the license header for your project files.


Now, let’s look at the files and directories specific to Helm-based operators.

File/Directory Description
helm-charts Contains the Helm charts for each Kind scaffold which can be initialized with operator-sdk init --plugins=helm [options] or operator-sdk create api [options] .
watches.yaml Contains Group, Version, Kind, and Helm chart location. Used to configure the Helm watches.