Skip to content
This repository was archived by the owner on Apr 13, 2026. It is now read-only.

docs: add deployer concept doc and adjust other guides#761

Closed
Skarlso wants to merge 17 commits into
open-component-model:mainfrom
Skarlso:document-and-refactor-the-deployer-docs
Closed

docs: add deployer concept doc and adjust other guides#761
Skarlso wants to merge 17 commits into
open-component-model:mainfrom
Skarlso:document-and-refactor-the-deployer-docs

Conversation

@Skarlso

@Skarlso Skarlso commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

What this PR does / why we need it

Fixes open-component-model/ocm-project#890.

Which issue(s) this PR is related to

Type of content

  • Tutorial (getting-started/ or tutorials/)
  • How-to Guide (how-to/)
  • Explanation / Concept (concepts/)
  • Reference (reference/)
  • Other (infrastructure, config, fixes)

Checklist

  • I have read and followed the Contributing Guide
  • All commands/code snippets are tested and can be copy-pasted

Summary by CodeRabbit

  • Documentation
    • Added new tutorial covering deployment workflows using OCM Controllers with manual and bootstrap approaches.
    • Added new documentation explaining Kubernetes Deployer reconciliation and lifecycle management.
    • Reorganized getting-started guides with updated links and simplified overview descriptions.
    • Enhanced OCM Controllers architecture documentation with clearer reconciliation chain descriptions.
    • Updated cross-document references to point to consolidated deployment resources.

On-behalf-of: Gergely Brautigam <gergely.brautigam@sap.com>

Signed-off-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com>
@netlify

netlify Bot commented Mar 17, 2026

Copy link
Copy Markdown

Deploy Preview for open-component-model ready!

Name Link
🔨 Latest commit de64268
🔍 Latest deploy log https://app.netlify.com/projects/open-component-model/deploys/69bd445f7aa71100077cc7ef
😎 Deploy Preview https://deploy-preview-761--open-component-model.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai

coderabbitai Bot commented Mar 17, 2026

Copy link
Copy Markdown

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

This pull request consolidates Helm chart deployment documentation by creating a comprehensive new tutorial, moving content from getting-started guides into a unified resource, removing a separate bootstrap tutorial, expanding the OCM controllers concept page, and updating all internal documentation cross-references to point to the reorganized content. Additionally, the wordlist and a new Kubernetes Deployer concept page are added.

Changes

