> ## Documentation Index
> Fetch the complete documentation index at: https://notes.kodekloud.com/llms.txt
> Use this file to discover all available pages before exploring further.

# A Brief Look At OLM

> Overview of Operator Lifecycle Manager explaining operator packaging, catalogs, bundles, CSVs, subscriptions, install plans, and when to use OLM versus raw manifests.

You may already know the direct deployment path for an operator: build the controller image, push it to a registry, and apply the manifests that install the operator. The Operator Lifecycle Manager (OLM) provides an alternative, catalog-driven distribution model. OLM packages an operator into a bundle that a cluster can discover, install, and upgrade from a catalog — similar to how a package manager distributes software.

<Frame>
  <img src="https://mintcdn.com/kodekloud-c4ac6d9a/_cG0RWHUHqfjYKx0/images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/operator-deployment-methods-direct-olm.jpg?fit=max&auto=format&n=_cG0RWHUHqfjYKx0&q=85&s=a86a800c102fd9f9361f512e75e724ed" alt="This image illustrates two methods for deploying an operator: a &#x22;Direct path&#x22; involving build, push, and apply steps, and an &#x22;OLM&#x22; method involving discovery and installation." width="1920" height="1080" data-path="images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/operator-deployment-methods-direct-olm.jpg" />
</Frame>

Think of raw manifests as handing someone a box of parts plus assembly instructions. OLM acts more like a package manager for operators: the operator package (bundle) still contains CRDs, RBAC, Deployments, and other runtime resources, but it also includes metadata that describes versions, channels, permissions, and upgrade behavior.

<Frame>
  <img src="https://mintcdn.com/kodekloud-c4ac6d9a/_cG0RWHUHqfjYKx0/images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/package-manager-operators-flow-diagram.jpg?fit=max&auto=format&n=_cG0RWHUHqfjYKx0&q=85&s=da879e2cf764c5212b206fc3c888cf31" alt="The image illustrates a package manager for operators, showing a flow where raw manifests containing CRD, RBAC, and Deployment data are enhanced with metadata before being processed by OLM." width="1920" height="1080" data-path="images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/package-manager-operators-flow-diagram.jpg" />
</Frame>

Important: OLM is about distribution and lifecycle management — not a change to your operator's runtime or reconciliation logic. The controller image you build still runs the operator; OLM defines how that operator is presented, installed, and upgraded on a cluster.

<Callout icon="lightbulb" color="#1CB2FE">
  OLM provides discovery, install-time metadata, upgrade channels, and a managed approval workflow — it does not change how your reconcile loop works.
</Callout>

Vocabulary (simple sequence)

* Bundle\
  A bundle is the package for one version of the operator. It contains the files OLM needs: CRDs, metadata, and a `ClusterServiceVersion` (`CSV`). A bundle represents a single packaged version of your operator.

<Frame>
  <img src="https://mintcdn.com/kodekloud-c4ac6d9a/_cG0RWHUHqfjYKx0/images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/bundle-packaged-version-illustration.jpg?fit=max&auto=format&n=_cG0RWHUHqfjYKx0&q=85&s=6202dab5ff64e541ea89b8dc5cebc94a" alt="The image is an illustration labeled &#x22;Bundle: One Packaged Version,&#x22; showing a green box with &#x22;BUNDLE&#x22; written on it, accompanied by a list that includes &#x22;CRDs,&#x22; &#x22;Metadata,&#x22; and &#x22;CSV.&#x22;" width="1920" height="1080" data-path="images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/bundle-packaged-version-illustration.jpg" />
</Frame>

* Controller image\
  The controller image is the container image with your operator code. The bundle references this image and includes the metadata that tells OLM how to deploy it.

* ClusterServiceVersion (`CSV`)\
  The `CSV` is the versioned manifest inside the bundle. It describes the APIs the operator owns, the install strategy (for example, the deployment spec), required RBAC permissions, and UI-facing metadata such as description and version.

<Frame>
  <img src="https://mintcdn.com/kodekloud-c4ac6d9a/_cG0RWHUHqfjYKx0/images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/csv-versioned-label-bundle-diagram.jpg?fit=max&auto=format&n=_cG0RWHUHqfjYKx0&q=85&s=e6c579bd9b3e21d029950edae050648b" alt="The image describes &#x22;CSV: The Versioned Label&#x22; with a focus on ClusterServiceVersion elements like Owned APIs, Install strategy, and Permissions, alongside an illustration of an open box labeled &#x22;BUNDLE.&#x22;" width="1920" height="1080" data-path="images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/csv-versioned-label-bundle-diagram.jpg" />
</Frame>

If the bundle is a box, the `CSV` is the version label that tells OLM and users what’s inside.

* Catalog and `CatalogSource`\
  A `CatalogSource` tells OLM where to look for operator packages (for example, a public registry, vendor catalog, or private catalog). Clusters can use multiple catalogs; catalogs are how OLM discovers available operators and their versions.

