<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Welcome to my blog!</title>
        <link>https://blog.grosdouli.dev/blog</link>
        <description>Welcome to Eleni Grosdouli's official blog. Explore articles on DevOps, GitOps, Kubernetes, Cilium, Rancher, RKE2, and OpenShift. Discover insights into networking, security, and cloud-native solutions for both on-prem and cloud datacenters.</description>
        <lastBuildDate>Thu, 18 Jun 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>Copyright © 2026 Eleni Grosdouli Blog</copyright>
        <item>
            <title><![CDATA[Better Together: Sveltos to Automate Flux Helm Releases]]></title>
            <link>https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation</link>
            <guid>https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation</guid>
            <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In this part of the series, we explore how Sveltos can automate the dynamic creation of Flux Helm Releases.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>In <a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">part 1</a> of the series, we explored how <a href="https://projectsveltos.io/main/" target="_blank" rel="noopener noreferrer" class="">Sveltos</a> acts as the main brain for our deployments to a fleet of clusters. However, this is the case when we start with Continuous Deployments (CD) or when we are willing to perform a full migration to a new architecture. The next two posts are dedicated to the collaboration between <a href="https://fluxcd.io/" target="_blank" rel="noopener noreferrer" class="">Flux</a> and Sveltos. Flux remains the core way of deploying applications using the Flux Customer Resource Definitions (CRDs), while Sveltos enters the play when we talk about scalability, automation, and dynamic instantiation of deployments.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos and Flux&amp;quot;" src="https://blog.grosdouli.dev/assets/images/fluxcd_and_sveltos-fe9a3f2f44383204458f5b7013a97c02.jpg" width="6830" height="2342" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation">Motivation<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#motivation" class="hash-link" aria-label="Direct link to Motivation" title="Direct link to Motivation" translate="no">​</a></h2>