Cohort / File(s) Summary
Wordlist Configuration
.github/config/wordlist.txt
Added new spell-check entries (KEP, kro's, Kustomizations, LRU, OCIRepository, ResourceGraphDefinitions, RGDs, unregisters) and reordered clusterroles placement.
Architecture & Concept Documentation
content/docs/concepts/ocm-controllers.md, content/docs/concepts/kubernetes-deployer.md
Expanded OCM controllers concept with explicit Repository → Component → Resource → Deployer chain, replaced inline SVG with Mermaid flowchart, and added new comprehensive Kubernetes Deployer controller documentation covering reconciliation, ApplySet lifecycle, drift detection, and bootstrap use cases.
Getting Started Guide Restructuring
content/docs/getting-started/deploy-helm-chart.md, content/docs/getting-started/_index.md, content/docs/getting-started/setup-controller-environment.md
Converted detailed Helm deployment guide to high-level overview with quick-start pointer; updated landing page description; redirected prerequisite guide's next-steps link to new unified tutorial.
Tutorial Migration
content/docs/tutorials/deploy-with-controllers.md, content/docs/tutorials/deploy-helm-chart-bootstrap.md
Removed bootstrap-specific tutorial and created new comprehensive tutorial covering both Manual RGD and Bootstrap workflows for deploying Helm charts via OCM Controllers and Flux, including manifests, verification steps, and troubleshooting.
Documentation Cross-Reference Updates
content/docs/concepts/transfer-concept.md, content/docs/how-to/air-gap-transfer.md
Updated internal tutorial links from deploy-helm-chart-bootstrap.md to deploy-with-controllers.md to reference consolidated tutorial.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~18 minutes

Possibly related PRs

Suggested labels

area/documentation, kind/chore

Suggested reviewers

  • matthiasbruns
  • jakobmoellerdev
  • frewilhelm

Poem

🐰 From scattered guides now flows one stream,
A unified tutorial—the deployer's dream!
Controllers dance with helm charts bright,
Bootstrap workflows, all unified right.
The docs now hop with purpose and care! 🌿

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main changes: adding the deployer concept documentation and adjusting related guides in response to the deployment documentation consolidation effort.
Linked Issues check ✅ Passed The PR successfully completes all coding-related objectives from issue #890: expanded ocm-controllers.md with architecture details, created the new deploy-with-controllers.md tutorial consolidating both workflows, refactored deploy-helm-chart.md to overview-only, removed the bootstrap tutorial, preserved setup-controller-environment.md, added kubernetes-deployer.md concept doc, and updated all internal relrefs.
Out of Scope Changes check ✅ Passed All changes are directly aligned with issue #890 objectives. The wordlist.txt update (adding terms like KEP, LRU, OCIRepository, RGDs, Kustomizations) supports the documentation content changes and is appropriately in scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Skarlso and others added 3 commits March 17, 2026 16:51
On-behalf-of: Gergely Brautigam <gergely.brautigam@sap.com>

Signed-off-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com>
Signed-off-by: Gergely Bräutigam <gergely.brautigam@sap.com>
On-behalf-of: Gergely Brautigam <gergely.brautigam@sap.com>

Signed-off-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com>
@Skarlso Skarlso marked this pull request as ready for review March 19, 2026 13:37
@Skarlso Skarlso requested a review from a team as a code owner March 19, 2026 13:37
Skarlso and others added 2 commits March 19, 2026 14:37
…Skarlso/ocm-website into document-and-refactor-the-deployer-docs
Signed-off-by: Gergely Bräutigam <gergely.brautigam@sap.com>
@Skarlso Skarlso force-pushed the document-and-refactor-the-deployer-docs branch 3 times, most recently from 1edaf80 to 807cd14 Compare March 19, 2026 13:47
On-behalf-of: Gergely Brautigam <gergely.brautigam@sap.com>

Signed-off-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com>
@Skarlso Skarlso force-pushed the document-and-refactor-the-deployer-docs branch from 807cd14 to b25268b Compare March 19, 2026 13:49
@Skarlso Skarlso marked this pull request as draft March 19, 2026 15:06
On-behalf-of: Gergely Brautigam <gergely.brautigam@sap.com>

Signed-off-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com>

This tutorial walks you through deploying a Helm chart from an OCM component version to a Kubernetes cluster,
using the OCM Controllers with kro and Flux.
This guide gives you a quick overview of deploying a Helm chart using the OCM Controllers.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Arguable, this isn't needed anymore. 🤔

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
content/docs/concepts/ocm-controllers.md (1)

7-7: Optional: hasMermaid flag is auto-set.

The hasMermaid: true flag is automatically set by the render-codeblock-mermaid.html template when Mermaid code blocks are rendered (see the relevant code snippet). Including it in frontmatter is redundant but harmless—it can serve as documentation that the page contains diagrams.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@content/docs/concepts/ocm-controllers.md` at line 7, Remove the redundant
frontmatter key `hasMermaid: true` from the document (it's auto-set by the
`render-codeblock-mermaid.html` template) — open the file containing the
`hasMermaid` frontmatter entry, delete that line so the page relies on the
template to set the flag, and leave a brief inline comment only if you want to
document that the template auto-sets the flag for Mermaid diagrams.
content/docs/concepts/deployer.md (1)

36-38: Optional: Consider more concise wording.

The phrase "In order to get to a deployment" could be simplified to "To reach deployment" for conciseness, though the current wording is not incorrect.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@content/docs/concepts/deployer.md` around lines 36 - 38, The opening sentence
is wordy—replace "In order to get to a deployment the following chain of objects
has to be reconciled." with a more concise phrasing like "To reach deployment,
the following chain of objects must be reconciled:" and keep the rest of the
paragraph intact; update the sentence that references Repository, Component,
Resource, and Deployer to maintain clarity and punctuation (use a colon after
the concise sentence and ensure the object chain is exactly "Repository ->
Component -> Resource -> Deployer").
content/docs/tutorials/deploy-with-controllers.md (3)

381-381: Add a cautionary note about insecure: true flag.

Setting insecure: true in the OCIRepository spec disables TLS verification and should only be used for local testing or development environments. This could be misleading for users following the tutorial in production settings.

⚠️ Proposed addition of a warning callout

Add a callout after line 388 (before the helmrelease section):

{{<callout context="caution" title="Insecure Registry" icon="outline/alert-triangle">}}
The `insecure: true` flag is set for local testing only. Remove this flag when using TLS-enabled registries in production.
{{</callout>}}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@content/docs/tutorials/deploy-with-controllers.md` at line 381, Add a
cautionary callout near the OCIRepository spec where the insecure: true flag is
set: insert a warning callout mentioning "Insecure Registry" and that insecure:
true is for local testing only and must be removed for TLS-enabled registries in
production; place this callout immediately before the HelmRelease section
referenced in the doc so readers see it right after the OCIRepository example
that includes insecure: true.

34-34: Minor style improvement: simplify "outside of" to "outside".

The phrase "outside of" is slightly redundant in this context.

✏️ Proposed fix
-In this approach, you create the `ResourceGraphDefinition` outside of the OCM component and apply it directly to the cluster.
+In this approach, you create the `ResourceGraphDefinition` outside the OCM component and apply it directly to the cluster.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@content/docs/tutorials/deploy-with-controllers.md` at line 34, Replace the
phrase "outside of the OCM component" with the simpler "outside the OCM
component" in the sentence that references creating the ResourceGraphDefinition;
locate the sentence containing `ResourceGraphDefinition` and update that wording
to use "outside" instead of "outside of" for the minor style improvement.

405-405: Reconsider combining tag and digest in a single Helm values field.

The OCI reference format tag@digest is valid per the image specification and is supported in this project's documentation. However, storing both tag and digest in a single tag field (as ${resourceImage.status.additional.tag}@${resourceImage.status.additional.digest}) deviates from Helm best practices.

The recommended approach is to use separate fields for flexibility:

  • Separate tag and digest fields in values, or
  • Use a unified version field that can hold either a tag (e.g., 1.0.0) or a digest (e.g., sha256:...)
  • Then use a Helm template helper to construct the image reference appropriately (with : for tags, @ for digests)

This approach improves clarity, reusability, and allows easier overrides by users.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@content/docs/tutorials/deploy-with-controllers.md` at line 405, The Helm
values currently combine tag and digest into one field (`tag:
${resourceImage.status.additional.tag}@${resourceImage.status.additional.digest}`);
change values to expose separate fields (e.g., values.image.tag and
values.image.digest) or a single values.image.version that may hold either a tag
or a digest, and update the chart templates (the helper used to render image
references) to construct the final reference using ":" when a tag is present and
"@" when a digest is present; update any places referencing `tag` to use the new
fields (`values.image.tag`, `values.image.digest`, or `values.image.version`)
and adjust the helper/template that currently consumes `tag` so image references
are built consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@content/docs/tutorials/deploy-with-controllers.md`:
- Line 81: Fix the incomplete sentence by adding a conjunction and cleaning verb
tense: change the sentence that references `component-constructor.yaml` so it
reads like "By default, this looks for `component-constructor.yaml` in the
current directory and will create a component version directly in the target OCI
repository." or alternatively "By default, this looks for
`component-constructor.yaml` in the current directory and creates a component
version directly in the target OCI repository." Update the sentence containing
`component-constructor.yaml` accordingly.

---

Nitpick comments:
In `@content/docs/concepts/deployer.md`:
- Around line 36-38: The opening sentence is wordy—replace "In order to get to a
deployment the following chain of objects has to be reconciled." with a more
concise phrasing like "To reach deployment, the following chain of objects must
be reconciled:" and keep the rest of the paragraph intact; update the sentence
that references Repository, Component, Resource, and Deployer to maintain
clarity and punctuation (use a colon after the concise sentence and ensure the
object chain is exactly "Repository -> Component -> Resource -> Deployer").

In `@content/docs/concepts/ocm-controllers.md`:
- Line 7: Remove the redundant frontmatter key `hasMermaid: true` from the
document (it's auto-set by the `render-codeblock-mermaid.html` template) — open
the file containing the `hasMermaid` frontmatter entry, delete that line so the
page relies on the template to set the flag, and leave a brief inline comment
only if you want to document that the template auto-sets the flag for Mermaid
diagrams.

In `@content/docs/tutorials/deploy-with-controllers.md`:
- Line 381: Add a cautionary callout near the OCIRepository spec where the
insecure: true flag is set: insert a warning callout mentioning "Insecure
Registry" and that insecure: true is for local testing only and must be removed
for TLS-enabled registries in production; place this callout immediately before
the HelmRelease section referenced in the doc so readers see it right after the
OCIRepository example that includes insecure: true.
- Line 34: Replace the phrase "outside of the OCM component" with the simpler
"outside the OCM component" in the sentence that references creating the
ResourceGraphDefinition; locate the sentence containing
`ResourceGraphDefinition` and update that wording to use "outside" instead of
"outside of" for the minor style improvement.
- Line 405: The Helm values currently combine tag and digest into one field
(`tag:
${resourceImage.status.additional.tag}@${resourceImage.status.additional.digest}`);
change values to expose separate fields (e.g., values.image.tag and
values.image.digest) or a single values.image.version that may hold either a tag
or a digest, and update the chart templates (the helper used to render image
references) to construct the final reference using ":" when a tag is present and
"@" when a digest is present; update any places referencing `tag` to use the new
fields (`values.image.tag`, `values.image.digest`, or `values.image.version`)
and adjust the helper/template that currently consumes `tag` so image references
are built consistently.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bb417efe-780e-47a1-b38d-c35fecd2df12

📥 Commits

Reviewing files that changed from the base of the PR and between 51ec054 and 5a6033b.

📒 Files selected for processing (10)
  • .github/config/wordlist.txt
  • content/docs/concepts/deployer.md
  • content/docs/concepts/ocm-controllers.md
  • content/docs/concepts/transfer-concept.md
  • content/docs/getting-started/_index.md
  • content/docs/getting-started/deploy-helm-chart.md
  • content/docs/getting-started/setup-controller-environment.md
  • content/docs/how-to/air-gap-transfer.md
  • content/docs/tutorials/deploy-helm-chart-bootstrap.md
  • content/docs/tutorials/deploy-with-controllers.md
💤 Files with no reviewable changes (1)
  • content/docs/tutorials/deploy-helm-chart-bootstrap.md

Comment thread content/docs/tutorials/deploy-with-controllers.md Outdated
Skarlso and others added 2 commits March 20, 2026 07:33
On-behalf-of: Gergely Brautigam <gergely.brautigam@sap.com>

Signed-off-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com>
Comment thread content/docs/concepts/deployer.md Outdated
@@ -0,0 +1,107 @@
---
title: "Deployer"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"Controller Deployer" or "Kubernetes Deployer" would be a better name here to indicate, that we are talking about controller stuff

Comment thread content/docs/concepts/deployer.md Outdated
Comment thread content/docs/concepts/deployer.md Outdated
Comment thread content/docs/concepts/deployer.md Outdated
Comment thread content/docs/concepts/kubernetes-deployer.md Outdated
Comment thread content/docs/concepts/deployer.md Outdated

```shell
ocm add cv --repository ghcr.io/<your-namespace>/repository \
--component-version-conflict-policy replace

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since this is a tutorial, we need a bit more hand-holding here. Can you explain what --component-version-conflict-policy replace does and why we should use it in here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of that, I will just completely remove it. :D So there is no problem and we don't accidentally introduce another concept. WDYT?

On-behalf-of: Gergely Brautigam <gergely.brautigam@sap.com>

Signed-off-by: Gergely Brautigam <182850+Skarlso@users.noreply.github.com>

This tutorial walks you through deploying a Helm chart from an OCM component version to a Kubernetes cluster,
using the OCM Controllers with kro and Flux.
The [OCM Controllers]({{< relref "ocm-controllers.md" >}}) deploy Helm charts from OCM component versions into Kubernetes clusters using kro and Flux. The basic flow is:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I simplified a bunch of things. Do we even need this doc now? 🤔

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not if its moved to the tutorial :D

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the issue description the content is just moved to the tutorial

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, maybe we want to use this document to show a deployment without the bootstrap-shenanigans as it is not the easiest entrypoint.

In this guide you could just apply a manifest to a cluster. WDYT?


## How It Works

The Deployer references an OCM `Resource` object. When that resource becomes ready, the Deployer downloads the referenced blob, decodes any YAML/JSON manifests it contains, and applies them to the cluster.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The Deployer references an OCM `Resource` object. When that resource becomes ready, the Deployer downloads the referenced blob, decodes any YAML/JSON manifests it contains, and applies them to the cluster.
The Deployer references an OCM `Resource` object. When the status of that resource becomes `Ready`, the Deployer downloads the referenced blob, decodes any YAML/JSON manifests it contains, and applies them to the cluster.

Comment on lines +66 to +83
The Deployer stamps deployed resources with metadata for traceability:

**Labels:**

| Label | Value |
|-------|-------|
| `app.kubernetes.io/managed-by` | `deployer.delivery.ocm.software` |
| `app.kubernetes.io/name` | Resource name |
| `app.kubernetes.io/version` | Resource version |
| `app.kubernetes.io/part-of` | Deployer name |

**Annotations:**

| Annotation | Value |
|------------|-------|
| `digest.resource.delivery.ocm.software/value` | Resource digest |
| `component.delivery.ocm.software/name` | Component name |
| `component.delivery.ocm.software/version` | Component version |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is good for using tabs

Comment on lines +66 to +83
The Deployer stamps deployed resources with metadata for traceability:

**Labels:**

| Label | Value |
|-------|-------|
| `app.kubernetes.io/managed-by` | `deployer.delivery.ocm.software` |
| `app.kubernetes.io/name` | Resource name |
| `app.kubernetes.io/version` | Resource version |
| `app.kubernetes.io/part-of` | Deployer name |

**Annotations:**

| Annotation | Value |
|------------|-------|
| `digest.resource.delivery.ocm.software/value` | Resource digest |
| `component.delivery.ocm.software/name` | Component name |
| `component.delivery.ocm.software/version` | Component version |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The Deployer stamps deployed resources with metadata for traceability:
**Labels:**
| Label | Value |
|-------|-------|
| `app.kubernetes.io/managed-by` | `deployer.delivery.ocm.software` |
| `app.kubernetes.io/name` | Resource name |
| `app.kubernetes.io/version` | Resource version |
| `app.kubernetes.io/part-of` | Deployer name |
**Annotations:**
| Annotation | Value |
|------------|-------|
| `digest.resource.delivery.ocm.software/value` | Resource digest |
| `component.delivery.ocm.software/name` | Component name |
| `component.delivery.ocm.software/version` | Component version |
The Deployer stamps deployed resources with metadata for traceability in the form of **labels** and **annotations**:
{{< tabs >}}
{{< tab "Labels" >}}
| Label | Value |
|-------|-------|
| `app.kubernetes.io/managed-by` | `deployer.delivery.ocm.software` |
| `app.kubernetes.io/name` | Resource name |
| `app.kubernetes.io/version` | Resource version |
| `app.kubernetes.io/part-of` | Deployer name |
{{< /tab >}}
{{< tab "Annotations" >}}
| Annotation | Value |
|------------|-------|
| `digest.resource.delivery.ocm.software/value` | Resource digest |
| `component.delivery.ocm.software/name` | Component name |
| `component.delivery.ocm.software/version` | Component version |
{{< /tab >}}
{{< /tabs >}}


```text
COMPONENT │ VERSION │ PROVIDER
─────────────────────────────────────┼─────────┼──────────────

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
────────────────────────────────────┼─────────┼──────────────
────────────────────────────────────┼─────────┼──────────────


```text
COMPONENT │ VERSION │ PROVIDER
─────────────────────────────────────┼─────────┼──────────────

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
────────────────────────────────────┼─────────┼──────────────
────────────────────────────────────┼─────────┼──────────────


#### Apply the ResourceGraphDefinition

When kro processes the RGD, it generates a new Custom Resource Definition (CRD), in this case, a `Simple` kind that you can instantiate later:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
When kro processes the RGD, it generates a new Custom Resource Definition (CRD), in this case, a `Simple` kind that you can instantiate later:
When kro processes the RGD, it generates a new CustomResourceDefinition (CRD), in this case, a `Simple` kind that you can instantiate later:


#### Create an instance

Create `instance.yaml`. This creates a `Simple` resource, kro sees it and instantiates all the resources defined in the RGD, wiring them together automatically:

@morri-son morri-son Mar 20, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Create `instance.yaml`. This creates a `Simple` resource, kro sees it and instantiates all the resources defined in the RGD, wiring them together automatically:
Create a file `instance.yaml`. With this you can create a resource `Simple`. When kro detects it, it instantiates all the resources defined in the RGD, wiring them together automatically:

kubectl apply -f instance.yaml
```

Wait for the deployment. kro reconciles the full chain. OCM repository, component, resource, Flux source, and Helm release:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Wait for the deployment. kro reconciles the full chain. OCM repository, component, resource, Flux source, and Helm release:
Wait for the deployment. kro reconciles the full chain: OCM repository, component, resource, Flux source, and Helm release:

In this approach, the `ResourceGraphDefinition` is packaged inside the OCM component. The [Deployer]({{< relref "kubernetes-deployer.md" >}}) extracts and applies it automatically. This also demonstrates **localization**, injecting an updated image reference into the Helm chart values.

{{<callout context="note" title="Localization" icon="outline/current-location">}}
**Localization** inserts a new image reference into the deployment instructions. When an OCM component is transferred with `--copy-resources`, referential resources update their image references to the new registry. The Deployer and FluxCD's `HelmRelease` values field propagate this change into the actual deployment.

@morri-son morri-son Mar 20, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
**Localization** inserts a new image reference into the deployment instructions. When an OCM component is transferred with `--copy-resources`, referential resources update their image references to the new registry. The Deployer and FluxCD's `HelmRelease` values field propagate this change into the actual deployment.
**Localization** inserts a new image reference into the deployment instructions. When an OCM component is transferred with `--copy-resources`, the image references of resources are updated to their new registry. The Deployer and Flux's `HelmRelease` values field propagate this change into the actual deployment.

{{< /step >}}

{{<callout context="note" title="globalAccess vs direct access" icon="outline/info-circle">}}
Unlike Part 1, this RGD uses `resource.access.globalAccess.toOCI()` instead of `resource.access.toOCI()`. When the component is transferred with `--copy-resources`, the resources are copied into the target registry and the component descriptor records a _local_ reference to them. The `globalAccess` field resolves the resource through its relocated OCI reference, which is required for the HelmRelease to pull the artifact ( the podinfo image ) from the correct registry.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Unlike Part 1, this RGD uses `resource.access.globalAccess.toOCI()` instead of `resource.access.toOCI()`. When the component is transferred with `--copy-resources`, the resources are copied into the target registry and the component descriptor records a _local_ reference to them. The `globalAccess` field resolves the resource through its relocated OCI reference, which is required for the HelmRelease to pull the artifact ( the podinfo image ) from the correct registry.
Unlike in Part 1, this RGD uses `resource.access.globalAccess.toOCI()` instead of `resource.access.toOCI()`. When the component is transferred with `--copy-resources`, the resources are copied into the target registry and the component descriptor records a _local_ reference to them. The `globalAccess` field resolves the resource through its relocated OCI reference, which is required for the HelmRelease to pull the artifact (the podinfo image) from the correct registry.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this whole section is outdated.


#### Define the component

Create `component-constructor.yaml`. This component bundles three resources: the Helm chart, the application image (for localization), and the RGD itself:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Create `component-constructor.yaml`. This component bundles three resources: the Helm chart, the application image (for localization), and the RGD itself:
Create a file `component-constructor.yaml`. This component bundles three resources: the Helm chart, the application image (for localization), and the RGD itself:

Then transfer it to the registry with `--copy-resources`. This copies the referenced OCI artifacts (Helm chart and image) into your registry, which is what enables localization. The component descriptor is updated to point at the new locations:

```shell
ocm transfer cv ctf::./transport-archive//ocm.software/ocm-k8s-toolkit/bootstrap:1.0.0 \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
ocm transfer cv ctf::./transport-archive//ocm.software/ocm-k8s-toolkit/bootstrap:1.0.0 \
ocm transfer cv ./transport-archive//ocm.software/ocm-k8s-toolkit/bootstrap:1.0.0 \

@morri-son morri-son Mar 20, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess we can omit the ctf: scheme, or?


## ApplySet Semantics

The Deployer uses [ApplySet](https://kubernetes.io/docs/reference/labels-annotations-taints/#kubectl-applyset) (KEP-3659) for resource lifecycle management.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The hyperlink #kubectl-applyset does not work

## Installation

Currently, the OCM controllers are available as [image][controller-image] and
[Kustomization](https://github.com/open-component-model/open-component-model/blob/main/kubernetes/controller/config/default/kustomization.yaml). A Helm chart is planned for the future.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not up-to-date. We have a helm chart

an OCM resource into a Kubernetes cluster. The OCM controllers deployment, however, does not contain kro or any
deployer. Please refer to the respective installation guides for these tools:
{{<callout context="caution" title="kro" icon="outline/alert-triangle">}}
The OCM controllers deployment does not include kro. If you plan to use `ResourceGraphDefinitions`, install kro separately:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"and make sure to apply the appropriate permissions (Link to the RBAC doc)"


This tutorial walks you through deploying a Helm chart from an OCM component version to a Kubernetes cluster,
using the OCM Controllers with kro and Flux.
The [OCM Controllers]({{< relref "ocm-controllers.md" >}}) deploy Helm charts from OCM component versions into Kubernetes clusters using kro and Flux. The basic flow is:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not if its moved to the tutorial :D


This tutorial walks you through deploying a Helm chart from an OCM component version to a Kubernetes cluster,
using the OCM Controllers with kro and Flux.
The [OCM Controllers]({{< relref "ocm-controllers.md" >}}) deploy Helm charts from OCM component versions into Kubernetes clusters using kro and Flux. The basic flow is:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to the issue description the content is just moved to the tutorial


This tutorial walks you through deploying a Helm chart from an OCM component version to a Kubernetes cluster,
using the OCM Controllers with kro and Flux.
The [OCM Controllers]({{< relref "ocm-controllers.md" >}}) deploy Helm charts from OCM component versions into Kubernetes clusters using kro and Flux. The basic flow is:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, maybe we want to use this document to show a deployment without the bootstrap-shenanigans as it is not the easiest entrypoint.

In this guide you could just apply a manifest to a cluster. WDYT?

ocm add cv
```

Then transfer it to the registry with `--copy-resources`. This copies the referenced OCI artifacts (Helm chart and image) into your registry, which is what enables localization. The component descriptor is updated to point at the new locations:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Then transfer it to the registry with `--copy-resources`. This copies the referenced OCI artifacts (Helm chart and image) into your registry, which is what enables localization. The component descriptor is updated to point at the new locations:
Then transfer it to the target registry with `--copy-resources`. This copies the referenced OCI artifacts (Helm chart and image) into your registry, which is what enables localization. The access locations of the resources in the component descriptor are updated to point to the target registry:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, saying it "enables localization" feels weird. It's nothing we'd really like to have. I think even though this is a tutorial, you need to explain (or at least link) to a section that explains the rational about localization.

Maybe that's even worth its own concept.

{{< /steps >}}

{{<callout context="note">}}
If using a private registry, see the [OCM CLI credentials documentation]({{<relref "/docs/concepts/credential-system.md">}}).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If using a private registry, see the [OCM CLI credentials documentation]({{<relref "/docs/concepts/credential-system.md">}}).
If you use a private registry, see the [OCM CLI credentials documentation]({{<relref "/docs/concepts/credential-system.md">}}).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you shouldn't link to a concept section here. The user is trying to work through a tutorial. Link him the https://deploy-preview-761--open-component-model.netlify.app/dev/docs/tutorials/credentials-for-ocm-controllers/ section.


#### Create bootstrap resources

Create `bootstrap.yaml`:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Create `bootstrap.yaml`:
Create a file `bootstrap.yaml`:

Comment on lines +572 to +574
{{<callout context="note" title="Credentials" icon="outline/key">}}
For private registries, add `ocmConfig` to the Repository, Component, Resource, and Deployer specs. See [Configure Credentials for Controllers]({{<relref "configure-credentials-for-controllers.md">}}).
{{</callout>}}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't we inherit credentials from top to bottom, so from Repository to component to resource?

kubectl apply -f bootstrap.yaml
```

The controllers reconcile in order. Wait for the RGD to appear. This means that the Deployer successfully downloaded and applied it:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The controllers reconcile in order. Wait for the RGD to appear. This means that the Deployer successfully downloaded and applied it:
The controllers reconcile resources in order. Wait for the RGD to appear. This means that the Deployer successfully downloaded and applied it:


#### Deploy

Create `instance.yaml`. This triggers kro to create the `Resource`, `OCIRepository`, and `HelmRelease` objects defined in the RGD:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Create `instance.yaml`. This triggers kro to create the `Resource`, `OCIRepository`, and `HelmRelease` objects defined in the RGD:
Create a file `instance.yaml`. This triggers kro to create the `Resource`, `OCIRepository`, and `HelmRelease` objects defined in the RGD:

bootstrap-release-podinfo 1/1 1 1 4m25s
```

Verify localization. The image should reference your registry, not the original:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Verify localization. The image should reference your registry, not the original:
Verify if the **localization** worked correctly. The image should reference your registry, not the original:

Comment on lines +686 to +693
- [Tutorial: Create a Multi-Component Product]({{< relref "advanced-component-constructor.md" >}}), complex applications with multiple components
- [Concept: Deployer]({{< relref "kubernetes-deployer.md" >}}), architecture and lifecycle management
- [Concept: OCM Controllers]({{< relref "ocm-controllers.md" >}}), overview of the controller ecosystem

## Related Documentation

- [Configure Credentials for Controllers]({{< relref "configure-credentials-for-controllers.md" >}})
- [Setup Controller Environment]({{< relref "setup-controller-environment.md" >}})

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- [Tutorial: Create a Multi-Component Product]({{< relref "advanced-component-constructor.md" >}}), complex applications with multiple components
- [Concept: Deployer]({{< relref "kubernetes-deployer.md" >}}), architecture and lifecycle management
- [Concept: OCM Controllers]({{< relref "ocm-controllers.md" >}}), overview of the controller ecosystem
## Related Documentation
- [Configure Credentials for Controllers]({{< relref "configure-credentials-for-controllers.md" >}})
- [Setup Controller Environment]({{< relref "setup-controller-environment.md" >}})
- [How-To:](Configure Credentials for Controllers]({{< relref "configure-credentials-for-controllers.md" >}})
- [Tutorial: Create a Multi-Component Product]({{< relref "advanced-component-constructor.md" >}}), complex applications with multiple components
## Related Documentation
- [Concept: Deployer]({{< relref "kubernetes-deployer.md" >}}) - Understand the architecture and lifecycle management of our Kubernetes Controller
- [Concept: OCM Controllers]({{< relref "ocm-controllers.md" >}}) - Deep Dive into the OCM Controller ecosystem

@morri-son

Copy link
Copy Markdown
Contributor

Great to read and follow! My only comments are about wording and format, only nits.

class CV,Blob ocm
```

To reach the successful deployment status, the following chain of objects has to be reconciled. `Repository` -> `Component` -> `Resource` -> `Deployer`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
To reach the successful deployment status, the following chain of objects has to be reconciled. `Repository` -> `Component` -> `Resource` -> `Deployer`.
To reach the successful deployment status, the following chain of objects has to be reconciled: `Repository` -> `Component` -> `Resource` -> `Deployer`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Considering this is a concept document, this lacks some meat.
Also, I think we should exclude kro from our explanations here. Our controller can and do work standalone. KRO is one of the common use cases, but so is flux or argo, or even kro + flux or argo,

I think to prevent overwhelming users, this concept should be just about the controllers and we could have further sections on how integrate them with other tools.

Comment on lines +9 to +10
This tutorial walks you through deploying a Helm chart from an OCM component version to a Kubernetes cluster
using the OCM Controllers with kro and Flux. It covers two approaches:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we need such a tutorial, but this should not be the default "Deploy with Controllers" tutorial. This scenario should be an advanced tutorial building on this one.

Comment on lines +28 to +31
- [Controller environment]({{< relref "setup-controller-environment.md" >}}) set up (OCM Controllers, kro, and Flux)
- [OCM CLI]({{< relref "ocm-cli-installation.md" >}}) installed
- Access to an OCI registry (e.g., [ghcr.io](https://docs.github.com/en/packages/learn-github-packages/introduction-to-github-packages))
- A GitHub account with a personal access token

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A basic understanding of KRO and FluxCD (ideally with links to their intro sections)

Replace the `baseUrl` placeholder with your repository:

```shell
sed -i'' -e "s|OCM_REPO_PLACEHOLDER|$OCM_REPO|" rgd.yaml

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe envsubst might be better suited for that purpose?

{{< /step >}}

{{<callout context="note" title="globalAccess vs direct access" icon="outline/info-circle">}}
Unlike Part 1, this RGD uses `resource.access.globalAccess.toOCI()` instead of `resource.access.toOCI()`. When the component is transferred with `--copy-resources`, the resources are copied into the target registry and the component descriptor records a _local_ reference to them. The `globalAccess` field resolves the resource through its relocated OCI reference, which is required for the HelmRelease to pull the artifact ( the podinfo image ) from the correct registry.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this whole section is outdated.

ocm add cv
```

Then transfer it to the registry with `--copy-resources`. This copies the referenced OCI artifacts (Helm chart and image) into your registry, which is what enables localization. The component descriptor is updated to point at the new locations:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also, saying it "enables localization" feels weird. It's nothing we'd really like to have. I think even though this is a tutorial, you need to explain (or at least link) to a section that explains the rational about localization.

Maybe that's even worth its own concept.

{{< /steps >}}

{{<callout context="note">}}
If using a private registry, see the [OCM CLI credentials documentation]({{<relref "/docs/concepts/credential-system.md">}}).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you shouldn't link to a concept section here. The user is trying to work through a tutorial. Link him the https://deploy-preview-761--open-component-model.netlify.app/dev/docs/tutorials/credentials-for-ocm-controllers/ section.

Comment on lines +60 to +63
## Caching

Downloaded resource blobs are cached by digest in an LRU cache. If the digest has not changed between reconciliations, the Deployer skips re-downloading and re-applying. This reduces both network traffic and unnecessary applies.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nothing about descriptor caching? That's way more relevant for the overall performance (but maybe that should be explain in the controller concept section.

I think finding a natural way to split the Deployment Controller from the other controllers might become a challenge.

@matthiasbruns matthiasbruns dismissed their stale review March 20, 2026 15:17

it's my request - it was done, I just do not want the PR

@Skarlso

Skarlso commented Mar 20, 2026

Copy link
Copy Markdown
Contributor Author

This is not a great way to do this. I was trying to do everything in one PR and it made it a giant mess. I'm going to separate this into smaller, more digestible chunks and then we can go from there.

@Skarlso Skarlso closed this Mar 20, 2026
@Skarlso

Skarlso commented Mar 20, 2026

Copy link
Copy Markdown
Contributor Author

I will have a doc up about the deploy with controllers later today with the suggestions made by all of you. :)

Then the rest will come one-by-one :)

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Deployment Documentation

6 participants