<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Joseph Assiga</title>
<link>https://josephassiga.github.io/blog.html</link>
<atom:link href="https://josephassiga.github.io/blog.xml" rel="self" type="application/rss+xml"/>
<description>Long-form technical analyses, architecture notes, and product explorations focused on cloud platforms, OpenShift, and distributed systems.</description>
<generator>quarto-1.9.38</generator>
<lastBuildDate>Wed, 24 Jun 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>ABOM: a bill of materials for AI agents — block the action, sign the proof, hand it to the auditor</title>
  <dc:creator>Joseph Assiga</dc:creator>
  <link>https://josephassiga.github.io/posts/abom/</link>
  <description><![CDATA[ 





<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>TL;DR</strong> — An AI agent is a black box that now writes to systems and moves money. ABOM (<a href="https://pypi.org/project/abom-cli/"><code>pip install abom-cli</code></a>) gives it three things: a signed <em>Composition Manifest</em> (what it’s made of), an inline <em>gate</em> that <strong>denies</strong> any tool call outside that manifest <strong>before it runs</strong>, and a <em>Notary</em> — a Certificate-Transparency-style Merkle log — that lets an auditor verify what happened <strong>without trusting the operator</strong>. Open source, Apache-2.0, runs offline. Below: how it works, the cryptography that makes it more than a dashboard, and where it honestly is today (draft v0.1).</p>
</div>
</div>
</div>
<section id="why-this-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-this-matters">Why this matters</h2>
<blockquote class="blockquote">
<p>Your SIEM tells you the agent wired money to an attacker <em>yesterday</em>. That’s a log. A control stops the call <em>before</em> it executes — and proves it stopped it.</p>
</blockquote>
<p>Agentic AI crossed a line in 2025–26: agents stopped <em>suggesting</em> and started <em>acting</em>. They call tools, hit internal APIs, read confidential records, and — in the worst case — move money. Meanwhile the institutions running them are legally accountable for what their software does.</p>
<p>Three gaps fall out of that, and none of them have a clean answer today:</p>
<ol type="1">
<li><strong>Composition is opaque.</strong> No one can say, in <em>one signed document</em>, which models, tools, prompts, data sources and policies an agent is built from — or prove the deployed agent matches what was approved.</li>
<li><strong>Actions are unaccountable.</strong> When an agent makes a consequential decision, the evidence is scattered application logs you have to <em>trust</em> — not a tamper-evident record you can <em>verify</em> and hand to a regulator.</li>
<li><strong>Nothing stops a bad action.</strong> A prompt-injected agent that calls a tool it was never authorized to use is, in most stacks, only <em>logged after the fact</em>.</li>
</ol>
<p>We did this once before for software: the <strong>SBOM</strong> (Software Bill of Materials) went from nice-to-have to mandated in about three years. <a href="https://cyclonedx.org/capabilities/mlbom/">CycloneDX</a> even shipped an <strong>ML-BOM</strong> for models. ABOM — the <em>Agent</em> Bill of Materials — is the obvious next step: extend that standard to full agents, and add the runtime layer SBOMs never had.</p>
</section>
<section id="the-three-questions" class="level2">
<h2 class="anchored" data-anchor-id="the-three-questions">The three questions</h2>
<p>Every capability in ABOM maps to a question a risk team actually asks about an agent:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 33%">
<col style="width: 33%">
<col style="width: 33%">
</colgroup>
<thead>
<tr class="header">
<th>Question</th>
<th>ABOM answer</th>
<th>Mechanism</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>What is it <strong>made of</strong>?</td>
<td>Composition Manifest</td>
<td><code>abom scan</code> → a signed inventory</td>
</tr>
<tr class="even">
<td>What is it <strong>allowed to do</strong>?</td>
<td>The inline gate</td>
<td>deny-by-default, <em>before</em> execution</td>
</tr>
<tr class="odd">
<td>What did it <strong>actually do</strong>?</td>
<td>Provenance + Notary</td>
<td>Merkle-notarized, verifiable proofs</td>
</tr>
</tbody>
</table>
<p>If you’re non-technical, the analogy is: a <strong>nutrition label</strong>, a <strong>permission slip</strong>, and a <strong>flight recorder</strong> — all signed so none of them can be faked.</p>
</section>
<section id="what-the-agent-is-made-of-the-signed-manifest" class="level2">
<h2 class="anchored" data-anchor-id="what-the-agent-is-made-of-the-signed-manifest">1. What the agent is made of — the signed manifest</h2>
<p><code>abom scan</code> walks a repo’s dependencies and source and emits a <strong>Composition Manifest</strong>: every model (with weight hashes), tool, prompt, data source, policy, framework and MCP server it can find, each <code>ed25519</code>-signed.</p>
<p>Here’s a trimmed manifest for a fictional loan-document agent:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource json number-lines code-with-copy"><code class="sourceCode json"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span></span>
<span id="cb1-2">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"abom"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"0.1"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-3">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"extends"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CycloneDX ML-BOM"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-4">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"type"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"CompositionManifest"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-5">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"agent"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"name"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"loan-doc-agent"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"version"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"1.4.0"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"risk_class"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"high (Annex III)"</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">},</span></span>
<span id="cb1-6">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"components"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">[</span></span>
<span id="cb1-7">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"type"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"model"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"name"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"local/qwen2.5-coder"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"weights_sha256"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"9f2c…"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"egress"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">false</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">}</span><span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-8">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"type"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tool"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"name"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"read_kyc_doc"</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">}</span><span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-9">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"type"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"tool"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"name"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"http_fetch"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"scope"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"egress"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"allowed_endpoints"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">[</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"internal-kyc.bank"</span><span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">]</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb1-10">  <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">]</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-11">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"controls"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"egress"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"deny-by-default"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"residency"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"EU"</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">},</span></span>
<span id="cb1-12">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"composition_sha256"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"411d…"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span></span>
<span id="cb1-13">  <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"signature"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">{</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"alg"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ed25519"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">,</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">"value"</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"…"</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">}</span></span>
<span id="cb1-14"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">}</span></span></code></pre></div></div>
<p>The <code>composition_sha256</code> is the <strong>join key</strong>: every runtime record points back to the exact manifest it ran under, so a swapped model or a shadow tool at runtime shows up as drift.</p>
</section>
<section id="what-the-agent-is-allowed-to-do-block-dont-just-log" class="level2">
<h2 class="anchored" data-anchor-id="what-the-agent-is-allowed-to-do-block-dont-just-log">2. What the agent is allowed to do — block, don’t just log</h2>
<p>This is the part that turns a <em>bill of materials</em> into a <em>control</em>. The gate sits at the tool-call boundary. Before an action runs, it decides <strong>ALLOW</strong> or <strong>DENY</strong> against the signed manifest — and it is <strong>deny-by-default</strong>: a tool that isn’t in the manifest is blocked, not logged-and-allowed.</p>
<p>It’s framework-agnostic. The cleanest integration is a decorator:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb2-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> abom <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> Gate, Action, ActionDenied</span>
<span id="cb2-2"></span>
<span id="cb2-3">gate <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> Gate(signed_manifest, run_id<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"loan-doc-agent@1.4.0"</span>)</span>
<span id="cb2-4"></span>
<span id="cb2-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">@gate.gated</span>()                       <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># wrap any tool</span></span>
<span id="cb2-6"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">def</span> wire_transfer(amount, to):</span>
<span id="cb2-7">    ...                             <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># this body NEVER runs if wire_transfer</span></span>
<span id="cb2-8">                                    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># isn't declared in the signed manifest</span></span>
<span id="cb2-9"></span>
<span id="cb2-10"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">try</span>:</span>
<span id="cb2-11">    wire_transfer(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1_000_000</span>, to<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"attacker-iban"</span>)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># a prompt injection</span></span>
<span id="cb2-12"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">except</span> ActionDenied <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> e:</span>
<span id="cb2-13">    <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(e.decision.rule)          <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># → "tool_not_in_manifest"</span></span>
<span id="cb2-14">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># the money never moved, and the denial is notarized</span></span></code></pre></div></div>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The gate ships three decidable rules, evaluated in order (first failure wins): <code>tool_not_in_manifest</code>, <code>endpoint_not_allowed</code> (egress outside a tool’s allowlist), and <code>residency</code> (confidential data leaving via an egress tool).</p>
</div>
</div>
</div>
<section id="the-demo-end-to-end" class="level3">
<h3 class="anchored" data-anchor-id="the-demo-end-to-end">The demo, end to end</h3>
<p>The repo ships a <code>gate_demo.py</code> that tells the whole story. Here’s the real output — an agent doing legitimate work, then getting prompt-injected:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource text number-lines code-with-copy"><code class="sourceCode"><span id="cb3-1">[1] Agent reads a KYC document (declared tool)</span>
<span id="cb3-2">    → ALLOW  (manifest_allows)</span>
<span id="cb3-3"></span>
<span id="cb3-4">[2] Agent fetches from internal-kyc.bank (allowed endpoint)</span>
<span id="cb3-5">    → ALLOW  (manifest_allows)</span>
<span id="cb3-6"></span>
<span id="cb3-7">[3] ⚠  Prompt injection: agent calls wire_transfer($1,000,000)</span>
<span id="cb3-8">        (wire_transfer is NOT in the signed manifest)</span>
<span id="cb3-9">    → DENY  (tool_not_in_manifest)</span>
<span id="cb3-10">      tool 'wire_transfer' is not in the signed Composition Manifest</span>
<span id="cb3-11">      the money never moved — the call was blocked before execution</span>
<span id="cb3-12"></span>
<span id="cb3-13">[4] Agent tries http_fetch → evil.example.com (not on allowlist)</span>
<span id="cb3-14">    → DENY  (endpoint_not_allowed)</span></code></pre></div></div>
<p>The same logic is available as a CLI exit code, so it drops straight into CI or agent middleware — <code>0</code> for ALLOW, <code>1</code> for DENY:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb4-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">abom</span> gate abom.json <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--tool</span> read_kyc_doc      <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># → ALLOW, exit 0</span></span>
<span id="cb4-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">abom</span> gate abom.json <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--tool</span> wire_transfer     <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># → DENY,  exit 1</span></span></code></pre></div></div>
</section>
</section>
<section id="what-the-agent-actually-did-a-notary-you-can-verify" class="level2">
<h2 class="anchored" data-anchor-id="what-the-agent-actually-did-a-notary-you-can-verify">3. What the agent actually did — a Notary you can verify</h2>
<p>Here’s where it gets interesting, and where most “audit log” products quietly fall short.</p>
<p>A linked hash chain proves <em>internal consistency</em> — but an operator who controls the store can <strong>recompute the entire chain from genesis</strong> after editing a record. So a plain chain proves nothing to a third party who doesn’t trust the operator. That third party — an auditor, a regulator, a cyber-insurer — is exactly who the record is <em>for</em>.</p>
<p>ABOM’s Notary uses an <strong>append-only Merkle transparency log</strong>: the same <a href="https://datatracker.ietf.org/doc/html/rfc6962">RFC 6962 / Certificate Transparency</a> construction that underpins the web’s certificate ecosystem. It gives you two proofs that need <strong>no trust in the operator</strong>:</p>
<ul>
<li><strong>Inclusion proof</strong> — “this decision is in the log, at this position, under this signed tree head” (an <code>O(log n)</code> audit path).</li>
<li><strong>Consistency proof</strong> — “the log of size <em>m</em> is a prefix of the log of size <em>n</em>; nothing already published was edited or deleted.”</li>
</ul>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode numberSource python number-lines code-with-copy"><code class="sourceCode python"><span id="cb5-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">from</span> abom <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> verify_inclusion_hex, verify_payload</span>
<span id="cb5-2"></span>
<span id="cb5-3">decision <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> gate.check(action)</span>
<span id="cb5-4"></span>
<span id="cb5-5">verify_inclusion_hex(entry, decision.inclusion_proof)   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># → True</span></span>
<span id="cb5-6">verify_payload(head, decision.head_signature)           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># signed tree head → True</span></span></code></pre></div></div>
<p>Running the demo’s verification stage against a real run:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource text number-lines code-with-copy"><code class="sourceCode"><span id="cb6-1">  decisions notarized : 4</span>
<span id="cb6-2">  transparency log    : size=4  root=b63298020ffc410824e941ef…</span>
<span id="cb6-3"></span>
<span id="cb6-4">  auditor checks the wire_transfer denial (seq 2):</span>
<span id="cb6-5">    inclusion proof valid : True   (it IS in the signed log)</span>
<span id="cb6-6">    tree-head signature   : True   (signed by local key 7f7aa8d6efabb18f)</span>
<span id="cb6-7"></span>
<span id="cb6-8">  attacker tries to backdate the record (flip DENY → allow):</span>
<span id="cb6-9">    forged record included : False   (rejected — the proof no longer matches)</span></code></pre></div></div>
<p>That last line is the whole point: you can’t quietly flip a <code>DENY</code> to an <code>allow</code> after the fact. The forged entry no longer satisfies the inclusion proof, and the signed tree head won’t validate. <strong>The trust is cryptographic, not reputational.</strong></p>
<div class="callout callout-style-simple callout-important callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Important</span>Key custody is the real blocker, and it’s handled as a seam
</div>
</div>
<div class="callout-body-container callout-body">
<p>A demo that signs with a plaintext key on disk is rejected by any bank’s security team on sight — and it makes the tamper-evidence claim <em>false</em>, since whoever holds the key can forge tree heads. ABOM puts signing behind a <code>Signer</code> protocol: <code>LocalSigner</code> for dev/CI, and a <code>KMSSigner</code> seam where the private key lives in a <strong>KMS/HSM and never leaves it</strong>. Verification is backend-independent, so an auditor checks the same <code>ed25519</code> signature regardless of where the key was held.</p>
</div>
</div>
</section>
<section id="how-it-fits-together" class="level2">
<h2 class="anchored" data-anchor-id="how-it-fits-together">How it fits together</h2>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode numberSource text number-lines code-with-copy"><code class="sourceCode"><span id="cb7-1">        CUSTOMER TRUST BOUNDARY (your infra, air-gap capable)</span>
<span id="cb7-2">  ┌───────────────────────────────────────────────────────────┐</span>
<span id="cb7-3">  │  agent runtime (any framework: LangGraph / CrewAI / MCP)   │</span>
<span id="cb7-4">  │        │                                                   │</span>
<span id="cb7-5">  │        ▼                                                   │</span>
<span id="cb7-6">  │   abom scan ──▶ the gate ──▶ the Notary                    │</span>
<span id="cb7-7">  │   signed         deny-by-       Merkle log: inclusion +    │</span>
<span id="cb7-8">  │   Manifest       default,       consistency proofs,        │</span>
<span id="cb7-9">  │  (composition    BEFORE         signed tree heads (KMS)    │</span>
<span id="cb7-10">  │   _sha256)       execution                                 │</span>
<span id="cb7-11">  └───────────────────────────────────────────────────────────┘</span>
<span id="cb7-12">   keys in KMS/HSM · ed25519 — trust is in the keys + proofs</span></code></pre></div></div>
<p>Scan an agent → gate every tool call against its signed manifest → notarize every decision into a log anyone can verify.</p>
</section>
<section id="where-this-sits-next-to-cyclonedx" class="level2">
<h2 class="anchored" data-anchor-id="where-this-sits-next-to-cyclonedx">Where this sits next to CycloneDX</h2>
<p>ABOM <strong>extends</strong> CycloneDX ML-BOM rather than forking it — it rides the dominant, ECMA-standardized SBOM format. CycloneDX answers <em>“what is it made of.”</em> ABOM adds the runtime enforcement and provenance layer it doesn’t model. Component types map across (<code>model</code> → <code>machine-learning-model</code>, <code>tool</code> → <code>service</code>/<code>application</code>, and so on); the gate, the hash chain and the Merkle Notary are ABOM-only additions.</p>
<p>The <code>"extends": "CycloneDX ML-BOM"</code> lineage is declared on every document today; a <em>native</em> CycloneDX import/export is on the roadmap, not yet shipped — which brings us to the honest part.</p>
</section>
<section id="status" class="level2">
<h2 class="anchored" data-anchor-id="status">Build status — what’s real vs.&nbsp;roadmap</h2>
<p>Honesty about maturity is a feature for a trust project. ABOM is <strong>draft v0.1</strong>, pre-1.0. As of this writing:</p>
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>Capability</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><code>abom scan</code> → signed Composition Manifest</td>
<td>✅ Built</td>
</tr>
<tr class="even">
<td>Hash-chained Action Provenance + verification</td>
<td>✅ Built</td>
</tr>
<tr class="odd">
<td><code>ed25519</code> signing (<code>LocalSigner</code>)</td>
<td>✅ Built</td>
</tr>
<tr class="even">
<td>Inline gate — deny-by-default enforcement</td>
<td>✅ Built</td>
</tr>
<tr class="odd">
<td>Merkle transparency log — inclusion + consistency proofs</td>
<td>✅ Built</td>
</tr>
<tr class="even">
<td>Decidable policy checks (<code>abom verify</code>)</td>
<td>✅ Built</td>
</tr>
<tr class="odd">
<td>KMS/HSM-backed signing (<code>KMSSigner</code> seam)</td>
<td>🚧 In construction</td>
</tr>
<tr class="even">
<td>OPA/Rego policy engine (currently JSON)</td>
<td>🚧 In construction</td>
</tr>
<tr class="odd">
<td>Hardened, queryable Notary registry + API</td>
<td>🚧 In construction</td>
</tr>
<tr class="even">
<td>SDK runtime hooks / framework adapters</td>
<td>🚧 In construction</td>
</tr>
<tr class="odd">
<td>Native CycloneDX / SIEM export · eBPF egress · air-gap bundle</td>
<td>📋 Planned</td>
</tr>
</tbody>
</table>
<div class="callout callout-style-simple callout-warning">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Two things I’d <em>not</em> over-claim. <strong>Completeness:</strong> the gate only mediates the tool calls routed through it — it doesn’t magically observe egress it can’t see, so the manifest declares its own capture boundary rather than pretending to catch everything. <strong>The regulation timeline:</strong> the EU AI Act’s high-risk record-keeping obligations (Art. 12) were deferred to ~Dec 2027 by the Digital Omnibus, and DORA doesn’t literally mandate an agent BOM. The regulatory tailwind is real, but it’s the <em>inevitability</em> slide — not the reason to adopt this today. The reason to adopt it today is that your agents are already taking actions you can’t bound.</p>
</div>
</div>
</div>
</section>
<section id="try-it" class="level2">
<h2 class="anchored" data-anchor-id="try-it">Try it</h2>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb8-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">pip</span> install abom-cli</span>
<span id="cb8-2"></span>
<span id="cb8-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">abom</span> scan .                                <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># → signed abom.json</span></span>
<span id="cb8-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">abom</span> verify abom.json <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--policy</span> policy.json <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># enforce policy (exit 1 on violations)</span></span>
<span id="cb8-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">abom</span> gate abom.json <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--tool</span> wire_transfer   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># deny-by-default, notarized (exit 1)</span></span></code></pre></div></div>
<p>Or from source, to run the full walkthrough:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb9-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> clone https://github.com/josephassiga/abom-dev</span>
<span id="cb9-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">cd</span> abom-dev/cli <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">&amp;&amp;</span> <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">pip</span> install <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-e</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">".[dev]"</span></span>
<span id="cb9-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">pytest</span> tests/ <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-q</span>                           <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 55 passing, incl. RFC 6962 Merkle proofs</span></span>
<span id="cb9-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">python</span> demo/gate_demo.py                   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># prompt-injection → blocked → notarized → audited</span></span></code></pre></div></div>
</section>
<section id="closing-thought" class="level2">
<h2 class="anchored" data-anchor-id="closing-thought">Closing thought</h2>
<p>The market is racing to make agents <em>do more</em>. ABOM is a bet on the unglamorous layer underneath: making an agent <strong>answerable and controllable</strong> — <em>what is it made of, what is it allowed to do, and what did it do?</em> — answered in a signed, standard, portable artifact you can hand to an auditor.</p>
<p>Underneath the software, it’s really a trust primitive. And the trust is cryptographic, not reputational — which, for anything an autonomous agent is allowed to do with your money, is the only kind that should count.</p>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>ABOM is open source (Apache-2.0) and a work in progress. Code, spec and the demo live at <a href="https://github.com/josephassiga/abom-dev">github.com/josephassiga/abom-dev</a>; the package is <a href="https://pypi.org/project/abom-cli/"><code>abom-cli</code></a> on PyPI. Feedback and spec proposals welcome.</p>
</div>
</div>
</div>