<p>Most engineers working in Platform Engineering already have a GitOps Controller like ArgoCD or Flux in place for Kubernetes deployments. It works, and it works well, until it does not. As teams grow and deployments spread across ten or more clusters, multiple environments, and different Hyperscalers, a once clean GitOps repository quickly ends up with duplicated Helm Releases, environment-specific overrides, and manual interventions nobody wants to own.</p>
<p>Having only a GitOps Controller in place is not enough when it comes to complex workloads, scalability, and management of deployments and add-ons across different environments. Teams end up juggling multiple tools just to add flexibility to an existing setup. Can we help teams work smaller, simpler, and not harder when it comes to continuous deployments? The answer is yes; follow along to explore the Sveltos magic! 🪄</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario">Scenario<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#scenario" class="hash-link" aria-label="Direct link to Scenario" title="Direct link to Scenario" translate="no">​</a></h2>
<p>In today's post, we will showcase a flexible way of using an existing Flux configuration, and how by adding Sveltos into the mix, we provide out-of-the-box capabilities like templating, event-driven workloads, and many more. We will work with an existing Flux deployment, and Sveltos will automate the dynamic creation of <a href="https://fluxcd.io/flux/components/helm/helmreleases/" target="_blank" rel="noopener noreferrer" class="">Flux Helm Releases</a> based on a <strong>cluster type</strong> or <strong>identity</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|          Deployment           |       Version       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|             RKE2              |   v1.35.3+rke2r3    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|           Sveltos             |       v1.8.0        |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|          Flux2 Helm           |       v2.18.3       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|      Flux Operator Helm       |       v0.40.0       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-resources">GitHub Resources<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#github-resources" class="hash-link" aria-label="Direct link to GitHub Resources" title="Direct link to GitHub Resources" translate="no">​</a></h2>
<p>The YAML outputs are not complete. Have a look at the <a href="https://github.com/egrosdou01/blog-post-resources/tree/main/sveltos-gitops-controllers/pt2" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ol>
<li class="">A Kubernetes cluster acting as the <strong>management</strong> cluster</li>
<li class="">At least one <strong>managed</strong> cluster</li>
<li class="">Familiarity with Kubernetes manifest files</li>
<li class="">Familiarity with Flux</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="diagram">Diagram<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#diagram" class="hash-link" aria-label="Direct link to Diagram" title="Direct link to Diagram" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos and Flux Diagram&amp;quot;" src="https://blog.grosdouli.dev/assets/images/sveltos_gitops_installed-c7ccc020cb4d0c50dd5e80ec466d391c.png" width="1437" height="881" class="img_ev3q"></p>
<p>The diagram looks very similar to the one we saw in <a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">part 1</a> of the series. The difference here is that we already have a Flux deployment and project outline. We will install Sveltos using the native deployment options and let Sveltos listen for Events or specific resources and automate the deployment of Flux Helm Releases. Let's dive into the details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sveltos-installation">Sveltos Installation<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#sveltos-installation" class="hash-link" aria-label="Direct link to Sveltos Installation" title="Direct link to Sveltos Installation" translate="no">​</a></h2>
<p>The installation of Sveltos using Flux could be similar to the below. Feel free to use your preferred way of installing Sveltos to the management cluster.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Namespace</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> source.toolkit.fluxcd.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 24h</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//projectsveltos.github.io/helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">charts</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm.toolkit.fluxcd.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HelmRelease</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 30m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">targetNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">storageNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">chart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">chart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=1.6.1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">sourceRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 12h</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">install</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">crds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">createNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">strategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RetryOnFailure</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">upgrade</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">crds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CreateReplace</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cleanupOnFail</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">strategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RetryOnFailure</span></span><br></div></code></pre></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kustomize.config.k8s.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Kustomization</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> sveltos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmrelease.yaml</span></span><br></div></code></pre></div></div>
<p>The above yaml definition will install Sveltos to the <strong>management</strong> cluster in the <code>projectsveltos</code> nasmespace. The namespace is not negotiable. Sveltos has to be installed in this namespace.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="label-management-cluster">Label Management Cluster<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#label-management-cluster" class="hash-link" aria-label="Direct link to Label Management Cluster" title="Direct link to Label Management Cluster" translate="no">​</a></h3>
<p>To control resources in the <strong>management</strong> cluster with Sveltos, we will simply add the label <code>type: mgmt</code> to the <code>sveltoscluster</code> named <code>mgmt</code> in the <code>mgmt</code> namespace. The registration is done by Sveltos during installation. No manual intervention is needed. When we refer to the <strong>management</strong> cluster, is the cluster where Flux and Sveltos are installed.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl label sveltoscluster mgmt -n mgmt type=mgmt</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automate-flux-helm-releases">Automate Flux Helm Releases<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#automate-flux-helm-releases" class="hash-link" aria-label="Direct link to Automate Flux Helm Releases" title="Direct link to Automate Flux Helm Releases" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-it-work">How does it work?<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?" translate="no">​</a></h3>
<p>Sveltos works very well with the concept of labeling. We can label clusters with a dedicated <code>key: value</code> pair and use this information to dynamically create <strong>Flux Helm Releases</strong> based on our needs. In this example, everytime a cluster with the label <code>cert-manager: required</code> appears, we trigger an action and dynamically pre-instantiate and deploy a Flux Helm Release using the information located in the <strong>management</strong> cluster. To achieve our goal, we use the <a href="https://projectsveltos.io/main/events/addon_event_deployment/" target="_blank" rel="noopener noreferrer" class="">Sveltos Event Framework</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-an-eventsource">Define an EventSource<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#define-an-eventsource" class="hash-link" aria-label="Direct link to Define an EventSource" title="Direct link to Define an EventSource" translate="no">​</a></h3>
<p>A Sveltos <code>EventSource</code> is a simple way of instructing Sveltos to look for an event or a specific resource. This can be an Event within a cluster or an Event outside a cluster like NATs. In our case, we want to detect clusters with the label set to <code>cert-manager: required</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lib.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EventSource</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">requiring</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">collectResources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resourceSelectors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"lib.projectsveltos.io"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1beta1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SveltosCluster"</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labelFilters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Equal</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> required</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-an-eventtrigger">Define an EventTrigger<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#define-an-eventtrigger" class="hash-link" aria-label="Direct link to Define an EventTrigger" title="Direct link to Define an EventTrigger" translate="no">​</a></h3>
<p>Once an <code>EventSource</code> is detected, an action or multiple actions can be triggered. In this example, once an event is detected, we will deploy a ConfigMap to the <strong>management</strong> cluster which includes the Flux Helm Releases details expressed as a Sveltos template.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lib.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EventTrigger</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deploy</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sourceClusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destinationClusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">eventSourceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">requiring</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">oneForEvent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmrelease</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="automate-flux-helm-releases-1">Automate Flux Helm Releases<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#automate-flux-helm-releases-1" class="hash-link" aria-label="Direct link to Automate Flux Helm Releases" title="Direct link to Automate Flux Helm Releases" translate="no">​</a></h3>
<p>Now that we have our <code>EventSource</code> and <code>EventTrigger</code> in place, we need to define what actually gets deployed when an event is detected. We do this using a <code>ConfigMap</code> that holds the Flux Helm Release definition expressed as a Sveltos template.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmrelease</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectsveltos.io/instantiate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ok</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">cert-manager.yaml</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    apiVersion: helm.toolkit.fluxcd.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    kind: HelmRelease</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      name: cert-manager-{{ .Resource.metadata.name  }}</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      namespace: {{ .Resource.metadata.namespace }}</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      interval: 15m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      kubeConfig:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        secretRef:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          name: {{ .Resource.metadata.name }}-sveltos-kubeconfig</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          key: kubeconfig</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      chart:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          chart: cert-manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          version: "v1.16.x"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          sourceRef:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            kind: HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            name: jetstack</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            namespace: flux-system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          interval: 15m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      install:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        createNamespace: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        timeout: 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        remediation:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          retries: 3</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      upgrade:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        timeout: 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        cleanupOnFail: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        remediation:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          retries: 3</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          strategy: rollback</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      values:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        crds:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          keep: true</span></span><br></div></code></pre></div></div>
<p>The annotation <code>projectsveltos.io/instantiate: ok</code> is what converts a plain <code>ConfigMap</code> into a Sveltos template. Sveltos will pull information directly from the <strong>management</strong> cluster and dynamically pre-instantiate and deploy the resource using the detected cluster's metadata. Notice how <code>{{ .Resource.metadata.name }}</code> and <code>{{ .Resource.metadata.namespace }}</code> are automatically resolved per cluster, one template, many clusters. The <code>ConfigMap</code> can be further templatised based on different use cases. Both Lua and CEL languages are supported for Sveltos templating.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The label-based approach covered here applies to <strong>any</strong> application. Explore the patterns that fit your use case and adapt them to your needs.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h3>
<p>Every time a cluster with the label <code>cert-manager: required</code> appears, Sveltos detects the event, resolves the template, and dynamically creates a dedicated Flux Helm Release using that cluster's information. No manual intervention, no duplicated YAML. <strong>One template, one label, done</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this post, we explored how Sveltos and Flux can work together without replacing one another. Flux remains the backbone of your GitOps workflow, while Sveltos adds the intelligence layer on top, handling scalability, dynamic templating, and event-driven automation with minimal overhead. By combining the <code>EventSource</code>, <code>EventTrigger</code>, and a templated ConfigMap, we reduced what would otherwise be repetitive, manually maintained Flux Helm Release definitions into a single, reusable template. The moment a cluster is labeled <code>cert-manager: required</code>, Sveltos takes over and does the heavy lifting automatically.</p>
<p>The key takeaway: <strong>you do not need to abandon your existing Flux setup to benefit from Sveltos. You layer it in, and your platform becomes smarter, not more complex</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next?<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#whats-next" class="hash-link" aria-label="Direct link to What's Next?" title="Direct link to What's Next?" translate="no">​</a></h2>
<p>In the next post, we will work with a simple hub-spoke Flux deployment as our basis, and include Sveltos installation alongside the Event Framework approach to automate Flux Helm Releases. Stay tuned!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://fluxcd.control-plane.io/operator/" target="_blank" rel="noopener noreferrer" class="">Flux Operator Documentation</a></li>
<li class=""><a href="https://projectsveltos.github.io/sveltos/v1.0.0/getting_started/install/quick_start/" target="_blank" rel="noopener noreferrer" class="">Sveltos Quick Start</a></li>
<li class=""><a href="https://projectsveltos.github.io/sveltos/v1.0.0/events/addon_event_deployment/" target="_blank" rel="noopener noreferrer" class="">Sveltos Event Framework</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>We are here to help! Whether you have questions, or issues or need assistance, our Slack channel is the perfect place for you. Click here to <a href="https://join.slack.com/t/projectsveltos/shared_invite/zt-1hraownbr-W8NTs6LTimxLPB8Erj8Q6Q" target="_blank" rel="noopener noreferrer" class="">join us</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-support-thisproject">👏 Support this&nbsp;project<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#-support-thisproject" class="hash-link" aria-label="Direct link to 👏 Support this&nbsp;project" title="Direct link to 👏 Support this&nbsp;project" translate="no">​</a></h2>
<p>Every contribution counts! If you enjoyed this article, check out the Projectsveltos <a href="https://github.com/projectsveltos" target="_blank" rel="noopener noreferrer" class="">GitHub repo</a>. You can <a href="https://github.com/projectsveltos/addon-controller" target="_blank" rel="noopener noreferrer" class="">star 🌟 the project</a> if you find it helpful.</p>
<p>The GitHub repo is a great resource for getting started with the project. It contains the code, documentation, and many more examples.</p>
<p>Thanks for reading!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">Part 1</a></td><td style="text-align:left">Sveltos as the brain of deployments</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation">Part 2</a></td><td style="text-align:left">Flux and Sveltos to automate Flux Helm Releases</td></tr><tr><td style="text-align:left">Part 3</td><td style="text-align:left">Running the demo: hub-spoke with Event Framework</td></tr></tbody></table>]]></content:encoded>
            <category>Sveltos</category>
            <category>Flux</category>
            <category>GitOps</category>
            <category>Platform Engineering</category>
        </item>
        <item>
            <title><![CDATA[What's New: vCluster Multi-tenancy Pt.3]]></title>
            <link>https://blog.grosdouli.dev/blog/vcluster-updates-pt3</link>
            <guid>https://blog.grosdouli.dev/blog/vcluster-updates-pt3</guid>
            <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Deep dive into Cilium and how it enhances networking in vCluster multi-tenant setups.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>In parts <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">1</a> and <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">2</a> of the series, we explored the different node assignment strategies, Cilium L2 Announcements, and the vCluster Platform. Today, we take a step further. We will look at how Cilium CNI running on the underlying Control Plane cluster directly enhances networking for virtual clusters. We will cover traffic isolation, policy enforcement, DNS resolution, and traffic observability.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vCluster on existing Kubernetes Cluster&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_architecture-427aaea5d7db6710e493ace3cf067428.png" width="1396" height="566" class="img_ev3q"></p>
<p><a href="https://www.vcluster.com/docs/vcluster/introduction/architecture" target="_blank" rel="noopener noreferrer" class="">Source</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>The promise of <a href="https://www.vcluster.com/docs" target="_blank" rel="noopener noreferrer" class="">vCluster</a> is to create separate and isolated control planes for virtual clusters running on top of an underlying Control Plane cluster. The different components are placed in a separate namespace for logical isolation. However, this does not ensure that the running workloads are isolated. In a Kubernetes cluster, every pod can communicate with any other pod by default. What does that really mean? Yes, the end-user will not know they are on a shared cluster, but each of the workloads running could reach workloads on any other virtual cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|        Resources        |     Type     |     Version      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Control Plane Cluster  |     RKE2     | v1.34.3+rke2r1   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-a     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-b     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The control plane cluster is the cluster that hosts the virtualised control planes for the tenant clusters.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-resources">GitHub Resources<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#github-resources" class="hash-link" aria-label="Direct link to GitHub Resources" title="Direct link to GitHub Resources" translate="no">​</a></h2>
<p>The YAML outputs are not complete. Have a look at the <a href="https://github.com/egrosdou01/blog-post-resources/tree/main/experimenting-vcluster-multitenancy/updates-2026/pt3" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>Go through parts 1 and 2 of the series to gain a better understanding of the concept and what we aim to achieve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-network-model">vCluster Network Model<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#vcluster-network-model" class="hash-link" aria-label="Direct link to vCluster Network Model" title="Direct link to vCluster Network Model" translate="no">​</a></h2>
<p>Before we jump into the examples and command outputs, it helps to understand the layered networking model. Two layers exist when we create virtual clusters.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-----------------------------------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|           Virtual Cluster (vcluster-team-a)    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Pod A  &lt;--&gt;  Pod B   (virtual cluster DNS)    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+------------------+----------------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   | Synced to Control Plane namespace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+------------------v----------------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     Control Plane Cluster (RKE2 + Cilium)     |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  pod/app-x-ns-x-vcluster-team-a               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  pod/app-y-ns-x-vcluster-team-a               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Cilium enforces eBPF-based policy.           |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-----------------------------------------------+</span><br></div></code></pre></div></div>
<p>When we deploy a pod inside <code>vcluster-team-a</code>, the vCluster syncs the pod down to the Control Plane cluster's namespace, <code>vcluster-team-a</code>. The pod gets an IP as it would normally do. The virtual cluster's internal DNS and service abstraction sit on top, but actual packet forwarding is handled by Cilium.</p>
<p>vCluster provides control plane isolation. Each virtual cluster has its own API server, scheduler, and controller manager. Tenants cannot see each other's Kubernetes resources through the API. However, vCluster does not provide network-level isolation between tenant namespaces by default.</p>
<p>To better understand this concept, we deployed an NGINX application in the <code>default</code> namespace. This was done for the <code>vcluster-team-a</code> virtual cluster during its creation. Below are the two separate views. One from the Control Plane cluster and one from the <code>vcluster-team-a</code> virtual cluster.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=control-plane-cluster.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -n vcluster-team-a -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                                       READY   STATUS    RESTARTS      AGE   IP            NODE   NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a   1/1     Running   1 (12d ago)   13d   10.42.0.48    el07   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nginx-6797d5487-27gcf-x-default-x-vcluster-team-a          1/1     Running   0             11d   10.42.0.125   el07   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vcluster-team-a-0                                          1/1     Running   0             11d   10.42.0.249   el07   &lt;none&gt;           &lt;none&gt;</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE   NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nginx-6797d5487-27gcf   1/1     Running   0          11d   10.42.0.125   el07   &lt;none&gt;           &lt;none&gt;</span><br></div></code></pre></div></div>
<p>We already have a test pod in the <code>vcluster-team-b</code> virtual cluster, and we will ping the NGINX pod using the assigned IP address 10.42.0.125. As there is no network isolation, the ping would be successful. For network-related tests, feel free to use the <a href="https://hub.docker.com/r/nicolaka/netshoot" target="_blank" rel="noopener noreferrer" class=""><code>nicolaka/netshoot</code></a> Docker image.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-b.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME              READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-pod   1/1     Running   0          11d   10.42.1.48   el07-worker1   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it test-pod -- ping -c3 10.42.0.125</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PING 10.42.0.125 (10.42.0.125) 56(84) bytes of data.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">64 bytes from 10.42.0.125: icmp_seq=1 ttl=63 time=0.165 ms</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">64 bytes from 10.42.0.125: icmp_seq=2 ttl=63 time=0.212 ms</span><br></div></code></pre></div></div>
<p>From the <code>test-pod</code>, we can also cURL the NGINX service IP address. We will get a response as expected.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h3>
<ul>
<li class="">Pods from <code>vcluster-team-a</code> are synced into the <code>vcluster-team-a</code> namespace on the Control Plane cluster</li>
<li class="">Pods from <code>vcluster-team-b</code> are synced into the <code>vcluster-team-b</code> namespace on the Control Plane cluster</li>
<li class="">These namespaces sit on the same flat network managed by Cilium</li>
<li class="">If someone knows the pod IP or service IP of a workload in <code>vcluster-team-b</code>, a pod in <code>vcluster-team-a</code> can reach it by <strong>default</strong></li>
</ul>
<p>For that reason, a modern CNI with capabilities and features made for complex and modern workloads is a must-have for every Kubernetes environment. Thus, <a href="https://docs.cilium.io/en/stable/" target="_blank" rel="noopener noreferrer" class="">Cilium</a> is the preferred CNI for multi-tenant environments.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Each vCluster runs its own CoreDNS instance. When vCluster syncs resources to the host cluster, the CoreDNS pod follows the standard vCluster naming convention. The CoreDNS pod lives inside the virtual cluster under the <code>kube-system</code> namespace. DNS queries from pods inside virtual clusters go to the specific CoreDNS instance.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cilium-hubble-observability">Cilium Hubble Observability<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#cilium-hubble-observability" class="hash-link" aria-label="Direct link to Cilium Hubble Observability" title="Direct link to Cilium Hubble Observability" translate="no">​</a></h2>
<p>To gain the most out of our Cilium installation, we can enable <a href="https://docs.cilium.io/en/stable/observability/hubble/" target="_blank" rel="noopener noreferrer" class="">Hubble</a>, Hubble UI, and Hubble Relay (optional) to have a visual representation of the traffic. We can expose the Hubble UI service as a <code>LoadBalancer</code> or <code>NodePort</code>, or simply port-forward it. Choose the option that suits your setup.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-chart-values">Helm Chart Values<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#helm-chart-values" class="hash-link" aria-label="Direct link to Helm Chart Values" title="Direct link to Helm Chart Values" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">hubble</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">relay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ui</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span></span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm upgrade rke2-cilium rke2-charts/rke2-cilium --version 1.18.300 --namespace kube-system -f values_control_plane.yaml</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Hubble Relay is an optional component. However, to have visibility across the underlying nodes, it is advised to be enabled.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hubble-ui-view">Hubble UI View<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#hubble-ui-view" class="hash-link" aria-label="Direct link to Hubble UI View" title="Direct link to Hubble UI View" translate="no">​</a></h3>
<p>Once Hubble UI is accessible, we can choose the <code>vcluster-team-a</code> or the <code>vcluster-team-b</code> namespace view and explore the traffic flow. Keep in mind that both virtual clusters are registered with the vCluster Platform, thus we see traffic to TCP port 10443.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="traffic-view-vcluster-team-a">Traffic View vcluster-team-a<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#traffic-view-vcluster-team-a" class="hash-link" aria-label="Direct link to Traffic View vcluster-team-a" title="Direct link to Traffic View vcluster-team-a" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vcluster-team-a Hubble No Restrictions View&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_team_a-25aa2e09de52826fb6207233f6668e6d.png" width="2424" height="918" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="traffic-view-vcluster-team-b">Traffic View vcluster-team-b<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#traffic-view-vcluster-team-b" class="hash-link" aria-label="Direct link to Traffic View vcluster-team-b" title="Direct link to Traffic View vcluster-team-b" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vcluster-team-b Hubble No Restrictions View&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_team_b-234995b3f4ce901906cfa7dcd02e5f9a.png" width="2434" height="1370" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-isolation">Network Isolation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#network-isolation" class="hash-link" aria-label="Direct link to Network Isolation" title="Direct link to Network Isolation" translate="no">​</a></h2>
<p>Observation at the Control Plane cluster is enabled, and we are ready to continue with the network isolation. As we already saw, there is no isolation between the different virtual clusters running on a Kubernetes cluster. Because virtual clusters are assigned to different teams, we want traffic to be allowed on the namespace they belong to, but blocked on other namespaces. We need to set up strong isolation and ensure different workloads are isolated. To achieve our goal, we have two options: either use the vCluster <code>NetworkPolicy</code> option provided during deployment and save time using the defaults, or use the Cilium advanced networking capabilities.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-isolation-vcluster-helm-values">Network Isolation: vCluster Helm Values<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#network-isolation-vcluster-helm-values" class="hash-link" aria-label="Direct link to Network Isolation: vCluster Helm Values" title="Direct link to Network Isolation: vCluster Helm Values" translate="no">​</a></h3>
<p>When we create virtual clusters, we can define network isolation by using the Helm values and working with the <code>policies.networkPolicy</code> configuration. By default, this will allow traffic between pods within a tenant cluster, block traffic from other namespaces, and permit DNS and API server communication. However, with this approach, we use the <code>NetworkPolicy</code> resource and not Cilium's full capabilities. For more details, take a look at the <a href="https://www.vcluster.com/docs/vcluster/next/configure/vcluster-yaml/policies/network-policy" target="_blank" rel="noopener noreferrer" class="">official documentation</a> on network policies.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-isolation-cilium">Network Isolation: Cilium<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#network-isolation-cilium" class="hash-link" aria-label="Direct link to Network Isolation: Cilium" title="Direct link to Network Isolation: Cilium" translate="no">​</a></h3>
<p><a href="https://docs.cilium.io/en/v1.18/security/policy/" target="_blank" rel="noopener noreferrer" class=""><code>CiliumNetworkPolicy</code></a> enhances Kubernetes security by using eBPF to filter traffic without the performance degradation of traditional <code>iptables</code>. It goes beyond simple IP-based rules to enforce identity-based security, while enabling deep <strong>Layer 7 filtering</strong> for specific HTTP paths, methods, and FQDNs.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="enforce-tenant-network-isolation">Enforce Tenant Network Isolation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#enforce-tenant-network-isolation" class="hash-link" aria-label="Direct link to Enforce Tenant Network Isolation" title="Direct link to Enforce Tenant Network Isolation" translate="no">​</a></h4>
<p>Crafting a <code>CiliumNetworkPolicy</code> for the underlying virtual clusters was more complex than anticipated. It is not only about the communication between the pods within the same namespace, but also the communication between the virtual cluster and the API server, <code>kubectl</code> execution from machines on the local network, DNS resolution, etc. I started with the simplest possible version.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumNetworkPolicy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> isolate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">endpointSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">#Applies this policy to all pods in the namespace</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div></code></pre></div></div>
<p>Applied the manifest to the Control Plane cluster, and guess what, <code>kubectl</code> commands did not work from another machine in the same network. The next step was to think about Ingress traffic. The <code>CiliumNetworkPolicy</code> was modified. This time, we scope external management access using the <code>fromCIDR</code> and the <code>fromEntities</code> host for node local traffic.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumNetworkPolicy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> isolate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">endpointSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">#Applies this policy to all pods in the namespace</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromCIDR</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> &lt;IP Subnet</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># e.g. 10.x.x.x/24 Replace with your management network CIDR</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEntities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> host </span><span class="token comment" style="color:#999988;font-style:italic"># Matches traffic routed through the local node's network interface</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster API server port; Cilium L2 LB fronts this and forwards to the Control Plane cluster API on 443</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div></code></pre></div></div>
<p>With the second version of the policy, the <code>kubectl</code> command worked. I was able to list resources and check everything in the virtual cluster. But the next issue arose, I was unable to create any resources. I tried to create a <code>busybox</code> pod, and it remained in a <code>Pending</code> state. The issue?</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Events:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Type     Reason     Age   From        Message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ----     ------     ----  ----        -------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Warning  SyncError  19s   pod-syncer  Error syncing to host cluster: create object: Post "https://10.43.0.1:443/api/v1/namespaces/vcluster-team-a/pods": http2: client connection lost</span><br></div></code></pre></div></div>
<p>The policy was updated once again to include an additional Egress rule. The following is required for the virtual cluster control plane pod to sync with the Control Plane Cluster API.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumNetworkPolicy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> isolate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">endpointSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">#Applies this policy to all pods in the namespace</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromCIDR</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> &lt;IP Subnet</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># e.g. 10.10.x.x/24 Replace with your management network CIDR</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEntities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> host </span><span class="token comment" style="color:#999988;font-style:italic"># Matches traffic routed through the local node's network interface</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster API server port; Cilium L2 LB fronts this and forwards to the Control Plane cluster API on 443</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEntities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> kube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">apiserver</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> host</span></span><br></div></code></pre></div></div>
<p>With the latest update, we can create workloads on the virtual clusters and isolate them. DNS egress to the virtual cluster's CoreDNS pod is covered by the same-namespace egress rule <code>toEndpoints.matchLabels.io.kubernetes.pod.namespace</code>, as CoreDNS is synced into the <code>vcluster-team-a</code> namespace. If your setup uses an external DNS resolver outside this namespace, add an explicit egress rule targeting that resolver.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>To get a visual representation of a CiliumNetworkPolicy, feel free to use the <a href="https://editor.networkpolicy.io/?id=elMJ7uYDicIJCHN2" target="_blank" rel="noopener noreferrer" class="">Cilium Network Policy Editor</a></p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If the virtual cluster is registered with the vCluster Platform for management, TCP communication on port 10443 needs to be allowed, and access from the vCluster Platform to the virtual cluster API server on TCP port 8443.</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">platform </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster Platform namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">#vCluster API server</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">platform </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster Platform namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"10443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster Platform API port</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div></code></pre></div></div></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#validation" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-b.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME              READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-pod   1/1     Running   0          11d   10.42.1.48   el07-worker1   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it test-pod -- ping -c3 10.42.0.125</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PING 10.42.0.125 (10.42.0.125): 56 data bytes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- 10.42.0.125 ping statistics ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3 packets transmitted, 0 packets received, 100% packet loss</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">command terminated with exit code 1</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Hubble UI - Ping Blocked vcluster-team-b -&amp;gt; NGINX vcluster-team-a &amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_ping_fail-c2587ec933a9204493ede85bcf46ef66.png" width="2314" height="1138" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dns-in-action">DNS in Action<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#dns-in-action" class="hash-link" aria-label="Direct link to DNS in Action" title="Direct link to DNS in Action" translate="no">​</a></h2>
<p>Each virtual cluster deploys a dedicated CoreDNS instance that handles DNS queries independently from other tenants.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods,svc -n kube-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                           READY   STATUS    RESTARTS      AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/coredns-754d567864-f9kgj   1/1     Running   1 (14d ago)   14d</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/kube-dns   ClusterIP   10.43.196.115   &lt;none&gt;        53/UDP,53/TCP,9153/TCP   14d</span><br></div></code></pre></div></div>
<p>Let's test and see how the requests are resolved from within the virtual clusters.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it dns-test -- bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># nslookup kubernetes.default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Server:		10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address:	10.43.196.115#53</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Name:	kubernetes.default.svc.cluster.local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address: 10.43.243.114</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># nslookup nginx.default.svc.cluster.local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Server:		10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address:	10.43.196.115#53</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Name:	nginx.default.svc.cluster.local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address: 10.43.141.183</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>I also had to read about the <code>Got recursion not available from</code> messages. CoreDNS does not act as a recursive resolver by default and explicitly signals this via the <a href="https://help.dnsfilter.com/hc/en-us/articles/4408415850003-DNS-return-codes" target="_blank" rel="noopener noreferrer" class="">RCODE</a> flag. DNS succeeds. <a href="https://github.com/coredns/coredns/issues/3690" target="_blank" rel="noopener noreferrer" class="">GitHub discussion</a>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="packet-capture">Packet Capture<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#packet-capture" class="hash-link" aria-label="Direct link to Packet Capture" title="Direct link to Packet Capture" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The vCluster CoreDNS is exposed on UDP port 1053.</p></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it dns-test -- bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dns-test:~# tcpdump -i any -n port 1053</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tcpdump: WARNING: any: That device doesn't support promiscuous mode</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">(Promiscuous mode not supported on the "any" device)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tcpdump: verbose output suppressed, use -v[v]... for full protocol decode</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.653097 eth0  Out IP 10.42.0.72.37346 &gt; 10.42.0.48.1053: UDP, length 57</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.653292 eth0  In  IP 10.42.0.48.1053 &gt; 10.42.0.72.37346: UDP, length 150</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.654800 eth0  Out IP 10.42.0.72.53187 &gt; 10.42.0.48.1053: UDP, length 49</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.654933 eth0  In  IP 10.42.0.48.1053 &gt; 10.42.0.72.53187: UDP, length 96</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.656420 eth0  Out IP 10.42.0.72.36073 &gt; 10.42.0.48.1053: UDP, length 49</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.656545 eth0  In  IP 10.42.0.48.1053 &gt; 10.42.0.72.36073: UDP, length 142</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Instead of a packet capture with the creation of a dedicated test pod, we can use Hubble to check the traffic flow.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it ds/cilium -n kube-system -- bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/home/cilium# hubble observe --to-port 1053 --namespace vcluster-team-a -f</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a (ID:10933) &lt;&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) post-xlate-fwd TRANSLATED (UDP)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a:34123 (ID:10933) -&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) policy-verdict:L3-Only EGRESS ALLOWED (UDP)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a:34123 (ID:10933) -&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) policy-verdict:L3-Only INGRESS ALLOWED (UDP)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a:34123 (ID:10933) -&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) to-endpoint FORWARDED (UDP)</span><br></div></code></pre></div></div><p>For more information about Hubble and the available commands, take a look at the <a href="https://docs.cilium.io/en/v1.18/observability/hubble/" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-dedicated-coredns-matters">Why Dedicated CoreDNS Matters<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#why-dedicated-coredns-matters" class="hash-link" aria-label="Direct link to Why Dedicated CoreDNS Matters" title="Direct link to Why Dedicated CoreDNS Matters" translate="no">​</a></h3>
<p>Each tenant cluster runs its own CoreDNS instance. DNS resolution works entirely within the boundaries of the tenant cluster. Pods in the tenant cluster can only resolve service names in their virtual cluster. They use standard Kubernetes DNS names. For example, <code>my-service.default.svc.cluster.local</code>. Different teams can deploy services with identical names without conflicts. When Team A creates <code>redis.default</code> and Team B creates <code>redis.default</code>, each vCluster's CoreDNS resolves the name within its own isolated environment. No naming collisions, no prefixes, no Helm chart updates.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Using a CNI capable of handling modern workloads matters! In today's post, we explored how the Cilium CNI and Cilium Hubble help teams to control, isolate, and observe multitenant environments while giving them the flexibility to work on what matters the most, coding. In the next post, we will demonstrate how to use <a href="https://docs.cilium.io/en/v1.18/network/servicemesh/gateway-api/gateway-api/" target="_blank" rel="noopener noreferrer" class="">Cilium and Gateway API</a> as a shared resource so that each tenant cluster can create their own Gateway API resources for its workloads. Stay tuned!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.vcluster.com/docs/vcluster/configure/vcluster-yaml/networking" target="_blank" rel="noopener noreferrer" class="">vCluster Networking</a></li>
<li class=""><a href="https://docs.cilium.io/en/v1.18/network/kubernetes/policy/" target="_blank" rel="noopener noreferrer" class="">Cilium Network Policies</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>If you have any questions, feel free to get in touch! You can use the <code>Discussions</code> option found <a href="https://github.com/egrosdou01/blog.grosdouli.dev/discussions" target="_blank" rel="noopener noreferrer" class="">here</a> or reach out to me on any of the social media platforms provided. 😊 We look forward to hearing from you!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">Part 1</a></td><td style="text-align:left">vCluster Recent Updates</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">Part 2</a></td><td style="text-align:left">Introduction to Cilium L2 Announcements and vCluster Platform</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3">Part 3</a></td><td style="text-align:left">vCluster Networking and Cilium Under the Hood</td></tr><tr><td style="text-align:left">Part 4</td><td style="text-align:left">Cilium and Gateway API shared vCluster Resources</td></tr><tr><td style="text-align:left">Part 5</td><td style="text-align:left">Explore vCluster Enterprise Features</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>vCluster</category>
            <category>Cilium</category>
        </item>
        <item>
            <title><![CDATA[Better Together: Sveltos and GitOps Controllers]]></title>
            <link>https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1</link>
            <guid>https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1</guid>
            <pubDate>Thu, 21 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A new series dedicated to the better together story of how Sveltos fits into Platform engineering and the Continuous Deployment (CD) part. In this post, we will cover the most commonly seen scenarios of Sveltos and how it fits with existing GitOps Controllers.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>After many discussions at the KubeCon Europe in Amsterdam, I decided to start a new series covering the most commonly seen scenarios and approaches on how Sveltos and different GitOps Controllers can work together. Sveltos is not a replacement for your GitOps Controller. It is a tool to enhance and extend existing capabilities. When we talk about GitOps Controllers, we primarily refer to either ArgoCD or Flux. In the first part of the series, we will demonstrate how Sveltos fits into the Platform engineering space and, more specifically, in the Continuous Deployment (CD) part. We will provide a commonly seen scenario and explore how Sveltos can control all the deployments.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos and Flux&amp;quot;" src="https://blog.grosdouli.dev/assets/images/argocd_fluxcd_sveltos-ae6bcf9e729650cc70b8a87485ca69c9.jpg" width="6058" height="2640" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation">Motivation<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#motivation" class="hash-link" aria-label="Direct link to Motivation" title="Direct link to Motivation" translate="no">​</a></h2>
<p>I had the chance to meet <a href="https://github.com/gianlucam76" target="_blank" rel="noopener noreferrer" class="">Gianluca Mardenete</a> (creator of <a href="https://github.com/projectsveltos/addon-controller" target="_blank" rel="noopener noreferrer" class="">Sveltos</a> and <a href="https://github.com/gianlucam76/k8s-cleaner" target="_blank" rel="noopener noreferrer" class="">K8Scleaner</a>) during an internal call while working on a project. He introduced me to Sveltos almost two and a half years ago. I was impressed by the functionality and features that came out of the box, one tool to rule them all, and decided to give it a spin. Since then, I can say it not only gave me back time to work on other issues, but also made deployments way easier and scalable for us! Follow along to explore Sveltos together!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario">Scenario<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#scenario" class="hash-link" aria-label="Direct link to Scenario" title="Direct link to Scenario" translate="no">​</a></h2>
<p>Let’s start with a quick introduction to <a href="https://github.com/projectsveltos" target="_blank" rel="noopener noreferrer" class="">Sveltos</a>. It is a Kubernetes add-on controller. It makes deploying and managing Kubernetes add-ons and applications easier using a label approach. We can use it across multiple clusters, whether on-premises, in the cloud, or in multitenant setups. Instead of configuring each cluster individually, Sveltos inverts the model: we define intent through <code>ClusterProfiles</code>,<code>Profiles</code> and labels, and clusters become consumers of that intent. Sveltos integrates very well with existing GitOps Controllers and extends its capabilities using out of the box features like advanced templating, Event Framework, and native integration with Cluster API (CAPI). To learn more about the Sveltos features, take a look at the <a href="https://projectsveltos.io/main/" target="_blank" rel="noopener noreferrer" class="">official documentation</a>. As mentioned in the beginning, the goal of the new series is to demonstrate the different scenarios when it comes to CD. How can someone use Sveltos capabilities when starting with deployments, and how can Sveltos fit and collaborate with other Controllers to help teams scale their operations?</p>
<p>In this post, we will focus on the scenario where Sveltos is the “brain” of our deployments. We will showcase how Sveltos can install ArgoCD and Flux to a central Kubernetes <strong>management</strong> cluster and how the same approach can be used to deploy a GitOps controller to a managed cluster that requires a GitOps Controller with a custom definition. What that means is that we will bring any Sveltos manifests stored in a git repo using an available GitOps Controller. From there, Sveltos takes over and works with the deployments based on the labelling concept.</p>
<p>By the end of this post, you will have a working setup where Sveltos installs and orchestrates both ArgoCD and Flux on a management cluster, and deploys the appropriate GitOps controller to managed clusters based on labels.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+---------------------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|        Deployment         |     Version      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+---------------------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|           RKE2            | v1.35.3+rke2r3   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|         Sveltos           |     v1.8.0       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|    ArgoCD Helm Chart      |     v9.4.17      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|    Flux2 Helm Chart       |     v2.18.3      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|    Flux Operator Helm     |     v0.40.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+---------------------------+------------------+</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-resources">GitHub Resources<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#github-resources" class="hash-link" aria-label="Direct link to GitHub Resources" title="Direct link to GitHub Resources" translate="no">​</a></h2>
<p>The YAML outputs are not complete. Have a look at the <a href="https://github.com/egrosdou01/blog-post-resources/tree/main/sveltos-gitops-controllers/pt1" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ol>
<li class="">A Kubernetes cluster acting as the <strong>management</strong> cluster</li>
<li class="">At least two <strong>managed</strong> clusters</li>
<li class="">Familiarity with Kubernetes manifest files</li>
<li class="">Familiarity with ArgoCD, Flux and GitOps practices</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="diagram">Diagram<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#diagram" class="hash-link" aria-label="Direct link to Diagram" title="Direct link to Diagram" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos and Flux Better Together&amp;quot;" src="https://blog.grosdouli.dev/assets/images/sveltos_and_gitops_controllers-79d7e71617bf2350785c8785547a2700.png" width="1719" height="916" class="img_ev3q"></p>
<p>Taking a look at the diagram, we follow a classic GitOps approach. The DevOps or Platform engineering team will store the source of truth in a git or multiple git repositories. In this scenario, we instruct ArgoCD or Flux to synchronise with any repositories that hold the Sveltos resources like ClusterProfiles, Profiles, EventSource, and EventTrigger to a central <strong>management</strong> cluster. Then, Sveltos takes over the deployment of applications and add-ons using a label approach. Once a change is performed following a standard Merge or PR request, the GitOps controller will bring the updated code to the <strong>management</strong> cluster, and Sveltos will ensure the changes are performed to the affected managed clusters.</p>
<p>We start by installing the different GitOps Controllers to a Kubernetes management cluster (the same cluster where Sveltos is installed) using a ClusterProfile. Then, synchronise the required repositories, and Sveltos performs different deployments across different managed clusters following the Kubernetes labelling approach. For example, if a managed cluster has the label <code>git-controller: argo</code>, Sveltos will deploy ArgoCD to that cluster. If there is another managed cluster with the label set to <code>git-controller: flux</code>, Sveltos will deploy Flux to that cluster. The labelling approach provides teams with extra flexibility while keeping deployments as simple as possible. The <a href="https://en.wikipedia.org/wiki/Don't_repeat_yourself" target="_blank" rel="noopener noreferrer" class="">DRY</a> and <a href="https://en.wikipedia.org/wiki/KISS_principle" target="_blank" rel="noopener noreferrer" class="">KISS</a> frameworks are embraced by Sveltos architecture.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="my-project-structure">My Project Structure<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#my-project-structure" class="hash-link" aria-label="Direct link to My Project Structure" title="Direct link to My Project Structure" translate="no">​</a></h2>
<p>I like to keep things organised. When I use Sveltos as the brains of operations, I usually have the following file structure in a repository.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">sveltos-resources/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── mgmt/               # Resources for the management cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── base/               # Global configurations (applied to all clusters)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── cni/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── security-baseline/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── providers/          # Provider-specific configurations (Labels: provider=aks/eks/on-prem)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── aks/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── eks/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── on-prem/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── environments/       # Env-specific configurations (Labels: env=dev/staging/prod)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── dev/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── staging/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── prod/</span><br></div></code></pre></div></div>
<p>The <code>mgmt/</code> holds the Sveltos resources to be applied in the Kubernetes <strong>management</strong> cluster. The <code>base/</code> directory holds the Sveltos manifests that apply to every cluster, such as the Container Network Interface (CNI) and network policies. For specialised needs, we use <code>providers/</code> and <code>environments/</code> folders. Instead of nesting these, we use labels to target the right Sveltos resources, allowing each cluster to automatically pick up the configurations it needs based on its specific role.</p>
<p>As our demonstration is way simpler, we will use the labels <code>env: dev</code>, <code>env: staging</code>, <code>gitops: argocd</code>, and <code>gitops: flux</code> to deploy specific resources to these clusters. Feel free to experiment with your own file structure based on your use cases.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sveltos-installation">Sveltos Installation<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#sveltos-installation" class="hash-link" aria-label="Direct link to Sveltos Installation" title="Direct link to Sveltos Installation" translate="no">​</a></h2>
<p>To start with the demo, we need to install Sveltos on the <strong>management</strong> cluster. I will use the Helm installation using <strong>Mode 1</strong>. Choose your preferred installation mode by reading the <a href="https://projectsveltos.io/main/getting_started/install/install/" target="_blank" rel="noopener noreferrer" class="">installation documentation</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-chart-installation">Helm Chart Installation<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#helm-chart-installation" class="hash-link" aria-label="Direct link to Helm Chart Installation" title="Direct link to Helm Chart Installation" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=&lt;directory of the management kubeconfig&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm repo add projectsveltos https://projectsveltos.github.io/helm-charts</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm repo update</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm install projectsveltos projectsveltos/projectsveltos -n projectsveltos --create-namespace --version=1.8.0</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="label-management-cluster">Label Management Cluster<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#label-management-cluster" class="hash-link" aria-label="Direct link to Label Management Cluster" title="Direct link to Label Management Cluster" translate="no">​</a></h3>
<p>To control resources in the <strong>management</strong> cluster using Sveltos, we will simply add the label <code>type: mgmt</code> to the <code>sveltoscluster</code> named <code>mgmt</code> in the <code>mgmt</code> namespace. The registration is done by Sveltos during installation.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl label sveltoscluster mgmt -n mgmt type=mgmt</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gitops-controller---management-cluster">GitOps Controller - Management Cluster<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#gitops-controller---management-cluster" class="hash-link" aria-label="Direct link to GitOps Controller - Management Cluster" title="Direct link to GitOps Controller - Management Cluster" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="flux-deployment">Flux Deployment<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#flux-deployment" class="hash-link" aria-label="Direct link to Flux Deployment" title="Direct link to Flux Deployment" translate="no">​</a></h4>
<p>We will use a Sveltos <a href="https://projectsveltos.github.io/sveltos/main/addons/addons/#how-it-works" target="_blank" rel="noopener noreferrer" class="">ClusterProfile</a> to install the Flux-Operator as a Helm chart and include all the required resources for the desired setup. The official OCI registry is used to pull the Flux Operator Helm chart. With Sveltos, we can deploy <code>ConfigMap</code> and <code>Secret</code> resources that contain information about the cluster. That means we can add the Flux <code>Instance</code>, the GitLab <code>secret</code>, and the <code>GitRepository</code> resources into a <code>ConfigMap</code> and instruct Sveltos to deploy it to the <strong>management</strong> cluster.</p>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="flux-operator-clusterprofile">Flux Operator ClusterProfile<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#flux-operator-clusterprofile" class="hash-link" aria-label="Direct link to Flux Operator ClusterProfile" title="Direct link to Flux Operator ClusterProfile" translate="no">​</a></h5>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterProfile</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">clusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">helmCharts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">repositoryURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> oci</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//ghcr.io/controlplaneio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">fluxcd/charts</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repositoryName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">operator</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">operator</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0.40.0</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">operator</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helmChartAction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GitRepository</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> sveltos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sync </span><span class="token comment" style="color:#999988;font-style:italic"># Define the Flux GitRepository resource name defined in the flux-resources ConfigMap</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ./resources/sveltos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manifests/</span></span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="flux-resources-configmap">flux-resources ConfigMap<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#flux-resources-configmap" class="hash-link" aria-label="Direct link to flux-resources ConfigMap" title="Direct link to flux-resources ConfigMap" translate="no">​</a></h5>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">flux_resources.yaml</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    ---</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    apiVersion: fluxcd.controlplane.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    kind: FluxInstance</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      name: flux</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      namespace: flux-system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      annotations:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        fluxcd.controlplane.io/reconcile: "enabled"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        fluxcd.controlplane.io/reconcileEvery: "1h"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        fluxcd.controlplane.io/reconcileTimeout: "5m"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      distribution:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        version: "2.x"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        registry: "ghcr.io/fluxcd"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      components:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        - source-controller</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        - kustomize-controller</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        - helm-controller</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        - notification-controller</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        - image-reflector-controller</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        - image-automation-controller</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      cluster:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        type: kubernetes</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        size: medium</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        multitenant: false</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        networkPolicy: false</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        domain: "cluster.local"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      commonMetadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        labels:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          app.kubernetes.io/name: flux</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      kustomize:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        patches:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          - target:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">              kind: Deployment</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            patch: |</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">              - op: replace</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">                path: /spec/template/spec/nodeSelector</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">                value:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">                  kubernetes.io/os: linux</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">              - op: add</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">                path: /spec/template/spec/tolerations</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">                value:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">                  - key: "CriticalAddonsOnly"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">                    operator: "Exists"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    ---</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    apiVersion: source.toolkit.fluxcd.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    kind: GitRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      name: sveltos-repo-sync</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      namespace: flux-system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      interval: 30s</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      ref:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        branch: main</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      timeout: 60s</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      url: https://&lt;your domain&gt;/&lt;group name&gt;/&lt;repository name&gt;.git</span></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Ensure the ConfigMap with the name <code>flux-resources</code> is deployed to the <strong>management</strong> cluster before deploying the Sveltos <code>ClusterProfile</code>. The <code>ConfigMap</code> can contain any relevant information required for the Flux installation. Feel free to update the example and include the required details. In case authentication is required to sync a repo. Include the code listed below.</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Secret</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> &lt;BASE64 encoded string</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> &lt;BASE64 encoded string</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> git</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">creds</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Opaque</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> source.toolkit.fluxcd.io/v1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GitRepository</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> a</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">repo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sync</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1m0s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ref</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">branch</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> main</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">secretRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> git</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">creds</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 60s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//&lt;your domain</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">/&lt;group name</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">/&lt;repository name</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain">.git</span><br></div></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-installation---management-cluster">ArgoCD Installation - Management Cluster<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#argocd-installation---management-cluster" class="hash-link" aria-label="Direct link to ArgoCD Installation - Management Cluster" title="Direct link to ArgoCD Installation - Management Cluster" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-clusterprofile">ArgoCD ClusterProfile<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#argocd-clusterprofile" class="hash-link" aria-label="Direct link to ArgoCD ClusterProfile" title="Direct link to ArgoCD ClusterProfile" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterProfile</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">clusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">helmCharts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">repositoryURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//argoproj.github.io/argo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helm</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repositoryName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 9.4.17</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helmChartAction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div></code></pre></div></div>
<h5 class="anchor anchorTargetStickyNavbar_Vzrq" id="argo-resources-configmap">argo-resources ConfigMap<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#argo-resources-configmap" class="hash-link" aria-label="Direct link to argo-resources ConfigMap" title="Direct link to argo-resources ConfigMap" translate="no">​</a></h5>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">argo_resources.yaml</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    ---</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    apiVersion: argoproj.io/v1alpha1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    kind: Application</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      name: sveltos-manifests</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      namespace: argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      finalizers:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        - resources-finalizer.argocd.argoproj.io</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      project: default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      source:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        repoURL: "https://&lt;your domain&gt;/&lt;group name&gt;/&lt;repository name&gt;.git"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        targetRevision: HEAD</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        path: resources/sveltos-manifests/</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      destination:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        server: https://kubernetes.default.svc</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        namespace: default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      syncPolicy:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        automated:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          selfHeal: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          prune: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        retry:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          limit: 5</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          backoff:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            duration: 5s</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            maxDuration: 3m0s</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            factor: 2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      ---</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      apiVersion: v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      kind: Secret</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        name: sveltos-repo-sync</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        namespace: argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        labels:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          argocd.argoproj.io/secret-type: repository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      stringData:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        url: "https://&lt;your domain&gt;/&lt;group name&gt;/&lt;repository name&gt;.git"</span></span><br></div></code></pre></div></div>
<p>Once ArgoCD is running, we create an <code>Application</code> resource pointing at the Sveltos resources directory in a GitHub repo. We can do this through the ArgoCD UI, via <code>kubectl apply</code>, or by including the <code>Application</code> manifest in a <code>ConfigMap</code> referenced by the same <code>ClusterProfile</code> using <code>policyRefs</code>. As we use Sveltos to handle the installation of ArgoCD, we take care of the deployment using a Sveltos resource.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-managed-clusters">Register Managed Clusters<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#register-managed-clusters" class="hash-link" aria-label="Direct link to Register Managed Clusters" title="Direct link to Register Managed Clusters" translate="no">​</a></h2>
<p>The Sveltos "magic" 🪄✨ happens when we want to deploy add-ons and applications to a fleet of clusters. First, we need to register the clusters with Sveltos using either the <code>sveltosctl</code> or the <a href="https://projectsveltos.io/main/register/register-cluster/#programmatic-registration" target="_blank" rel="noopener noreferrer" class="">programmatic approach</a>. Make your choice. During the registration process, we assign specific labels to the managed clusters. For example, define the environment, whether they need a special configuration, etc.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flux-vs-argocd-clusterprofile">Flux vs ArgoCD ClusterProfile<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#flux-vs-argocd-clusterprofile" class="hash-link" aria-label="Direct link to Flux vs ArgoCD ClusterProfile" title="Direct link to Flux vs ArgoCD ClusterProfile" translate="no">​</a></h3>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="base-clusterprofile">Base ClusterProfile<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#base-clusterprofile" class="hash-link" aria-label="Direct link to Base ClusterProfile" title="Direct link to Base ClusterProfile" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterProfile</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> common</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">staging</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">clusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchExpressions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> env</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">operator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> In</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">values</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">dev</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> staging</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">helmCharts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">chartName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium/cilium</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1.18.5</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helmChartAction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repositoryName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repositoryURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//helm.cilium.io/</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">values</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      hubble:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        peerService:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          clusterDomain: cluster.local</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        relay:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        tls:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          auto:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            certValidityDuration: 1095</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            method: helm</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        ui:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      nodePort:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      debug:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        enabled: true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">repositoryURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//charts.jetstack.io</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repositoryName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jetstack</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> jetstack/cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1.16.3</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helmChartAction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">values</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      crds:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        enabled: true</span></span><br></div></code></pre></div></div>
<p>The base configuration will be applied to every managed cluster that has the label <code>env: dev</code> or <code>env: staging</code> defined. In this case, we would like to install a specific version of <a href="https://docs.cilium.io/en/stable/" target="_blank" rel="noopener noreferrer" class="">Cilium</a> and <a href="https://cert-manager.io/docs/" target="_blank" rel="noopener noreferrer" class="">cert-manager</a> for certificate management.</p>
<p>Now, depending on whether the developers like to work with ArgoCD or Flux, we can create two different <code>ClusterProfile</code> resources and deploy the preferred GitOps Controller based on the <code>git-controller</code> label defined. Check out the configuration below for more details.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="argocd-controller">ArgoCD Controller<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#argocd-controller" class="hash-link" aria-label="Direct link to ArgoCD Controller" title="Direct link to ArgoCD Controller" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterProfile</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">clusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">git-controller</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">helmCharts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">repositoryURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//argoproj.github.io/argo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helm</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repositoryName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 9.4.17</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argocd</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helmChartAction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> argo</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="flux-gitops-controller">Flux GitOps Controller<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#flux-gitops-controller" class="hash-link" aria-label="Direct link to Flux GitOps Controller" title="Direct link to Flux GitOps Controller" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterProfile</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">clusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">git-controller</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">helmCharts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">repositoryURL</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> oci</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//ghcr.io/controlplaneio</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">fluxcd/charts</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">repositoryName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">operator</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">operator</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">chartVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 0.40.0</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">operator</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">releaseNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">helmChartAction</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Install</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">resources</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Because we already use a GitOps Controller for our <strong>management</strong> cluster and sync any manifests with our cluster, we should not deploy these manifests to our cluster. It is the GitOps Controller's job to do so.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-deployments">Updating Deployments<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#updating-deployments" class="hash-link" aria-label="Direct link to Updating Deployments" title="Direct link to Updating Deployments" translate="no">​</a></h2>
<p>Once the initial deployment is complete, updating applications across the fleet follows the same GitOps workflow. When a <code>ClusterProfile</code> is modified, whether it is a Helm chart version, a change in the <code>values</code> field, or an update to the <code>policyRefs</code>, Sveltos detects the change and performs a Helm upgrade on every Sveltos-managed cluster matching the label selector.</p>
<p>For example, upgrading Cilium from <code>1.18.5</code> to <code>1.18.6</code> in the base <code>ClusterProfile</code> will trigger a Rolling Update across all clusters with the label <code>env: dev</code> or <code>env: staging</code>. Sveltos ensures the desired state is applied, and Kubernetes handles the pod rollout mechanics.</p>
<p>Because we use a GitOps Controller to sync <code>ClusterProfile</code> manifests to the <strong>management</strong> cluster, the update workflow looks like the following.</p>
<ol>
<li class="">Update a <code>ClusterProfile</code> manifest in Git (e.g., change chart version or values)</li>
<li class="">Merge the changes via a PR or Merge Request</li>
<li class="">The GitOps Controller syncs the updated <code>ClusterProfile</code> to the <strong>management</strong> cluster</li>
<li class="">Sveltos detects the change and performs a Helm upgrade on all matching clusters</li>
<li class="">Kubernetes rolls out the updated workloads</li>
</ol>
<p>No manual <code>kubectl apply</code> or cluster-by-cluster intervention is required. The entire update lifecycle is driven by a single Git commit.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The <code>syncMode: Continuous</code> in the <code>ClusterProfile</code> is the default value. This instructs Sveltos to correct any manual drifts on Sveltos-managed clusters. For example, if someone applies a change directly to a managed cluster, Sveltos will reconcile it back to the desired state.</p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Sveltos supports Progressive Rollouts. Feel free to take a look at a <a class="" href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt1">previous blog post</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In today's blog, we demonstrated a simple yet powerful and extensible way of using Sveltos as our main brain for the application and add-on deployments across a fleet of clusters. Using a labelling approach and expanding to complex deployments becomes easy using features like Sveltos templating and Event Framework, which we will cover in Parts 2 and 3.</p>
<p>In the next two blog posts, we will work on how Sveltos integrates with an existing Flux deployment and how we can extend Flux capabilities using Sveltos out of the box advanced features. Stay tuned.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://fluxcd.control-plane.io/operator/" target="_blank" rel="noopener noreferrer" class="">Flux Operator Documentation</a></li>
<li class=""><a href="https://projectsveltos.github.io/sveltos/v1.0.0/getting_started/install/quick_start/" target="_blank" rel="noopener noreferrer" class="">Sveltos Quick Start</a></li>
<li class=""><a href="https://projectsveltos.github.io/sveltos/v1.0.0/events/addon_event_deployment/" target="_blank" rel="noopener noreferrer" class="">Sveltos Event Framework</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>We are here to help! Whether you have questions, or issues or need assistance, our Slack channel is the perfect place for you. Click here to <a href="https://join.slack.com/t/projectsveltos/shared_invite/zt-1hraownbr-W8NTs6LTimxLPB8Erj8Q6Q" target="_blank" rel="noopener noreferrer" class="">join us</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-support-thisproject">👏 Support this&nbsp;project<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#-support-thisproject" class="hash-link" aria-label="Direct link to 👏 Support this&nbsp;project" title="Direct link to 👏 Support this&nbsp;project" translate="no">​</a></h2>
<p>Every contribution counts! If you enjoyed this article, check out the Projectsveltos <a href="https://github.com/projectsveltos" target="_blank" rel="noopener noreferrer" class="">GitHub repo</a>. You can <a href="https://github.com/projectsveltos/addon-controller" target="_blank" rel="noopener noreferrer" class="">star 🌟 the project</a> if you find it helpful.</p>
<p>The GitHub repo is a great resource for getting started with the project. It contains the code, documentation, and many more examples.</p>
<p>Thanks for reading!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">Part 1</a></td><td style="text-align:left">Sveltos As the Brain of Deployments</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation">Part 2</a></td><td style="text-align:left">Flux and Sveltos to automate Flux Helm Releases</td></tr><tr><td style="text-align:left">Part 3</td><td style="text-align:left">Running the Demo: Hub-Spoke With Event Framework</td></tr></tbody></table>]]></content:encoded>
            <category>Sveltos</category>
            <category>ArgoCD</category>
            <category>Flux</category>
            <category>GitOps</category>
            <category>Platform Engineering</category>
        </item>
        <item>
            <title><![CDATA[What's New: vCluster Multi-tenancy Pt.2]]></title>
            <link>https://blog.grosdouli.dev/blog/vcluster-updates-pt2</link>
            <guid>https://blog.grosdouli.dev/blog/vcluster-updates-pt2</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[An Introduction to Cilium Features, vCluster, and the vCluster Platform.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>In <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">part 1</a> of the series, we explored some of the recent vCluster Helm chart changes and how we can create the simplest vCluster possible. We also explored how we can assign specific Kubernetes worker nodes to vClusters based on taints, tolerations, and labels. Today, we will walk through the process of setting up <a href="https://docs.cilium.io/en/v1.18/network/l2-announcements/" target="_blank" rel="noopener noreferrer" class="">Cilium L2 Announcements</a> to make the vCluster available via a <code>LoadBalancer</code> service and then deploy and use the <a href="https://www.vcluster.com/docs/platform" target="_blank" rel="noopener noreferrer" class="">vCluster Platform</a>.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vCluster on existing Kubernetes Cluster&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_architecture-427aaea5d7db6710e493ace3cf067428.png" width="1396" height="566" class="img_ev3q"></p>
<p><a href="https://www.vcluster.com/docs/vcluster/introduction/architecture" target="_blank" rel="noopener noreferrer" class="">Source</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>While we can use a <code>NodePort</code> service to access the vCluster within our setup, this is a single point of failure in case the nodes, for whatever reason, go down. We want to achieve better scalability and ensure the vClusters are accessible via a stable IP address and not dependent on the Kubernetes nodes' availability. Thus, we can use the underlying Cilium functionality, enable IPAM to hand over LoadBalancer IP addresses and then use the L2 Announcements to make the endpoints reachable to the desired network subnet.</p>
<p>As the underlying control plane cluster is an <a href="http://docs.rke2.io/" target="_blank" rel="noopener noreferrer" class="">RKE2</a> cluster, and Cilium is already installed, we will only need to update the Helm chart values to include the additional functionality. Once this is done, we will update the vCluster Helm chart values and expose the virtual clusters via a <code>LoadBalancer</code> IP address instead of a <code>NodePort</code>. Finally, by having the vCluster Platform deployed, we can have a single pane of glass when it comes to the management of a fleet of vClusters across different environments.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|        Resources        |     Type     |     Version      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Control Plane Cluster  |     RKE2     | v1.34.3+rke2r1   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-a     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-b     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The control plane cluster is the cluster that hosts the virtualised control planes for the tenant clusters.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ol>
<li class="">A Kubernetes cluster available with at least two worker nodes</li>
<li class="">Helm <a href="https://helm.sh/docs/intro/install/" target="_blank" rel="noopener noreferrer" class="">installed</a></li>
<li class="">kubectl <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/" target="_blank" rel="noopener noreferrer" class="">installed</a></li>
<li class="">Familiarity with vCluster</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cilium-ipam-and-l2-announcements">Cilium IPAM and L2 Announcements<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#cilium-ipam-and-l2-announcements" class="hash-link" aria-label="Direct link to Cilium IPAM and L2 Announcements" title="Direct link to Cilium IPAM and L2 Announcements" translate="no">​</a></h2>
<p>As mentioned in the beginning, we will create a pool that reflects the available IPv4 addresses to be assigned to <code>LoadBalancer</code> services. We will also define an interface where L2 Announcements should occur. The setup is simple. We will expand on the existing Cilium Helm chart values and enable the ones we need.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="extract-cilium-helm-chart-valuesyaml">Extract Cilium Helm chart values.yaml<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#extract-cilium-helm-chart-valuesyaml" class="hash-link" aria-label="Direct link to Extract Cilium Helm chart values.yaml" title="Direct link to Extract Cilium Helm chart values.yaml" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm get values rke2-cilium -n kube-system -o yaml &gt; values_control_plane.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="expand-values_control_planeyaml">Expand values_control_plane.yaml<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#expand-values_control_planeyaml" class="hash-link" aria-label="Direct link to Expand values_control_plane.yaml" title="Direct link to Expand values_control_plane.yaml" translate="no">​</a></h3>
<p>Based on the <a href="https://docs.cilium.io/en/v1.18/network/l2-announcements/" target="_blank" rel="noopener noreferrer" class="">documentation</a>, the values are required to meet our use case.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">k8sClientRateLimit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">burst</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Important value when many services run on a Kubernetes cluster. Check out the documentation https://docs.cilium.io/en/v1.18/network/l2-announcements/#sizing-client-rate-limit</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">qps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">20</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Important value when many services run on a Kubernetes cluster. Check out the documentation https://docs.cilium.io/en/v1.18/network/l2-announcements/#sizing-client-rate-limit</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kubeProxyReplacement</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Required</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">l2announcements</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-cilium-helm-deployment">Update Cilium Helm Deployment<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#update-cilium-helm-deployment" class="hash-link" aria-label="Direct link to Update Cilium Helm Deployment" title="Direct link to Update Cilium Helm Deployment" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm upgrade rke2-cilium rke2-charts/rke2-cilium --version 1.18.300 --namespace kube-system -f values_control_plane.yaml</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Once the Helm chart has been updated, feel free to restart the <code>cilium-operator</code> deployment and the <code>cilium</code> daemonset. This will not happen automatically unless it is defined in the configuration.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl rollout restart deployment.apps/cilium-operator -n kube-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl rollout restart daemonset.apps/cilium  -n kube-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Ensure the pods have been successfully restarted and that Cilium is using the updated values specified.</span><br></div></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-ciliumloadbalancerippool">Create CiliumLoadBalancerIPPool<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#create-ciliumloadbalancerippool" class="hash-link" aria-label="Direct link to Create CiliumLoadBalancerIPPool" title="Direct link to Create CiliumLoadBalancerIPPool" translate="no">​</a></h3>
<p>The pool will allow us to assign IPv4 addresses to services of type <code>LoadBalancer</code>. The configuration needs to reflect your own setup. In my case, I have a dedicated VLAN I can use for handing over IPv4 addresses.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"cilium.io/v2alpha1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumLoadBalancerIPPool</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vcluster-ipv4-pool"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">blocks</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">start</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"10.10.20.10"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">stop</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"10.10.20.20"</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-ciliuml2announcementpolicy">Create CiliumL2AnnouncementPolicy<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#create-ciliuml2announcementpolicy" class="hash-link" aria-label="Direct link to Create CiliumL2AnnouncementPolicy" title="Direct link to Create CiliumL2AnnouncementPolicy" translate="no">​</a></h3>
<p>The IPs will be announced from the network interface of a node with the interface name <code>eth0</code>. If the interface name in your setup is different, modify the file as needed.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2alpha1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumL2AnnouncementPolicy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">l2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">announcement</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">policy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">interfaces</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> eth0</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">loadBalancerIPs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Without a <code>nodeSelector</code>, the policy applies to all nodes in the cluster. Ensure the configuration is updated based on your setup.</p></div></div>
<p>Apply both manifests to the <strong>Control Plane Cluster</strong>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">$ kubectl apply </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">f vcluster_ipv4_pool.yaml</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">vcluster_l2_announcement.yaml</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">$ kubectl get CiliumL2AnnouncementPolicy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">ippools</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">NAME                                                          AGE</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">ciliuml2announcementpolicy.cilium.io/vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">l2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">announcement</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">policy   24h</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">NAME                                           DISABLED   CONFLICTING   IPS AVAILABLE   AGE</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">ciliumloadbalancerippool.cilium.io/vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">ipv4</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pool   false      False         10              24h</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-vcluster-helm-values">Update vCluster Helm Values<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#update-vcluster-helm-values" class="hash-link" aria-label="Direct link to Update vCluster Helm Values" title="Direct link to Update vCluster Helm Values" translate="no">​</a></h2>
<p>In the initial setup, we defined the Kubernetes API server of every vCluster to be exposed as a <code>NodePort</code> service. This can now change with the power that comes with Cilium as our Container Network Interface (CNI). With the new approach, we have a stable way to reach the virtual clusters. For both vClusters, update the <code>controlPlane.service.spec.type</code> to <code>LoadBalancer</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">controlPlane</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Service configuration for vCluster control plane access</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># The vcluster-dev will be accessible on a LoadBalancer IP Address and port 443</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> LoadBalancer</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-vcluster-helm-deployment">Update vCluster Helm Deployment<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#update-vcluster-helm-deployment" class="hash-link" aria-label="Direct link to Update vCluster Helm Deployment" title="Direct link to Update vCluster Helm Deployment" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm upgrade --install vcluster-team-a vcluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --repo https://charts.loft.sh \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --namespace vcluster-team-a \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --create-namespace \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  -f vcluster_team_a_lb.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#validation" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=control-plane-cluster.yaml </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods,svc -n vcluster-team-a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                                           READY   STATUS    RESTARTS      AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a   1/1     Running   1 (24h ago)   27h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/vcluster-team-a-0                                          1/1     Running   0             7m2s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/kube-dns-x-kube-system-x-vcluster-team-a   ClusterIP      10.43.196.115   &lt;none&gt;        53/UDP,53/TCP,9153/TCP   27h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/vcluster-team-a                            LoadBalancer   10.43.243.114   10.10.20.11   443:30445/TCP            27h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/vcluster-team-a-headless                   ClusterIP      None            &lt;none&gt;        443/TCP                  27h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/vcluster-team-a-node-el07                  ClusterIP      10.43.227.82    &lt;none&gt;        10250/TCP                27h</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The headless service <code>vcluster-team-a-headless</code> is used for internal <code>StatefulSet</code> DNS resolution of the vCluster pod and is not intended for external access.</p></div></div>
<p>From the above output, the vcluster-team-a cluster will be available at <code>https://10.10.20.11:443</code>. This line should be included in the kubeconfig file on the virtual cluster. The <code>kubeconfig</code> of <code>vcluster-team-a</code> is saved as a <code>secret</code> named <code>vcluster-team-a</code> in the <code>vcluster-team-a</code> namespace.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get nodes -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME           STATUS   ROLES    AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE               KERNEL-VERSION             CONTAINER-RUNTIME</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-worker1   Ready    &lt;none&gt;   26h   v1.36.0   10.43.227.82  &lt;none&gt;        Fake Kubernetes Image  4.19.76-fakelinux (amd64)  docker://19.3.12</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -n kube-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAMESPACE     NAME                       READY   STATUS    RESTARTS      AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kube-system   coredns-754d567864-f9kgj   1/1     Running   1 (24h ago)   26h</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>In the nodes outline, we present the end-user with a fake node details. This is defined in the intial configuration of the vCluster. We do not want the end-user to know the real details of underlying host.</p></div></div>
<p>Apply the same steps for the <code>vcluster-team-b</code> cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-platform">vCluster Platform<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#vcluster-platform" class="hash-link" aria-label="Direct link to vCluster Platform" title="Direct link to vCluster Platform" translate="no">​</a></h2>
<p>Imagine your team or your organisation handles a large number of vClusters. An easy way to manage all of them from a central location alongside providing tenant admins with an intuitive UI to perform operations, RBAC, resource quota, cluster lifecycle, etc., is the vCluster Platform.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-the-vcluster-platform">What is the vCluster Platform?<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#what-is-the-vcluster-platform" class="hash-link" aria-label="Direct link to What is the vCluster Platform?" title="Direct link to What is the vCluster Platform?" translate="no">​</a></h3>
<blockquote>
<p>vCluster Platform is the management plane for your tenant cluster fleet. It provides a web UI, CLI, and API for deploying, configuring, and operating tenant clusters across one or more Control Plane Clusters. Access control, lifecycle automation, resource governance, and node management are all built in.</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-platform-helm-deployment">vCluster Platform Helm Deployment<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#vcluster-platform-helm-deployment" class="hash-link" aria-label="Direct link to vCluster Platform Helm Deployment" title="Direct link to vCluster Platform Helm Deployment" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-chart-values">Helm Chart Values<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#helm-chart-values" class="hash-link" aria-label="Direct link to Helm Chart Values" title="Direct link to Helm Chart Values" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">admin</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">create</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">username</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> username</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">password</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"password"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Loft service options</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> LoadBalancer</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Resources of the loft deployment</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2Gi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">config</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">loftHost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//&lt;Accessible IP Address</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 127.0.0.1 can be set when vClusters are created on the same Control Plane Cluster where the vCluster Platform is installed </span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">audit</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">insecureSkipVerify</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Only for Development environments. Use your own valid TLS certificates for Production deployments.</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployment">Deployment<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#deployment" class="hash-link" aria-label="Direct link to Deployment" title="Direct link to Deployment" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm upgrade --install vcluster-platform vcluster-platform \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --repo https://charts.loft.sh/ \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --namespace vcluster-platform \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --create-namespace \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --version 4.9.0 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --values vcluster_platform_values.yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="register-existing-vclusters">Register Existing vClusters<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#register-existing-vclusters" class="hash-link" aria-label="Direct link to Register Existing vClusters" title="Direct link to Register Existing vClusters" translate="no">​</a></h3>
<p>As long as the vCluster Platform is up and running, you should be able to reach the UI using the <code>LoadBalancer</code> IP address. As the <code>vcluster-team-a</code> and <code>vcluster-team-b</code> clusters have been created using a Helm chart, they are not associated with the vCluster Platform. However, we can add them under the vCluster Platform management using either the <code>vcluster</code> command-line utility or Helm. The recommended approach is to use the <a href="https://www.vcluster.com/docs/platform/install/quick-start-guide" target="_blank" rel="noopener noreferrer" class=""><code>vcluster</code> command-line utility</a>.</p>
<ol>
<li class="">Log in to the vCluster Platform from the UI</li>
<li class="">Navigate to the bottom left side, click the username of the logged-in user and click <code>Access keys</code>. Click the <code>Create Access Key</code> button to create a new key. Determine how long the key should be valid and the permissions are assigned to the key</li>
<li class="">On a machine with access to the vcluster CLI, perform the steps below<!-- -->
<ol>
<li class=""><code>vcluster platform login https://&lt;vCluster Platform UI IP Address&gt; --access-key &lt;access-key-generated-from-UI&gt; --insecure</code>. In case a valid TLS certificate is used, there is no need to add the <code>--insecure</code> flag</li>
<li class=""><code>vcluster platform add vcluster vcluster-team-a -n vcluster-team-a --project default</code>. The project can also be set to a different value. Default is the default project created by the deployment of the vCluster Platform</li>
<li class=""><code>vcluster platform add vcluster vcluster-team-b -n vcluster-team-b --project default</code></li>
</ol>
</li>
</ol>
<p>Refreshing the UI, the cluster should already be visible.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vCluster Platform UI&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_ui-82e107e515b92a308775f1ef26217b76.png" width="2318" height="846" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this post, we built on the foundation established in <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">Part 1</a> by enabling Cilium IPAM and L2 Announcements to expose our vCluster API servers via stable <code>LoadBalancer</code> IP addresses, eliminating the single point of failure introduced by <code>NodePort</code> services. We also deployed the vCluster Platform, giving us a centralised management plane for operating our vCluster fleet across environments. In Part 3, we will take a deeper dive into the networking layer, examining how traffic flows between virtual clusters, how network policies can be enforced at both the host and virtual cluster level, and how Cilium's advanced features can further strengthen isolation and observability in a multi-tenant context. Stay tuned!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.vcluster.com/docs/vcluster/deploy/basics" target="_blank" rel="noopener noreferrer" class="">vCluster Documentation</a></li>
<li class=""><a href="https://www.vcluster.com/docs/platform" target="_blank" rel="noopener noreferrer" class="">vCluster Platform</a></li>
<li class=""><a href="https://docs.cilium.io/en/v1.18/" target="_blank" rel="noopener noreferrer" class="">Cilium Docs</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>If you have any questions, feel free to get in touch! You can use the <code>Discussions</code> option found <a href="https://github.com/egrosdou01/blog.grosdouli.dev/discussions" target="_blank" rel="noopener noreferrer" class="">here</a> or reach out to me on any of the social media platforms provided. 😊 We look forward to hearing from you!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">Part 1</a></td><td style="text-align:left">vCluster Recent Updates</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">Part 2</a></td><td style="text-align:left">Introduction to Cilium L2 Announcements and vCluster Platform</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3">Part 3</a></td><td style="text-align:left">vCluster Networking and Cilium Under the Hood</td></tr><tr><td style="text-align:left">Part 4</td><td style="text-align:left">Cilium and Gateway API shared vCluster Resources</td></tr><tr><td style="text-align:left">Part 5</td><td style="text-align:left">Explore vCluster Enterprise Features</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>vCluster</category>
            <category>Cilium</category>
        </item>
        <item>
            <title><![CDATA[What's New: vCluster Multi-tenancy Pt.1]]></title>
            <link>https://blog.grosdouli.dev/blog/vcluster-updates-pt1</link>
            <guid>https://blog.grosdouli.dev/blog/vcluster-updates-pt1</guid>
            <pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[An update on vCluster configuration and Helm deployment.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>It has been a while since my last post on <a href="https://www.vcluster.com/" target="_blank" rel="noopener noreferrer" class="">vCluster</a>. After working more closely with the tool, I decided to update the series and show you what changes when it comes to a local setup.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vCluster on existing Kubernetes Cluster&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_architecture-427aaea5d7db6710e493ace3cf067428.png" width="1396" height="566" class="img_ev3q"></p>
<p><a href="https://www.vcluster.com/docs/vcluster/introduction/architecture" target="_blank" rel="noopener noreferrer" class="">Source</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>My first interaction with vCluster was about two years ago. I needed to create local development environments with minimal resources and low setup effort. This means easy maintenance and less troubleshooting. My goal was to use <a href="https://projectsveltos.io/main/" target="_blank" rel="noopener noreferrer" class="">Sveltos</a> to automate the deployment of these environments when a developer joined or left the team. To achieve my goal, and after looking around at the different open-source tools, I stumbled upon vCluster.</p>
<p>Fast forward a year since my last blog, and I will provide updates on what changes from a vCluster point of view. The first part will be an update of the Helm chart deployment and values. On the next one, we will integrate <a href="https://docs.cilium.io/en/latest/network/l2-announcements/" target="_blank" rel="noopener noreferrer" class="">Cilium L2 Announcements</a> and add the <a href="https://www.vcluster.com/docs/platform" target="_blank" rel="noopener noreferrer" class="">vCluster Platform</a> to the mix for ease of management and operations. Next, we will briefly discuss the Enterprise version and some use cases I covered. Finally, we will explore Sveltos and how to use the <a href="https://projectsveltos.io/main/events/addon_event_deployment/" target="_blank" rel="noopener noreferrer" class="">Sveltos Event Framework</a>. This will help us automatically set up local development environments using a GitOps approach.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|        Resources        |     Type     |     Version      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Control Plane Cluster  |     RKE2     | v1.34.3+rke2r1   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|      vcluster-dev       |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-a     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-b     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The control plane cluster is the cluster that hosts the virtualised control planes for the tenant clusters.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ol>
<li class="">A Kubernetes cluster available with at least two worker nodes</li>
<li class="">Helm <a href="https://helm.sh/docs/intro/install/" target="_blank" rel="noopener noreferrer" class="">installed</a></li>
<li class="">kubectl <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/" target="_blank" rel="noopener noreferrer" class="">installed</a></li>
<li class="">Familiarity with vCluster</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario">Scenario<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#scenario" class="hash-link" aria-label="Direct link to Scenario" title="Direct link to Scenario" translate="no">​</a></h2>
<blockquote>
<p>“Multitenancy (or multi-tenancy) refers to a single software installation that serves multiple tenants. A tenant is a user, application, or a group of users/applications that utilize the software to operate on their own data set.”</p>
</blockquote>
<p>We will start with a basic <code>vcluster-dev</code> vCluster in the <code>dev</code> namespace. Then we will update the Helm chart values and create two additional vClusters, <code>vcluster-team-a</code> and <code>vcluster-team-b</code>, in their own namespaces, where they will be scheduled on different nodes based on <a href="https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/" target="_blank" rel="noopener noreferrer" class="">Kubernetes taints and tolerations</a>. As this is a local setup, the vCluster API Server is exposed as a node port. However, in a later post, we will demonstrate how to use <a href="https://docs.cilium.io/en/stable/network/l2-announcements/" target="_blank" rel="noopener noreferrer" class="">Cilium L2 Announcements</a> to reach the clusters with a LoadBalancer IP address.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-dev-setup">vcluster-dev Setup<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#vcluster-dev-setup" class="hash-link" aria-label="Direct link to vcluster-dev Setup" title="Direct link to vcluster-dev Setup" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="valuesyaml">values.yaml<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#valuesyaml" class="hash-link" aria-label="Direct link to values.yaml" title="Direct link to values.yaml" translate="no">​</a></h3>
<p>A few things have changed since the last blog post. The Helm values structure has been simplified, and configuration options are now more clearly organised. Find the <a href="https://github.com/loft-sh/vcluster/blob/main/chart/values.yaml" target="_blank" rel="noopener noreferrer" class="">vCluster Helm Chart values</a> on GitHub. The main difference with the <a class="" href="https://blog.grosdouli.dev/blog/experimenting-vcluster-multitenancy">previous setup</a> is that a <code>NodePort</code> is used to expose the API Server, while the distribution is defined as <code>k8s</code> and not as <code>k3s</code>.</p>
<p><code>CoreDNS</code> is visible within the tenant cluster, as there might be cases for a custom DNS configuration or specific external DNS resolution domains.</p>
<p>For storage requirements, feel free to use your preferred open-source storage solution (Longhorn, Ceph with Rook). The simplest setup will be the <a href="https://github.com/rancher/local-path-provisioner" target="_blank" rel="noopener noreferrer" class="">local-path-provisioner</a>, which can be installed as a Helm chart, and the setup will use the local storage on each node.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">controlPlane</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">distro</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">k8s</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"loft-sh/kubernetes"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1.36.0"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 40m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 64Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Enable CoreDNS services per tenant cluster</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">coredns</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">statefulSet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ephemeral-storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2Gi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2Gi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ephemeral-storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 400Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">highAvailability</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">podSecurityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containerSecurityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">allowPrivilegeEscalation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">runAsUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">runAsGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">persistence</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">volumeClaim</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auto</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">retentionPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Retain</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2Gi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">storageClass</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"local-path"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">accessModes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ReadWriteOnce"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Service configuration for vCluster control plane access</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># The vcluster-dev will be accessible on Node IP Address:30443</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">httpsNodePort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30443</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kubeletNodePort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> NodePort</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">exportKubeConfig</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">insecure</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">secret</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> dev</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">experimental</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">deploy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">vcluster</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">manifests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Namespace</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> apps/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Deployment</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">template</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">containers</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">latest</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">containerPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Service</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">dev</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">app</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">selector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">app</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> nginx</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">targetPort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ClusterIP</span></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The <code>kubeconfig</code> of <code>vcluster-dev</code> will be saved as a secret named <code>vcluster-dev</code> in the <code>dev</code> namespace.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-deployment">Helm Deployment<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#helm-deployment" class="hash-link" aria-label="Direct link to Helm Deployment" title="Direct link to Helm Deployment" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm repo add loft https://charts.loft.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm repo update</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management/kubeconfig</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm upgrade --install vcluster-dev vcluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --namespace dev \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --create-namespace \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --values /the/path/to/configuration/values.yaml \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --repo https://charts.loft.sh \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --repository-config=''</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-validation">vCluster Validation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#vcluster-validation" class="hash-link" aria-label="Direct link to vCluster Validation" title="Direct link to vCluster Validation" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm list -n dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME        	NAMESPACE	REVISION	UPDATED                                 	STATUS  	CHART          	APP VERSION</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vcluster-dev	dev      	1       	2026-05-06 10:18:55.604901016 +0200 CEST	deployed	vcluster-0.34.0	0.34.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods,svc,secret -n dev</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                                        READY   STATUS    RESTARTS   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/coredns-6dc6dfcb8f-zbrdx-x-kube-system-x-vcluster-dev   1/1     Running   0          2m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/nginx-dev-59c4c87bc6-4lrdc-x-nginx-app-x-vcluster-dev   1/1     Running   0          2m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/vcluster-dev-0                                          1/1     Running   0          2m21s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                         AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/kube-dns-x-kube-system-x-vcluster-dev   ClusterIP   10.43.133.191   &lt;none&gt;        53/UDP,53/TCP,9153/TCP          2m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/nginx-dev-x-nginx-app-x-vcluster-dev    ClusterIP   10.43.97.8      &lt;none&gt;        80/TCP                          2m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/vcluster-dev                            NodePort    10.43.59.149    &lt;none&gt;        443:30443/TCP,10250:31662/TCP   2m21s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/vcluster-dev-headless                   ClusterIP   None            &lt;none&gt;        443/TCP                         2m22s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/vcluster-dev-node-el07-worker1          ClusterIP   10.43.207.196   &lt;none&gt;        10250/TCP                       2m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                        TYPE                 DATA   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">secret/sh.helm.release.v1.vcluster-dev.v1   helm.sh/release.v1   1      2m22s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">secret/vc-config-vcluster-dev               Opaque               1      2m22s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">secret/vc-vcluster-dev                      Opaque               5      2m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">secret/vcluster-dev                         Opaque               5      2m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">secret/vcluster-dev-certs                   Opaque               29     2m11s</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="retrieve-vcluster-dev-kubeconfig">Retrieve vcluster-dev Kubeconfig<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#retrieve-vcluster-dev-kubeconfig" class="hash-link" aria-label="Direct link to Retrieve vcluster-dev Kubeconfig" title="Direct link to Retrieve vcluster-dev Kubeconfig" translate="no">​</a></h3>
<p>Once the virtual cluster is deployed, we can retrieve the <code>kubeconfig</code> by decoding the configuration of the secret with the name <code>vcluster-dev</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get secret vcluster-dev -n dev --template={{.data.config}} | base64 -d &gt; /the/path/to/configuration/vcluster-dev.yaml</span><br></div></code></pre></div></div>
<p>Open the file and update the <code>server: https://localhost:8443</code> section with <code>server: https://&lt;NODE IP&gt;:30443</code>. Ensure the Node IP address defined is the one the <code>vcluster-dev-0</code> pod is scheduled on. Alternatively, we can define the <code>proxy.extraSANs</code> option to create a valid certificate for different DNS names and IPs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#validation" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/the/path/to/configuration/vcluster-dev.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get nodes -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME           STATUS   ROLES    AGE    VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION              CONTAINER-RUNTIME</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">el07-worker1   Ready    &lt;none&gt;   134m   v1.36.0   10.43.207.196   &lt;none&gt;        Fake Kubernetes Image   4.19.76-fakelinux (amd64)   docker://19.3.12</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods,svc -n nginx-app</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                             READY   STATUS    RESTARTS   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/nginx-dev-59c4c87bc6-4lrdc   1/1     Running   0          8m13s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/nginx-dev   ClusterIP   10.43.97.8   &lt;none&gt;        80/TCP    8m12s</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-team-a-setup">vcluster-team-a Setup<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#vcluster-team-a-setup" class="hash-link" aria-label="Direct link to vcluster-team-a Setup" title="Direct link to vcluster-team-a Setup" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="valuesyaml-1">values.yaml<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#valuesyaml-1" class="hash-link" aria-label="Direct link to values.yaml" title="Direct link to values.yaml" translate="no">​</a></h3>
<p>As mentioned, we will use the Kubernetes taints, tolerations, and Kubernetes labels to schedule vCluster to specific nodes based on the team we would like to onboard. The setup below is a simple example of how the vCluster configuration looks alongside the work done on the underlying control plane cluster and nodes.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">controlPlane</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">distro</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">k8s</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">image</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">repository</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"loft-sh/kubernetes"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1.36.0"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 100m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 40m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 64Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Define the node coreDNS should be scheduled on</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">coredns</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">deployment</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nodeSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">vcluster.loft.sh/team</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"team-a"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">tolerations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vcluster.loft.sh/team"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Equal"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"team-a"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">effect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NoSchedule"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">statefulSet</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">limits</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ephemeral-storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2Gi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2Gi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">requests</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">ephemeral-storage</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 400Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">cpu</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 200m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">memory</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 256Mi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">highAvailability</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">replicas</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">security</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">podSecurityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">containerSecurityContext</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">allowPrivilegeEscalation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">runAsUser</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">runAsGroup</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">persistence</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">volumeClaim</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> auto</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">retentionPolicy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Retain</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">size</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 2Gi</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">storageClass</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"local-path"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">accessModes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ReadWriteOnce"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># Scheduling vCluster Control plane pods run on nodes with the label set to team-a</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">scheduling</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">nodeSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">vcluster.loft.sh/team</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"team-a"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">tolerations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vcluster.loft.sh/team"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">operator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Equal"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"team-a"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">effect</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"NoSchedule"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Service configuration for vCluster control plane access</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># The vcluster-team-a will be accessible on Node IP Address with label team-a:30444</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">service</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">httpsNodePort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">30444</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> NodePort</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">sync</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># Tenants see fake nodes, pods still scheduled on correct nodes via taint and toleration</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">fromHost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">nodes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">false</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">toHost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">pods</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enforceTolerations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"vcluster.loft.sh/team=team-a:NoSchedule"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">exportKubeConfig</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">context</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">secret</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Taints must be applied to all worker nodes in the control plane cluster before deploying vCluster. This ensures strict node isolation—team-a pods can only run on team-a nodes, and team-b pods can only run on team-b nodes.</p></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The <code>kubeconfig</code> of <code>vcluster-team-a</code> is saved as a <code>secret</code> named <code>vcluster-team-a</code> in the <code>vcluster-team-a</code> namespace.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-plane-cluster-configuration">Control Plane Cluster Configuration<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#control-plane-cluster-configuration" class="hash-link" aria-label="Direct link to Control Plane Cluster Configuration" title="Direct link to Control Plane Cluster Configuration" translate="no">​</a></h3>
<p>Connect to the control plane cluster, add the respective Kubernetes labels on the nodes we want the <code>vcluster-team-a</code> to use alongside the Kubernetes taints.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/Control Plane Cluster/kubeconfig</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl label node test-worker1 vcluster.loft.sh/team=team-a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get nodes --show-labels | grep "vcluster.loft.sh/team"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl taint node test-worker1 vcluster.loft.sh/team=team-a:NoSchedule</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl taint node test-worker2 vcluster.loft.sh/team=team-b:NoSchedule</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-deployment-1">Helm Deployment<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#helm-deployment-1" class="hash-link" aria-label="Direct link to Helm Deployment" title="Direct link to Helm Deployment" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm repo add loft https://charts.loft.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm repo update</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/Control Plane Cluster/kubeconfig</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm upgrade --install vcluster-team-a vcluster \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --namespace vcluster-team-a \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --create-namespace \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --values /the/path/to/configuration/values.yaml \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --repo https://charts.loft.sh \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --repository-config=''</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-validation-1">vCluster Validation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#vcluster-validation-1" class="hash-link" aria-label="Direct link to vCluster Validation" title="Direct link to vCluster Validation" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm list -n vcluster-team-a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME           	NAMESPACE      	REVISION	UPDATED                                 	STATUS  	CHART          	APP VERSION</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vcluster-team-a	vcluster-team-a	1       	2026-05-06 12:41:34.061614538 +0200 CEST	deployed	vcluster-0.34.0	0.34.0   </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -n vcluster-team-a -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                                        READY   STATUS    RESTARTS   AGE   IP            NODE           NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">coredns-754d567864-5lfcg-x-kube-system-x-vcluster-team-a    1/1     Running   0          41s   10.42.0.66    test-worker1   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vcluster-team-a-0                                           1/1     Running   0          70s   10.42.0.219   test-worker1   &lt;none&gt;           &lt;none&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="retrieve-vcluster-team-a-kubeconfig">Retrieve vcluster-team-a Kubeconfig<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#retrieve-vcluster-team-a-kubeconfig" class="hash-link" aria-label="Direct link to Retrieve vcluster-team-a Kubeconfig" title="Direct link to Retrieve vcluster-team-a Kubeconfig" translate="no">​</a></h3>
<p>Once the virtual cluster is deployed, we can retrieve the <code>kubeconfig</code> by decoding the configuration of the secret with the name <code>vcluster-team-a</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get secret vcluster-team-a -n vcluster-team-a --template={{.data.config}} | base64 -d &gt; /the/path/to/configuration/vcluster-team-a.yaml</span><br></div></code></pre></div></div>
<p>Open the file and update the <code>server: https://localhost:8443</code> section with <code>server: https://&lt;DEDICATED NODE IP&gt;:30444</code>. Follow the same validation approach as in the <code>vcluster-dev</code> section.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="advantages-per-team-dedicated-nodes">Advantages Per-Team Dedicated Nodes<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#advantages-per-team-dedicated-nodes" class="hash-link" aria-label="Direct link to Advantages Per-Team Dedicated Nodes" title="Direct link to Advantages Per-Team Dedicated Nodes" translate="no">​</a></h3>
<ul>
<li class=""><strong>Resource Isolation</strong>: Teams cannot impact each other's resources</li>
<li class=""><strong>Cost Tracking</strong>: Easier to track per-team infrastructure costs</li>
<li class=""><strong>Compliance</strong>: Separate sensitive workloads onto specific nodes</li>
<li class=""><strong>Performance</strong>: Predictable performance based on node allocation</li>
<li class=""><strong>Failure Isolation</strong>: Node failure only affects one team assigned to the node/nodes</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>This post concludes a basic vCluster setup with two separate configurations. Feel free to explore any other possible options provided by the Helm charts to cover different use cases. In the next post, we will enable the Cilium L2 Announcements feature and integrate the free version of the vCluster Platform! Stay tuned!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.vcluster.com/docs/vcluster/deploy/basics" target="_blank" rel="noopener noreferrer" class="">vCluster Documentation</a></li>
<li class=""><a href="https://github.com/loft-sh/vcluster/blob/main/chart/values.schema.json" target="_blank" rel="noopener noreferrer" class="">vCluster Schema Validation</a></li>
<li class=""><a href="https://github.com/loft-sh/vcluster/blob/main/chart/values.yaml" target="_blank" rel="noopener noreferrer" class="">vCluster Helm Chart Values</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>If you have any questions, feel free to get in touch! You can use the <code>Discussions</code> option found <a href="https://github.com/egrosdou01/blog.grosdouli.dev/discussions" target="_blank" rel="noopener noreferrer" class="">here</a> or reach out to me on any of the social media platforms provided. 😊 We look forward to hearing from you!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">Part 1</a></td><td style="text-align:left">vCluster Recent Updates</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">Part 2</a></td><td style="text-align:left">Introduction to Cilium L2 Announcements and vCluster Platform</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3">Part 3</a></td><td style="text-align:left">vCluster Networking and Cilium Under the Hood</td></tr><tr><td style="text-align:left">Part 4</td><td style="text-align:left">Cilium and Gateway API shared vCluster Resources</td></tr><tr><td style="text-align:left">Part 5</td><td style="text-align:left">Explore vCluster Enterprise Features</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>vCluster</category>
        </item>
    </channel>
</rss>