* `Subscription`\
  A `Subscription` is a user or platform request to install a package and follow a given channel over time. It names the package, the channel (for example, `stable` or `beta`), the catalog source, and the approval behavior (`Automatic` or `Manual`). OLM watches `Subscription` objects and decides which version should be installed now and which upgrades to consider later.

<Frame>
  <img src="https://mintcdn.com/kodekloud-c4ac6d9a/_cG0RWHUHqfjYKx0/images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/install-request-process-olm-subscription.jpg?fit=max&auto=format&n=_cG0RWHUHqfjYKx0&q=85&s=6364aee782caf6e532d34af72d18d49f" alt="The image outlines an &#x22;Install Request&#x22; process involving a subscription, detailing package, channel, source, and approval settings, with OLM (Operator Lifecycle Manager) monitoring it. Context tabs are shown above, highlighting stages like Bundle, CSV, and Subscription." width="1920" height="1080" data-path="images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/install-request-process-olm-subscription.jpg" />
</Frame>

* `InstallPlan`\
  An `InstallPlan` is the concrete list of steps OLM generates from a `Subscription`. It enumerates the resources OLM intends to install or upgrade (bundles, CSVs, CRDs, and other manifests). Based on the `Subscription` approval mode, OLM may apply the `InstallPlan` automatically or wait for human approval. This gating lets platform teams control when upgrades are applied.

<Callout icon="warning" color="#FF6B6B">
  If a `Subscription` uses manual approval, OLM will pause at the `InstallPlan` stage until an operator or platform engineer approves the plan. This prevents unintended upgrades in production clusters.
</Callout>

* `OperatorGroup`\
  An `OperatorGroup` defines the scope of the operator — which namespaces it should target. Operators can be namespace-scoped (watch a single namespace) or cluster-scoped (watch the entire cluster). `OperatorGroup` tells OLM the intended installation scope.

Quick comparison: When to use OLM

* Choose raw manifests, `Kustomize`, or `Helm` when:
  * You want a simple, transparent install for a small internal operator.
  * You prefer straightforward YAML that you apply directly.
* Choose OLM when you need:
  * Catalog-driven discovery and distribution.
  * Channel-based upgrades and version metadata.
  * Dependency resolution and a managed approval workflow.
  * A consistent operator marketplace experience (common on platforms like OpenShift).

<Frame>
  <img src="https://mintcdn.com/kodekloud-c4ac6d9a/_cG0RWHUHqfjYKx0/images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/olm-comparison-catalogs-manifests-upgrades.jpg?fit=max&auto=format&n=_cG0RWHUHqfjYKx0&q=85&s=ddcef82cdb32b2a50640eaf103a0f105" alt="The image is a comparison of when OLM fits versus when it doesn't, listing benefits like catalog-driven install and channel-based upgrades. It suggests raw manifests for small internal scenarios." width="1920" height="1080" data-path="images/Kubernetes-Operators/Packaging-And-Distribution/A-Brief-Look-At-OLM/olm-comparison-catalogs-manifests-upgrades.jpg" />
</Frame>

Summary table of OLM components

|   Resource Type | Purpose                                 | Key fields / notes                                                     |
| --------------: | --------------------------------------- | ---------------------------------------------------------------------- |
|          Bundle | One packaged version of an operator     | Contains CRDs, `CSV`, metadata                                         |
|           `CSV` | Versioned descriptor for the bundle     | `spec.installStrategy`, owned APIs, permissions                        |
| `CatalogSource` | Where OLM discovers packages            | Points to a registry or index image                                    |
|  `Subscription` | Request to install and follow a channel | `spec.name`, `spec.channel`, `spec.source`, `spec.installPlanApproval` |
|   `InstallPlan` | Concrete steps OLM will apply           | Lists manifests and their order; may require approval                  |
| `OperatorGroup` | Defines operator install scope          | Namespace-scoped or cluster-scoped behavior                            |

Further reading and references

* Operator Lifecycle Manager (OLM) docs: [https://olm.operatorframework.io/docs/](https://olm.operatorframework.io/docs/)
* OpenShift Operators and OperatorHub: [https://docs.openshift.com/](https://docs.openshift.com/)
* When to use Helm, Kustomize, or raw manifests: compare in your platform-specific docs

Takeaway: Not every operator needs OLM. Think of distribution as levels: raw manifests are direct and transparent; OLM adds package metadata, catalogs, channels, `InstallPlan`s, and a gated workflow. When you hear "bundle", `CSV`, `CatalogSource`, `Subscription`, `InstallPlan`, and `OperatorGroup`, treat them as the parts of a package manager story for Kubernetes operators.

<CardGroup>
  <Card title="Watch Video" icon="video" cta="Learn more" href="https://learn.kodekloud.com/user/courses/kubernetes-operators/module/5a9bfe56-bc26-4325-b659-06027d4e815f/lesson/81dde39b-6011-46ad-8cf3-5be074ba996e" />
</CardGroup>