</section>

 ]]></description>
  <category>ai</category>
  <category>security</category>
  <category>agents</category>
  <category>supply-chain</category>
  <category>compliance</category>
  <category>devops</category>
  <guid>https://josephassiga.github.io/posts/abom/</guid>
  <pubDate>Wed, 24 Jun 2026 00:00:00 GMT</pubDate>
  <media:content url="https://josephassiga.github.io/images/abom.svg" medium="image" type="image/svg+xml"/>
</item>
<item>
  <title>Installing Red Hat OpenShift AI Self-Managed 3.4(latest) in Red Hat Openshift 4.22(latest) on AWS: A Shell-Based Guide</title>
  <dc:creator>Joseph Assiga</dc:creator>
  <link>https://josephassiga.github.io/posts/ocp-install/</link>
  <description><![CDATA[ 





<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>TL;DR</strong> — Save the shell script below, edit <code>OCP_VERSION</code> and your <code>install-config.yaml</code>, then run <code>openshift-install create cluster --dir ocp-install</code>. The full annotated walkthrough is below.</p>
</div>
</div>
</div>
<p>This post documents a compact, repeatable shell-based workflow used to install OpenShift 4.x on AWS. I extracted the working script, annotated each step, and included a sample <code>install-config.yaml</code> for a minimal IPI installation.</p>
<section id="why-this-matters" class="level2">
<h2 class="anchored" data-anchor-id="why-this-matters">Why this matters</h2>
<blockquote class="blockquote">
<p>Repeatable installs are the difference between a cluster you understand and one you merely possess.</p>
</blockquote>
<ul>
<li><strong>Repeatability</strong> — encapsulates download, install, and bootstrap steps.</li>
<li><strong>Auditability</strong> — the full script appears below so you can review before running.</li>
<li><strong>Tunable</strong> — variables like <code>OCP_VERSION</code> and <code>ARCH</code> are exposed for quick edits.</li>
</ul>
<div id="fig-ocp-flow" class="quarto-float quarto-figure quarto-figure-center anchored" data-fig-align="center">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-ocp-flow-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://josephassiga.github.io/images/ocp-install.svg" class="img-fluid quarto-figure quarto-figure-center figure-img" style="width:80.0%">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-ocp-flow-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: High-level installation flow.
</figcaption>
</figure>
</div>
</section>
<section id="aws-prerequisites-at-a-glance" class="level2">
<h2 class="anchored" data-anchor-id="aws-prerequisites-at-a-glance">AWS prerequisites — at a glance</h2>
<p>Before you run the installer, you need an EC2 host to drive the install and a public Route 53 hosted zone matching your <code>baseDomain</code>.</p>
<div class="quarto-layout-panel" data-layout-ncol="2">
<div class="quarto-layout-row">
<div class="quarto-layout-cell" style="flex-basis: 50.0%;justify-content: flex-start;">
<div id="fig-ec2" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-ec2-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://josephassiga.github.io/images/create-ec2.png" class="img-fluid figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-ec2-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: Create the installer EC2 host.
</figcaption>
</figure>
</div>
</div>
<div class="quarto-layout-cell" style="flex-basis: 50.0%;justify-content: flex-start;">
<div id="fig-hostedzone" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-hostedzone-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://josephassiga.github.io/images/create-public-hostedzone.png" class="img-fluid figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-hostedzone-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;3: Create the public Route 53 hosted zone.
</figcaption>
</figure>
</div>
</div>
</div>
</div>
<p>Both screenshots show the minimum configuration that satisfies the OpenShift installer’s IAM and DNS expectations.</p>
<div class="callout callout-style-default callout-tip callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Tip</span>Pick a specific version
</div>
</div>
<div class="callout-body-container callout-body">
<p>Avoid <code>latest-4.22</code> for production runs — pin to a release like <code>4.22.3</code> so the install is reproducible months later when <code>latest</code> has moved on.</p>
</div>
</div>
</section>
<section id="prerequisites" class="level2">
<h2 class="anchored" data-anchor-id="prerequisites">Prerequisites</h2>
<ul>
<li>A Linux host with <code>curl</code>, <code>tar</code>, and <code>ssh</code> available.</li>
<li>IAM permissions matching the <a href="https://docs.openshift.com/container-platform/latest/installing/installing_aws/installing-aws-account.html">OpenShift required AWS permissions</a>.</li>
<li>A valid OpenShift pull secret and an SSH key.</li>
</ul>
</section>
<section id="the-script-annotated" class="level2">
<h2 class="anchored" data-anchor-id="the-script-annotated">The script (annotated)</h2>
<p>Rather than dropping the full <code>ocp-install.sh</code> here as one block, this section walks through the script <strong>one command group at a time</strong> so you can copy, adapt, and run each step independently.</p>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The whole file is also available as a single download: <a href="../../images/ocp-install.sh"><code>ocp-install.sh</code></a>. The sections below correspond 1:1 to the blocks inside it.</p>
</div>
</div>
</div>
<section id="patch-the-host" class="level3">
<h3 class="anchored" data-anchor-id="patch-the-host">1. Patch the host</h3>
<p>A predictable starting state. Run a full package update so the build host isn’t carrying half-applied kernel or <code>curl</code> patches when the installer hits the network.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> yum update <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-y</span></span></code></pre></div></div>
</section>
<section id="working-directory-and-pinned-versions" class="level3">
<h3 class="anchored" data-anchor-id="working-directory-and-pinned-versions">2. Working directory and pinned versions</h3>
<p>Everything below assumes a dedicated <code>tools/</code> directory and three exported variables. Pinning <code>OCP_VERSION</code> to a specific release (not <code>latest-*</code>) is what makes the install reproducible weeks later.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mkdir</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-p</span> tools <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">&amp;&amp;</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">cd</span> tools/</span>
<span id="cb2-2"></span>
<span id="cb2-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">export</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">OCP_VERSION</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"latest-4.22"</span>   <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># pin to e.g. 4.22.3 for production</span></span>
<span id="cb2-4"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">export</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">ARCH</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"x86_64"</span></span>
<span id="cb2-5"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">export</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">HOST_ARCH</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$(</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">uname</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-m</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">)</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span></code></pre></div></div>
</section>
<section id="install-the-oc-and-kubectl-clients" class="level3">
<h3 class="anchored" data-anchor-id="install-the-oc-and-kubectl-clients">3. Install the <code>oc</code> and <code>kubectl</code> clients</h3>
<p>Download the client tarball from the Red Hat mirror, extract the two binaries, and move them onto <code>PATH</code>. The <code>-fsSL</code> flags make <code>curl</code> fail loudly on HTTP errors instead of silently writing an HTML error page into <code>oc.tar.gz</code>.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb3-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">curl</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-fsSLk</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb3-2">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://mirror.openshift.com/pub/openshift-v4/</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">${HOST_ARCH}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/clients/ocp/</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">${OCP_VERSION}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/openshift-client-linux.tar.gz"</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb3-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-o</span> oc.tar.gz</span>
<span id="cb3-4"></span>
<span id="cb3-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tar</span> zxf oc.tar.gz</span>
<span id="cb3-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rm</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> oc.tar.gz README.md</span>
<span id="cb3-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">chmod</span> +x oc kubectl</span>
<span id="cb3-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> mv oc kubectl /usr/local/bin/</span></code></pre></div></div>
<p>Verify before moving on:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb4" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb4-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> version <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--client</span></span>
<span id="cb4-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">kubectl</span> version <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--client</span></span>
<span id="cb4-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">Client</span> Version: 4.22.0</span>
<span id="cb4-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">Kustomize</span> Version: v5.7.1</span>
<span id="cb4-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">Client</span> Version: v1.35.2</span>
<span id="cb4-6"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">Kustomize</span> Version: v5.7.1</span></code></pre></div></div>
</section>
<section id="install-the-openshift-install-binary" class="level3">
<h3 class="anchored" data-anchor-id="install-the-openshift-install-binary">4. Install the <code>openshift-install</code> binary</h3>
<p>Same pattern, different tarball. This is the installer that orchestrates the bootstrap node, control plane, and AWS resources.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb5" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb5-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">curl</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-fsSLk</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb5-2">  <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"https://mirror.openshift.com/pub/openshift-v4/</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">${HOST_ARCH}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/clients/ocp/</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">${OCP_VERSION}</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">/openshift-install-linux.tar.gz"</span> <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb5-3">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-o</span> openshift-install-linux.tar.gz</span>
<span id="cb5-4"></span>
<span id="cb5-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">tar</span> zxf openshift-install-linux.tar.gz</span>
<span id="cb5-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">rm</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> openshift-install-linux.tar.gz README.md</span>
<span id="cb5-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">chmod</span> +x openshift-install</span>
<span id="cb5-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sudo</span> mv openshift-install /usr/local/bin/</span></code></pre></div></div>
<p>Verify the version matches <code>OCP_VERSION</code>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb6" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb6-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">[ec2-user@ip-172-31-27-222</span> ~]$ openshift-install version</span>
<span id="cb6-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">openshift-install</span> 4.22.0</span>
<span id="cb6-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">built</span> from commit 92cb4e39665966fd3128abd6256b13aa56523eeb</span>
<span id="cb6-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">release</span> image quay.io/openshift-release-dev/ocp-release@sha256:283887f2860a745387608d106e70e5be2314df2497ee08c69e7bc669ca091340</span>
<span id="cb6-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">release</span> architecture amd64</span></code></pre></div></div>
</section>
<section id="generate-the-cluster-ssh-key" class="level3">
<h3 class="anchored" data-anchor-id="generate-the-cluster-ssh-key">5. Generate the cluster SSH key</h3>
<p>The installer bakes this public key into every node so you can <code>ssh core@…</code> later for diagnostics. Use a dedicated key per cluster — don’t reuse your personal one.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb7" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb7-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ssh-keygen</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-t</span> ed25519 <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-N</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">''</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> ~/.ssh/rhoai-demo</span>
<span id="cb7-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">eval</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$(</span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ssh-agent</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-s</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">)</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb7-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ssh-add</span> ~/.ssh/rhoai-demo</span></code></pre></div></div>
<div class="callout callout-style-simple callout-warning">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><code>~/.ssh/rhoai-demo</code> is a <strong>private key</strong>. Add it to <code>.gitignore</code> and never copy it into a container image or CI artifact.</p>
</div>
</div>
</div>
</section>
<section id="launch-the-install" class="level3">
<h3 class="anchored" data-anchor-id="launch-the-install">6. Launch the install</h3>
<p>Drop the <code>install-config.yaml</code> from the next section into <code>./ocp-install/</code>, then hand control over to the installer. The <code>--dir</code> flag is what makes re-runs, <code>gather</code>, and <code>destroy</code> work consistently against the same state.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb8" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb8-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mkdir</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-p</span> ocp-install</span>
<span id="cb8-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Place install-config.yaml inside ./ocp-install/ first, then:</span></span>
<span id="cb8-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">openshift-install</span> create cluster <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--dir</span> ocp-install <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--log-level</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>info</span></code></pre></div></div>
<p>Expect 30–45 minutes for an AWS IPI install. Watch progress with: ## Prepare the <code>install-config.yaml</code> file:</p>
<p>Adapt <code>baseDomain</code>, instance types, and <code>pullSecret</code> before use.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb9" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb9-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">[ec2-user@ip-172-31-27-222</span> ~]$ mkdir <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-p</span> ocp-install</span>
<span id="cb9-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Place install-config.yaml inside ./ocp-install/ first, then:</span></span>
<span id="cb9-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">[ec2-user@ip-172-31-27-222</span> ~]$ cat ocp-install/install-config.yaml</span>
<span id="cb9-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">apiVersion:</span> v1</span>
<span id="cb9-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">baseDomain:</span> belowthestack.dev</span>
<span id="cb9-6"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">compute:</span></span>
<span id="cb9-7">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">-</span> architecture: amd64</span>
<span id="cb9-8">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">hyperthreading:</span> Enabled</span>
<span id="cb9-9">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">name:</span> worker</span>
<span id="cb9-10">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">platform:</span></span>
<span id="cb9-11">      <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">aws:</span></span>
<span id="cb9-12">        <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">type:</span> m6i.4xlarge</span>
<span id="cb9-13">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">replicas:</span> 0</span>
<span id="cb9-14"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">controlPlane:</span></span>
<span id="cb9-15">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">architecture:</span> amd64</span>
<span id="cb9-16">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">hyperthreading:</span> Enabled</span>
<span id="cb9-17">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">name:</span> master</span>
<span id="cb9-18">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">platform:</span></span>
<span id="cb9-19">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">aws:</span></span>
<span id="cb9-20">      <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">type:</span> g6.12xlarge</span>
<span id="cb9-21">      <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">rootVolume:</span></span>
<span id="cb9-22">        <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">size:</span> 1000</span>
<span id="cb9-23">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">replicas:</span> 1</span>
<span id="cb9-24"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">metadata:</span></span>
<span id="cb9-25">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">name:</span> rhoai-demo</span>
<span id="cb9-26"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">networking:</span></span>
<span id="cb9-27">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">clusterNetwork:</span></span>
<span id="cb9-28">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">-</span> cidr: 10.128.0.0/14</span>
<span id="cb9-29">      <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">hostPrefix:</span> 23</span>
<span id="cb9-30">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">machineNetwork:</span></span>
<span id="cb9-31">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">-</span> cidr: 10.0.0.0/16</span>
<span id="cb9-32">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">networkType:</span> OVNKubernetes</span>
<span id="cb9-33">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">serviceNetwork:</span></span>
<span id="cb9-34">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">-</span> 172.30.0.0/16</span>
<span id="cb9-35"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">platform:</span></span>
<span id="cb9-36">  <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">aws:</span></span>
<span id="cb9-37">    <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">region:</span> eu-west-3</span>
<span id="cb9-38"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">publish:</span> External</span>
<span id="cb9-39"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">pullSecret:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'{"auths":{"cloud.openshift.com":{"auth":"&lt;token&gt;","email":"&lt;email&gt;"}}}'</span></span>
<span id="cb9-40"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">sshKey:</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'ssh-ed25519 AAAA...redacted...'</span></span></code></pre></div></div>
</section>
</section>
<section id="what-a-successful-install-looks-like" class="level2">
<h2 class="anchored" data-anchor-id="what-a-successful-install-looks-like">What a successful install looks like</h2>
<p>After the bootstrap phase finishes and the cluster operators settle, the installer prints a final summary block. If you see something close to the output below, the cluster is up and the web console is reachable.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb10" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb10-1"> <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">[ec2-user@ip-172-31-27-222</span> ~]$ openshift-install create cluster <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--dir</span> ocp-install/ <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--log-level</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>info</span>
<span id="cb10-2"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">{.text</span> filename=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"installer output"</span>}</span>
<span id="cb10-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> Waiting up to 30m0s <span class="er" style="color: #AD0000;
background-color: null;
font-style: inherit;">(</span><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">until</span> <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">3:53AM</span> UTC<span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">)</span> <span class="ex" style="color: null;
background-color: null;
font-style: inherit;">to</span> ensure each cluster operator has finished progressing...</span>
<span id="cb10-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> All cluster operators have completed progressing</span>
<span id="cb10-5"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> Checking to see if there is a route at openshift-console/console...</span>
<span id="cb10-6"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> Install complete!</span>
<span id="cb10-7"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> To access the cluster as the system:admin user when using <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'oc'</span>, run</span>
<span id="cb10-8"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span>     export KUBECONFIG=/home/ec2-user/ocp-install/auth/kubeconfig</span>
<span id="cb10-9"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> Access the OpenShift web-console here: https://console-openshift-console...</span>
<span id="cb10-10"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> Login to the console with user: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"kubeadmin"</span>, and password: <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"UoGgI-xxxx"</span></span>
<span id="cb10-11"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">INFO</span> Time elapsed: 29s</span></code></pre></div></div>
<p>Two things worth doing immediately:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb11" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb11-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 1. Wire up oc/kubectl against the new cluster</span></span>
<span id="cb11-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">export</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">KUBECONFIG</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>/home/ec2-user/ocp-install/auth/kubeconfig</span>
<span id="cb11-3"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> get nodes</span>
<span id="cb11-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> get clusteroperators</span></code></pre></div></div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb12" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb12-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># 2. Save (and then rotate) the kubeadmin credentials</span></span>
<span id="cb12-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">cat</span> ocp-install/auth/kubeadmin-password</span></code></pre></div></div>
<div class="callout callout-style-simple callout-important">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The <code>kubeadmin</code> account is a temporary bootstrap credential. As soon as you’ve wired up a real identity provider (OIDC, htpasswd, LDAP…) and granted <code>cluster-admin</code> to a real user, delete the <code>kubeadmin</code> secret:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb13" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb13-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> delete secret kubeadmin <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-n</span> kube-system</span></code></pre></div></div>
</div>
</div>
</div>
<div class="callout callout-style-default callout-warning callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Warning</span>Never commit secrets
</div>
</div>
<div class="callout-body-container callout-body">
<p><code>pullSecret</code> and the contents of <code>~/.ssh/rhoai-demo</code> are credentials. Add <code>install-config.yaml</code>, <code>*.pem</code>, and <code>auth/</code> to your <code>.gitignore</code> <em>before</em> running the installer — the installer mutates this file and writes <code>auth/kubeadmin-password</code> and <code>auth/kubeconfig</code> next to it.</p>
</div>
</div>
</section>
<section id="inside-the-openshift-web-console" class="level2">
<h2 class="anchored" data-anchor-id="inside-the-openshift-web-console">Inside the OpenShift web console</h2>
<p>Browsing to the URL printed by the installer (<code>https://console-openshift-console.apps.rhoai-demo.xxxx.dev</code>) and logging in with <code>kubeadmin</code> lands on the cluster <strong>Overview</strong>. This is the first place I check after every install — it confirms the control plane, operators, and Insights all came up green before any workloads are scheduled.</p>
<div id="fig-ocp-console" class="quarto-float quarto-figure quarto-figure-center anchored" data-fig-align="center">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-ocp-console-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://josephassiga.github.io/images/ocp-console-overview.png" class="img-fluid quarto-figure quarto-figure-center figure-img" style="width:100.0%">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-ocp-console-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;4: Red Hat OpenShift 4.22 web console — cluster Overview right after install.
</figcaption>
</figure>
</div>
<p>A few things worth noticing in Figure&nbsp;4:</p>
<ul>
<li><strong>Top banner</strong> — <em>“You are logged in as a temporary administrative user…”</em> is the cluster reminding you that <code>kubeadmin</code> is bootstrap-only and you should configure a real identity provider via <em>cluster OAuth</em>.</li>
<li><strong>Status tiles</strong> — Control Plane, Operators, and Insights are all green. <em>Single control plane node</em> matches the <code>controlPlane.replicas: 1</code> lab topology from the install-config.</li>
<li><strong>Details panel</strong> — confirms <code>OpenShift version: 4.22.0</code>, <code>Infrastructure provider: AWS</code>, and the cluster API endpoint <code>https://api.rhoai-demo.xxxx.dev:6443</code> used by <code>oc</code>/<code>kubectl</code>.</li>
<li><strong>AlertmanagerReceiversNotConfigured</strong> — expected on a fresh cluster. Wire up a receiver (PagerDuty, Slack, email…) before treating any workload as production.</li>
</ul>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The console’s <em>Getting started resources</em> panel (“Add identity providers”, “Configure alert receivers”, “Take console tour”) is a sensible day-0 checklist — work through it before installing the RHOAI operator on top.</p>
</div>
</div>
</div>
</section>
<section id="installing-red-hat-openshift-ai-3.4" class="level2">
<h2 class="anchored" data-anchor-id="installing-red-hat-openshift-ai-3.4">Installing Red Hat OpenShift AI 3.4</h2>
<p>With OpenShift 4.22 healthy, RHOAI installs as a stack of operators plus two custom resources — a <code>DSCInitialization</code> (one-time bootstrap) and a <code>DataScienceCluster</code> (the components you actually want enabled). The flow below uses the <strong>CLI</strong> end-to-end so it is scriptable and easy to re-run.</p>
<section id="install-the-prerequisite-operators" class="level3">
<h3 class="anchored" data-anchor-id="install-the-prerequisite-operators">1. Install the prerequisite operators</h3>
<p>Each prerequisite below gets its <strong>own namespace</strong>, its <strong>own <code>OperatorGroup</code></strong>, and a pinned <code>Subscription</code>. This is more verbose than dropping everything into <code>openshift-operators</code>, but it makes each operator’s blast radius and upgrade lifecycle explicit — and gives you something concrete to delete if you ever want to uninstall one cleanly.</p>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Save each manifest to a file and apply with <code>oc apply -f &lt;file&gt;</code>. The <code>OperatorGroup</code> scope (empty <code>spec</code> for AllNamespaces, explicit <code>targetNamespaces</code> for OwnNamespace) matches each operator’s supported install mode.</p>
</div>
</div>
</div>
<section id="red-hat-openshift-serverless" class="level4">
<h4 class="anchored" data-anchor-id="red-hat-openshift-serverless">1.1 Red Hat OpenShift Serverless</h4>
<p>Serverless (Knative) is what backs <strong>KServe</strong> model serving in RHOAI 3.4. Without it, the <code>kserve</code> component will refuse to come up healthy.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-serverless.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb14" data-filename="op-serverless.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb14-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb14-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb14-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb14-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb14-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> serverless-operator</span></span>
<span id="cb14-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-serverless</span></span>
<span id="cb14-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb14-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable</span></span>
<span id="cb14-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> serverless-operator</span></span>
<span id="cb14-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb14-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb14-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb15" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb15-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-serverless.yaml</span></code></pre></div></div>
</section>
<section id="red-hat-openshift-service-mesh" class="level4">
<h4 class="anchored" data-anchor-id="red-hat-openshift-service-mesh">1.2 Red Hat OpenShift Service Mesh</h4>
<p>Service Mesh (Istio) provides the ingress gateway and mTLS plumbing that KServe + the RHOAI dashboard sit behind.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-servicemesh.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb16" data-filename="op-servicemesh.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb16-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb16-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb16-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb16-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb16-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> servicemeshoperator3</span></span>
<span id="cb16-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-operators</span></span>
<span id="cb16-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb16-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable</span></span>
<span id="cb16-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span>
<span id="cb16-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> servicemeshoperator3</span></span>
<span id="cb16-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb16-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb16-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">startingCSV</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> servicemeshoperator3.v3.3.3</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb17" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb17-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-servicemesh.yaml</span></code></pre></div></div>
</section>
<section id="red-hat-openshift-pipelines" class="level4">
<h4 class="anchored" data-anchor-id="red-hat-openshift-pipelines">1.3 Red Hat OpenShift Pipelines</h4>
<p>Pipelines (Tekton) is the engine behind RHOAI’s <strong>Data Science Pipelines</strong> component.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-pipelines.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb18" data-filename="op-pipelines.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb18-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb18-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb18-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb18-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb18-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-pipelines-operator-rh</span></span>
<span id="cb18-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-operators</span></span>
<span id="cb18-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb18-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> latest</span></span>
<span id="cb18-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span>
<span id="cb18-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-pipelines-operator-rh</span></span>
<span id="cb18-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb18-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb18-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">startingCSV</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-pipelines-operator-rh.v1.22.2</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb19" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb19-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-pipelines.yaml</span></code></pre></div></div>
</section>
<section id="authorino" class="level4">
<h4 class="anchored" data-anchor-id="authorino">1.4 Authorino</h4>
<p>Authorino handles the auth layer in front of KServe inference endpoints.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-authorino.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb20" data-filename="op-authorino.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb20-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb20-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb20-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb20-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb20-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> authorino-operator</span></span>
<span id="cb20-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-operators</span></span>
<span id="cb20-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb20-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable</span></span>
<span id="cb20-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span>
<span id="cb20-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> authorino-operator</span></span>
<span id="cb20-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb20-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb20-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">startingCSV</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> authorino-operator.v1.2.2</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb21" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb21-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-authorino.yaml</span></code></pre></div></div>
</section>
<section id="red-hat-cert-manager-operator" class="level4">
<h4 class="anchored" data-anchor-id="red-hat-cert-manager-operator">1.5 Red Hat cert-manager Operator</h4>
<p>cert-manager issues and rotates the TLS certificates that <strong>KServe</strong> uses for its inference endpoints and that <strong>Service Mesh</strong> consumes for ingress gateway termination. RHOAI 3.4 will refuse to bring <code>kserve</code> to <code>Ready</code> if no cert-manager CRDs are present in the cluster.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-cert-manager.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb22" data-filename="op-cert-manager.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb22-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb22-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> v1</span></span>
<span id="cb22-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Namespace</span></span>
<span id="cb22-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb22-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cert-manager-operator</span></span>
<span id="cb22-6"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb22-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1</span></span>
<span id="cb22-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> OperatorGroup</span></span>
<span id="cb22-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb22-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-cert-manager-operator</span></span>
<span id="cb22-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cert-manager-operator</span></span>
<span id="cb22-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb22-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">targetNamespaces</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb22-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-nfd</span></span>
<span id="cb22-15"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">upgradeStrategy</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Default</span></span>
<span id="cb22-16"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb22-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb22-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb22-19"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb22-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-cert-manager-operator</span></span>
<span id="cb22-21"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cert-manager-operator</span></span>
<span id="cb22-22"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb22-23"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable-v1</span></span>
<span id="cb22-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-cert-manager-operator</span></span>
<span id="cb22-25"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb22-26"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb22-27"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb23" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb23-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-cert-manager.yaml</span></code></pre></div></div>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>After the operator is up, create a <code>ClusterIssuer</code> (Let’s Encrypt, an internal CA, or a self-signed one for lab clusters) so KServe and other RHOAI components have somewhere to ask for certificates. You can do this <em>after</em> the RHOAI install — KServe will pick it up when it’s there.</p>
</div>
</div>
</div>
</section>
<section id="jobset-operator" class="level4">
<h4 class="anchored" data-anchor-id="jobset-operator">1.6 JobSet Operator</h4>
<p>Batch-style group scheduling for distributed training. RHOAI’s Training Operator (PyTorchJob, RayJob, etc.) hands work off to JobSet so all workers come up together (gang scheduling) instead of straggling.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-jobset.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb24" data-filename="op-jobset.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb24-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb24-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> v1</span></span>
<span id="cb24-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Namespace</span></span>
<span id="cb24-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb24-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-jobset-operator</span></span>
<span id="cb24-6"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb24-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1</span></span>
<span id="cb24-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> OperatorGroup</span></span>
<span id="cb24-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb24-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> jobset-operators</span></span>
<span id="cb24-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-jobset-operator</span></span>
<span id="cb24-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb24-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">targetNamespaces</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb24-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-jobset-operator</span></span>
<span id="cb24-15"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">upgradeStrategy</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Default</span></span>
<span id="cb24-16"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb24-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb24-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb24-19"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb24-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> jobset-operator</span></span>
<span id="cb24-21"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-jobset-operator</span></span>
<span id="cb24-22"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb24-23"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable-v1.0</span></span>
<span id="cb24-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span>
<span id="cb24-25"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> job-set</span></span>
<span id="cb24-26"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb24-27"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb24-28"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">startingCSV</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> jobset-operator.v1.0.0</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb25" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb25-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-jobset.yaml</span></code></pre></div></div>
<p>You will need to create an instance of the <code>JobSetOperator</code> CR with name <code>cluster</code> for the RHOAI operator to successfully work.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-jobset-instance.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb26" data-filename="op-jobset-instance.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb26-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb26-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operator.openshift.io/v1</span></span>
<span id="cb26-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> JobSetOperator</span></span>
<span id="cb26-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb26-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cluster</span></span>
<span id="cb26-6"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb26-7"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">logLevel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Normal</span></span>
<span id="cb26-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">operatorLogLevel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Normal</span></span>
<span id="cb26-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Managed</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb27" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb27-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-jobset-instance.yaml</span></code></pre></div></div>
</section>
<section id="leader-worker-set-operator" class="level4">
<h4 class="anchored" data-anchor-id="leader-worker-set-operator">1.7 Leader Worker Set Operator</h4>
<p>LWS is the workload abstraction RHOAI uses for <strong>multi-host inference</strong> — splitting a single large model (Llama-405B, Granite-MoE) across multiple GPU nodes with one leader pod orchestrating N worker pods.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-lws.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb28" data-filename="op-lws.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb28-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb28-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> v1</span></span>
<span id="cb28-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Namespace</span></span>
<span id="cb28-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb28-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-lws-operator</span></span>
<span id="cb28-6"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb28-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1</span></span>
<span id="cb28-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> OperatorGroup</span></span>
<span id="cb28-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb28-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-lws-operator</span></span>
<span id="cb28-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-lws-operator</span></span>
<span id="cb28-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb28-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">targetNamespaces</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb28-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-lws-operator</span></span>
<span id="cb28-15"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">upgradeStrategy</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Default</span></span>
<span id="cb28-16"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb28-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb28-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb28-19"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb28-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> leader-worker-set</span></span>
<span id="cb28-21"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-lws-operator</span></span>
<span id="cb28-22"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb28-23"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable-v1.0</span></span>
<span id="cb28-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span>
<span id="cb28-25"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> leader-worker-set</span></span>
<span id="cb28-26"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb28-27"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb28-28"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">startingCSV</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> leader-worker-set.v1.0.0</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb29" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb29-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-lws.yaml</span></code></pre></div></div>
</section>
<section id="red-hat-connectivity-link-operator" class="level4">
<h4 class="anchored" data-anchor-id="red-hat-connectivity-link-operator">1.8 Red Hat Connectivity Link Operator</h4>
<p>The productised name for Kuadrant — authn/authz, rate limiting, and DNS policy on top of the <strong>Gateway API</strong> ingress that RHOAI 3.x KServe uses in place of OpenShift Routes.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-connectivity-link.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb30" data-filename="op-connectivity-link.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb30-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb30-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb30-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb30-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb30-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhcl-operator</span></span>
<span id="cb30-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-operators</span></span>
<span id="cb30-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb30-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable</span></span>
<span id="cb30-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span>
<span id="cb30-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhcl-operator</span></span>
<span id="cb30-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb30-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb30-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">startingCSV</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhcl-operator.v1.4.0</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb31" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb31-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-connectivity-link.yaml</span></code></pre></div></div>
</section>
</section>
<section id="enable-gpus-node-feature-discovery-nvidia-gpu-operator" class="level3">
<h3 class="anchored" data-anchor-id="enable-gpus-node-feature-discovery-nvidia-gpu-operator">2. Enable GPUs (Node Feature Discovery + NVIDIA GPU Operator)</h3>
<p>Skip this section on a CPU-only cluster. On a GPU worker pool, the NFD operator labels nodes that expose PCI GPU devices, and the NVIDIA GPU operator deploys the driver, container toolkit, and DCGM exporter.</p>
<section id="node-feature-discovery" class="level4">
<h4 class="anchored" data-anchor-id="node-feature-discovery">2.1 Node Feature Discovery</h4>
<p>NFD ships in <strong>AllNamespaces</strong> install mode — empty <code>OperatorGroup</code> spec.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-nfd.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb32" data-filename="op-nfd.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb32-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb32-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> v1</span></span>
<span id="cb32-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Namespace</span></span>
<span id="cb32-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb32-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-nfd</span></span>
<span id="cb32-6"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb32-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1</span></span>
<span id="cb32-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> OperatorGroup</span></span>
<span id="cb32-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb32-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nfd-operators</span></span>
<span id="cb32-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-nfd</span></span>
<span id="cb32-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb32-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">targetNamespaces</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb32-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-nfd</span></span>
<span id="cb32-15"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">upgradeStrategy</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Default</span></span>
<span id="cb32-16"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb32-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb32-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb32-19"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb32-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nfd</span></span>
<span id="cb32-21"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-nfd</span></span>
<span id="cb32-22"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb32-23"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable</span></span>
<span id="cb32-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nfd</span></span>
<span id="cb32-25"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb32-26"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb32-27"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb33" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb33-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-nfd.yaml</span></code></pre></div></div>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Leave the default name and settings, and click Create <code>NodeFeatureDiscovery</code> and wait for 5–10 minutes for GPU-labeled nodes to appear.</p>
</div>
</div>
</div>
</section>
<section id="nvidia-gpu-operator" class="level4">
<h4 class="anchored" data-anchor-id="nvidia-gpu-operator">2.2 NVIDIA GPU Operator</h4>
<p>The NVIDIA GPU operator ships in <strong>OwnNamespace</strong> install mode, so the <code>OperatorGroup</code> must list its own namespace under <code>targetNamespaces</code>.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>op-nvidia-gpu.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb34" data-filename="op-nvidia-gpu.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb34-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb34-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> v1</span></span>
<span id="cb34-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Namespace</span></span>
<span id="cb34-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb34-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nvidia-gpu-operator</span></span>
<span id="cb34-6"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb34-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1</span></span>
<span id="cb34-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> OperatorGroup</span></span>
<span id="cb34-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb34-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nvidia-gpu-operators</span></span>
<span id="cb34-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nvidia-gpu-operator</span></span>
<span id="cb34-12"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb34-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">targetNamespaces</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb34-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nvidia-gpu-operator</span></span>
<span id="cb34-15"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb34-16"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb34-17"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb34-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb34-19"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> gpu-operator-certified</span></span>
<span id="cb34-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> nvidia-gpu-operator</span></span>
<span id="cb34-21"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb34-22"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable</span></span>
<span id="cb34-23"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> gpu-operator-certified</span></span>
<span id="cb34-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> certified-operators</span></span>
<span id="cb34-25"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb34-26"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb35" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb35-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> op-nvidia-gpu.yaml</span></code></pre></div></div>
</section>
<section id="roll-out-the-gpu-driver-clusterpolicy" class="level4">
<h4 class="anchored" data-anchor-id="roll-out-the-gpu-driver-clusterpolicy">2.3 Roll out the GPU driver — <code>ClusterPolicy</code></h4>
<p>Once both CSVs reach <code>Succeeded</code>, you create a <code>ClusterPolicy</code> — the CR that actually rolls out the driver DaemonSet, container toolkit, and DCGM exporter onto every GPU-labeled node.</p>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Leave the default name and settings, and click Create <code>ClusterPolicy</code> and wait for 15 to 20 minutes for the driver to roll out.</p>
</div>
</div>
</div>
</section>
</section>
<section id="install-the-red-hat-openshift-ai-operator" class="level3">
<h3 class="anchored" data-anchor-id="install-the-red-hat-openshift-ai-operator">3. Install the Red Hat OpenShift AI operator</h3>
<section id="add-a-4.21-catalogsource-for-rhods-operator" class="level4">
<h4 class="anchored" data-anchor-id="add-a-4.21-catalogsource-for-rhods-operator">3.1 Add a 4.21 <code>CatalogSource</code> for <code>rhods-operator</code></h4>
<div class="callout callout-style-simple callout-important">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>Why this step is necessary.</strong> The default <code>redhat-operators</code> <code>CatalogSource</code> shipped with OpenShift 4.22 (<code>registry.redhat.io/redhat/ redhat-operator-index:v4.22</code>) does <strong>not</strong> yet contain a <code>rhods-operator</code> package. Until that lands, point a <em>new</em> <code>CatalogSource</code> at the 4.21 index — which does ship <code>rhods-operator.v3.4.x</code> — and have the RHOAI <code>Subscription</code> consume it.</p>
</div>
</div>
</div>
<p>This adds a parallel catalog (it does <strong>not</strong> replace the default <code>redhat-operators</code>), so other operators on the cluster keep tracking the 4.22 index as usual.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>catalogsource-rhoai.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb36" data-filename="catalogsource-rhoai.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb36-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb36-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb36-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> CatalogSource</span></span>
<span id="cb36-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb36-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators-v4-21</span></span>
<span id="cb36-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace</span></span>
<span id="cb36-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb36-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">displayName</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Red Hat Operators v4.21</span></span>
<span id="cb36-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">publisher</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Red Hat</span></span>
<span id="cb36-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceType</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> grpc</span></span>
<span id="cb36-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">image</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> registry.redhat.io/redhat/redhat-operator-index:v4.21</span></span>
<span id="cb36-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">updateStrategy</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb36-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">registryPoll</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb36-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">interval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> 45m</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb37" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb37-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> catalogsource-rhoai.yaml</span></code></pre></div></div>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Remove this <code>CatalogSource</code> (and switch the <code>Subscription</code> below back to <code>redhat-operators</code>) once a future OpenShift 4.22.z ships <code>rhods-operator</code> in the default 4.22 index — otherwise you’ll be tracking a frozen index.</p>
</div>
</div>
</div>
</section>
<section id="subscribe-to-rhods-operator" class="level4">
<h4 class="anchored" data-anchor-id="subscribe-to-rhods-operator">3.2 Subscribe to <code>rhods-operator</code></h4>
<p>RHOAI lives in <code>redhat-ods-operator</code>. Create the namespace, an <code>OperatorGroup</code>, and a pinned <code>Subscription</code> on channel <code>stable-3.4</code> pointing at the 4.21 <code>CatalogSource</code> you just created.</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>rhoai-operator.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb38" data-filename="rhoai-operator.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb38-1"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb38-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> v1</span></span>
<span id="cb38-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Namespace</span></span>
<span id="cb38-4"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb38-5"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-ods-operator</span></span>
<span id="cb38-6"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb38-7"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1</span></span>
<span id="cb38-8"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> OperatorGroup</span></span>
<span id="cb38-9"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb38-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhods-operator</span></span>
<span id="cb38-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-ods-operator</span></span>
<span id="cb38-12"><span class="pp" style="color: #AD0000;
background-color: null;
font-style: inherit;">---</span></span>
<span id="cb38-13"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> operators.coreos.com/v1alpha1</span></span>
<span id="cb38-14"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Subscription</span></span>
<span id="cb38-15"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb38-16"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhods-operator</span></span>
<span id="cb38-17"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">namespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-ods-operator</span></span>
<span id="cb38-18"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb38-19"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">channel</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> stable-3.x</span><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"> # Make sure to use the latest 3.x channel for RHOAI 3.4.</span></span>
<span id="cb38-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">installPlanApproval</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Automatic</span></span>
<span id="cb38-21"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhods-operator</span></span>
<span id="cb38-22"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">source</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> redhat-operators</span></span>
<span id="cb38-23"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">sourceNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> openshift-marketplace-v4.21</span></span>
<span id="cb38-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">startingCSV</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhods-operator.3.4.0</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb39" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb39-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> rhoai-operator.yaml</span></code></pre></div></div>
</section>
</section>
<section id="create-components-datasciencecluster" class="level3">
<h3 class="anchored" data-anchor-id="create-components-datasciencecluster">4. Create components — <code>DataScienceCluster</code></h3>
<p>This is the CR you’ll edit most often: it’s where you turn individual components on or off. The example below enables the full set used in a typical RHOAI demo (dashboard, workbenches, pipelines, model serving, training, Ray, Kueue).</p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>dsc.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb40" data-filename="dsc.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb40-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> datasciencecluster.opendatahub.io/v2</span></span>
<span id="cb40-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> DataScienceCluster</span></span>
<span id="cb40-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-4"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> default-dsc</span></span>
<span id="cb40-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">components</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-7"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">aipipelines</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">argoWorkflowsControllers</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">        </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed </span></span>
<span id="cb40-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">dashboard</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-13"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">feastoperator</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-14"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-15"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kserve</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-16"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-17"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kueue</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-18"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">defaultClusterQueueName</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> default</span></span>
<span id="cb40-19"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">defaultLocalQueueName</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> default</span></span>
<span id="cb40-20"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-21"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">llamastackoperator</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-22"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-23"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">modelregistry</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-24"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-25"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">registriesNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhoai-model-registries</span></span>
<span id="cb40-26"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">ray</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-27"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-28"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">trainingoperator</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-29"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-30"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">trustyai</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-31"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-32"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">workbenches</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb40-33"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">managementState</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> Removed</span></span>
<span id="cb40-34"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">workbenchNamespace</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> rhods-notebooks </span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb41" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb41-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> dsc.yaml</span>
<span id="cb41-2"></span>
<span id="cb41-3"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Watch components come up</span></span>
<span id="cb41-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> get datasciencecluster default-dsc <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb41-5">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-o</span> jsonpath=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'{range .status.conditions[*]}{.type}={.status}{"\n"}{end}'</span></span></code></pre></div></div>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Start narrow — <code>dashboard</code>, <code>workbenches</code>, and <code>datasciencepipelines</code> is enough to take the platform for a spin. Flip components from <code>Removed</code> to <code>Managed</code> later by re-applying this CR.</p>
</div>
</div>
</div>
</section>
<section id="open-the-rhoai-dashboard" class="level3">
<h3 class="anchored" data-anchor-id="open-the-rhoai-dashboard">6. Open the RHOAI dashboard</h3>
<p>The operator publishes a Route in <code>redhat-ods-applications</code>. Print it and open it in your browser:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb42" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb42-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> get route <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-n</span> redhat-ods-applications rhods-dashboard <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb42-2">  <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-o</span> jsonpath=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'https://{.spec.host}{"\n"}'</span></span></code></pre></div></div>
<p>Log in with the same <code>kubeadmin</code> you used for the OpenShift console — once RHOAI sees you have <code>cluster-admin</code>, the dashboard exposes <em>Settings → User management</em> where you can grant <code>data scientist</code> / <code>admin</code> roles to real users from your IdP.</p>
<div class="callout callout-style-simple callout-warning">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p><strong>Don’t rely on <code>kubeadmin</code></strong> for RHOAI day-to-day. RHOAI ties workbench ownership and pipeline runs to the logged-in user — when you eventually delete the <code>kubeadmin</code> secret, anything created by it becomes orphaned. Add an IdP before sharing the cluster.</p>
</div>
</div>
</div>
</section>
<section id="add-an-htpasswd-identity-provider" class="level3">
<h3 class="anchored" data-anchor-id="add-an-htpasswd-identity-provider">7. Add an HTPasswd identity provider</h3>
<p>On a lab cluster, the quickest way to stop leaning on <code>kubeadmin</code> is an <strong>HTPasswd</strong> identity provider — a flat file of user/bcrypt pairs that OpenShift authenticates against natively. Production clusters should prefer OIDC/LDAP/GitHub, but for a demo this is two minutes of work and unblocks the RHOAI dashboard.</p>
<div class="callout callout-style-simple callout-note">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The RHOAI 3.x dashboard refuses to fully render for <code>kubeadmin</code> because that account has no <code>User</code> object in <code>user.openshift.io</code> — it’s synthesised on the fly by OAuth. RHOAI’s workbench/pipeline ownership queries need a real <code>User</code>, hence the need for an HTPasswd (or any other) identity provider before the dashboard “loads normally”.</p>
</div>
</div>
</div>
<p><strong>a. Create the HTPasswd file and the secret it backs</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb43" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb43-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">htpasswd</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-c</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-B</span> ./htpasswd mladmin</span>
<span id="cb43-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># bcrypt the password interactively, then ship the file to OpenShift:</span></span>
<span id="cb43-3"></span>
<span id="cb43-4"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> create secret generic htpasswd-secret <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb43-5">   <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">--from-file</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>htpasswd=./htpasswd <span class="dt" style="color: #AD0000;
background-color: null;
font-style: inherit;">\</span></span>
<span id="cb43-6">   <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-n</span> openshift-config</span></code></pre></div></div>
<p>The <code>-B</code> flag forces bcrypt (required by OpenShift) and <code>-c</code> creates the file fresh. Drop <code>-c</code> on subsequent runs so you don’t blow away existing entries.</p>
<p><strong>b. Wire the secret into the cluster <code>OAuth</code> CR</strong></p>
<div class="code-with-filename">
<div class="code-with-filename-file">
<pre><strong>oauth-htpasswd.yaml</strong></pre>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb44" data-filename="oauth-htpasswd.yaml" style="background: #f1f3f5;"><pre class="sourceCode numberSource yaml number-lines code-with-copy"><code class="sourceCode yaml"><span id="cb44-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">apiVersion</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> config.openshift.io/v1</span></span>
<span id="cb44-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">kind</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> OAuth</span></span>
<span id="cb44-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">metadata</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb44-4"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> cluster</span></span>
<span id="cb44-5"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">spec</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb44-6"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">  </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">identityProviders</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb44-7"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">    </span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">-</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> local_users</span></span>
<span id="cb44-8"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mappingMethod</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> claim</span></span>
<span id="cb44-9"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">type</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> HTPasswd</span></span>
<span id="cb44-10"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">      </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">htpasswd</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb44-11"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">        </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">fileData</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span></span>
<span id="cb44-12"><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">          </span><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">name</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">:</span><span class="at" style="color: #657422;
background-color: null;
font-style: inherit;"> htpasswd-secret</span></span></code></pre></div></div>
</div>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb45" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb45-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> apply <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> oauth-htpasswd.yaml</span></code></pre></div></div>
<p><strong>c.&nbsp;Grant <code>cluster-admin</code> to the new user</strong></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb46" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb46-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> adm policy add-cluster-role-to-user cluster-admin mladmin</span></code></pre></div></div>
<p><strong>d.&nbsp;Wait for the OAuth pods to roll, then re-login</strong></p>
<p>The cluster operator rotates the OAuth server pods after every change to the <code>OAuth</code> CR — it takes 1–2 minutes:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb47" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb47-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> get pods <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-n</span> openshift-authentication <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-w</span></span>
<span id="cb47-2"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># Ctrl-C once the new oauth-openshift-* pods are Running</span></span></code></pre></div></div>
<p>Log out of <code>kubeadmin</code> in the OpenShift console (top-right → <em>Log out</em>), then log back in as <code>mladmin</code>. The RHOAI dashboard will now load normally and <code>mladmin</code> will own anything it creates.</p>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>Once <code>mladmin</code> (or any real user) has <code>cluster-admin</code>, delete the bootstrap account so it can never be used again:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb48" style="background: #f1f3f5;"><pre class="sourceCode numberSource bash number-lines code-with-copy"><code class="sourceCode bash"><span id="cb48-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">oc</span> delete secret kubeadmin <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-n</span> kube-system</span></code></pre></div></div>
</div>
</div>
</div>
</section>
<section id="inside-the-rhoai-dashboard" class="level3">
<h3 class="anchored" data-anchor-id="inside-the-rhoai-dashboard">8. Inside the RHOAI dashboard</h3>
<p>Logging back in as <code>mladmin</code> and hitting the <code>rhods-dashboard</code> Route lands on the RHOAI <strong>Home</strong> view. This is the first place to sanity-check that every <code>DataScienceCluster</code> component you enabled in step 4 came up — each section in the left rail corresponds to one <code>managementState: Managed</code> entry from <code>dsc.yaml</code>.</p>
<div id="fig-rhoai-console" class="quarto-float quarto-figure quarto-figure-center anchored" data-fig-align="center">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-rhoai-console-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://josephassiga.github.io/images/rhoai-console.png" class="img-fluid quarto-figure quarto-figure-center figure-img" style="width:100.0%">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-rhoai-console-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;5: Red Hat OpenShift AI 3.4 dashboard — landing page right after install, logged in as <code>mladmin</code>.
</figcaption>
</figure>
</div>
<p>A few things worth noticing in Figure&nbsp;5:</p>
<ul>
<li><strong>Left navigation</strong> — <em>Data science projects</em>, <em>Workbenches</em>, <em>Pipelines</em>, <em>Distributed workloads</em>, <em>Models</em>, <em>Resources</em>, <em>Settings</em>. A missing entry means the matching <code>DataScienceCluster</code> component is <code>Removed</code> instead of <code>Managed</code> — re-apply <code>dsc.yaml</code> to enable it.</li>
<li><strong>Top-right user menu</strong> — should read <code>mladmin</code>, not <code>kubeadmin</code>. If you still see <code>kubeadmin</code>, the OAuth pods from step 7 haven’t rolled yet (<code>oc get pods -n openshift-authentication -w</code>).</li>
<li><strong>Settings → User management</strong> — only visible because <code>mladmin</code> has <code>cluster-admin</code>. This is where you grant <code>data scientist</code> / <code>admin</code> roles to other HTPasswd users without giving them full cluster privileges.</li>
</ul>
<div class="callout callout-style-simple callout-tip">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-body-container">
<p>The first thing most RHOAI walkthroughs do from this screen is <em>Data science projects → Create project</em> and then <em>Create workbench</em> with a PyTorch image — that exercises the workbench controller, the PVC provisioner, and (if you picked a GPU image) the NVIDIA device plugin in one shot.</p>
</div>
</div>
</div>
</section>
</section>
<section id="important-notes-best-practices" class="level2">
<h2 class="anchored" data-anchor-id="important-notes-best-practices">Important notes &amp; best practices</h2>
<ul>
<li>Replace <code>OCP_VERSION</code> with a specific release for reproducible runs.</li>
<li>Always pass <code>--dir</code> so re-running and <code>gather</code> commands work consistently.</li>
<li>Run downloads from a bastion with stable network connectivity.</li>
<li>The single-master <code>controlPlane.replicas: 1</code> above is a <strong>lab</strong> topology — production needs three.</li>
</ul>
<div class="callout callout-style-default callout-important callout-titled">
<div class="callout-header d-flex align-content-center">
<div class="callout-icon-container">
<i class="callout-icon"></i>
</div>
<div class="callout-title-container flex-fill">
<span class="screen-reader-only">Important</span>Single-node OpenShift ≠ Production HA
</div>
</div>
<div class="callout-body-container callout-body">
<p>A <code>controlPlane.replicas: 1</code> install is fine for a demo cluster but should never carry workloads you can’t lose. For HA, use three control-plane nodes and at least two workers across availability zones.</p>
</div>
</div>
</section>
<section id="troubleshooting" class="level2">
<h2 class="anchored" data-anchor-id="troubleshooting">Troubleshooting</h2>
<div id="tbl-troubleshooting" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-tbl figure">
<figcaption class="quarto-float-caption-top quarto-float-caption quarto-float-tbl" id="tbl-troubleshooting-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Table&nbsp;1: Common failure modes and where to look.
</figcaption>
<div aria-describedby="tbl-troubleshooting-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<table class="caption-top table">
<colgroup>
<col style="width: 50%">
<col style="width: 50%">
</colgroup>
<thead>
<tr class="header">
<th>Symptom</th>
<th>First thing to check</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>Installer hangs on bootstrap</td>
<td><code>openshift-install gather bootstrap --dir ocp-install</code></td>
</tr>
<tr class="even">
<td><code>mv</code> fails moving binaries</td>
<td>Re-run the <code>mv</code> lines with <code>sudo</code></td>
</tr>
<tr class="odd">
<td>AWS API quota errors</td>
<td>Verify the EC2/EBS quotas in your target region</td>
</tr>
<tr class="even">
<td>DNS resolution fails post-install</td>
<td>Verify Route 53 NS records match the hosted zone</td>
</tr>
</tbody>
</table>
</div>
</figure>
</div>
</section>
<section id="wrap-up" class="level2">
<h2 class="anchored" data-anchor-id="wrap-up">Wrap-up</h2>
<p>If you treat the script in this post as a <em>starting point</em> rather than a black box — pin versions, audit IAM, and review the <code>install-config.yaml</code> before each run — you’ll get a reproducible OpenShift install you actually understand.</p>
<div class="callout callout-style-simple callout-note no-icon">
<div class="callout-body d-flex">
<div class="callout-icon-container">
<i class="callout-icon no-icon"></i>
</div>
<div class="callout-body-container">
<p>Found a sharp edge? Open an issue at <a href="https://github.com/josephassiga/josephassiga.github.io"><code>josephassiga/josephassiga.github.io</code></a> — I keep this post updated as the installer evolves.</p>
</div>
</div>
</div>


</section>

 ]]></description>
  <category>openshift</category>
  <category>cloud</category>
  <category>aws</category>
  <category>devops</category>
  <category>kubernetes</category>
  <guid>https://josephassiga.github.io/posts/ocp-install/</guid>
  <pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate>
  <media:content url="https://josephassiga.github.io/images/ocp-install.svg" medium="image" type="image/svg+xml"/>
</item>
</channel>
</rss>
