<?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>Wed, 13 May 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[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">Part 3</td><td style="text-align:left">Networking Under the Hood</td></tr><tr><td style="text-align:left">Part 4</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">Part 3</td><td style="text-align:left">Networking Under the Hood</td></tr><tr><td style="text-align:left">Part 4</td><td style="text-align:left">Explore vCluster Enterprise Features</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>vCluster</category>
        </item>
        <item>
            <title><![CDATA[Sveltos: Progressive Rollouts Pt.3]]></title>
            <link>https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3</link>
            <guid>https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3</guid>
            <pubDate>Thu, 23 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[After working with Sveltos progressive rollout capabilities, we now integrate a ChatOps approach to approve or reject progressive rollout deployments using Slack.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>To make our lives easier when it comes to manual Sveltos progressive rollout approvals, we will use <a href="https://github.com/kubeshop/botkube" target="_blank" rel="noopener noreferrer" class="">Botkube</a> and <a href="https://app.slack.com/plans/T09QS26ADJ7?geocode=en-gb" target="_blank" rel="noopener noreferrer" class="">Slack</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario">Scenario<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#scenario" class="hash-link" aria-label="Direct link to Scenario" title="Direct link to Scenario" translate="no">​</a></h2>
<p>As we do not want the Platform teams or Kubernetes operators to manually approve or reject progressive rollout deployments by connecting to a Kubernetes cluster (s), we will allow them to use Slack, receive notifications about <strong>new</strong> or <strong>updated</strong> <code>ClusterPromotion</code> resources to approve or reject deployments through a Slack space. We will continue with the deployment demonstrated in <a class="" href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt2">part 2</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tools">Tools<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#tools" class="hash-link" aria-label="Direct link to Tools" title="Direct link to Tools" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="botkube">Botkube<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#botkube" class="hash-link" aria-label="Direct link to Botkube" title="Direct link to Botkube" translate="no">​</a></h3>
<p>Botkube is used as a ChatOps approach by platform engineers and is designed to integrate Kubernetes with messaging tools like Slack, Discord, and Mattermost. Built primarily in Go, it enables real-time monitoring of Kubernetes clusters by watching events such as pod failures, configuration changes, and deployments, then sending alerts directly to chat channels.</p>
<p>However, the project is considered stale, and there are no new commits. The demonstration here takes place to show the different options that could be used to perform an easy ChatOps approach. In a future post, we will use a Kubernetes MCP server to perform something similar.</p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Botkube is no longer maintained. Folks are looking for help to get the project going. <a href="https://github.com/kubeshop/botkube/issues/1494" target="_blank" rel="noopener noreferrer" class="">Join their efforts</a>!</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="slack">Slack<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#slack" class="hash-link" aria-label="Direct link to Slack" title="Direct link to Slack" translate="no">​</a></h3>
<p>Slack is a cloud-based messaging platform designed for workplace collaboration, allowing teams to communicate through organised channels, direct messages, and file sharing.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-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">|     Management Cluster      |    RKE2         |      v1.34.3+rke2r1   |</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" style="display:inline-block"></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">|      Tools        | 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">|     Sveltos       | v1.4.0   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     kubectl       | v1.34.1  |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     BotKube       | v1.14.x  |</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-progressive-rollouts-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/sveltos-progressive-rollouts/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/sveltos-progressive-rollouts-pt3#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>To perform an integration with Slack, we need a <strong>free-tier</strong> account and the ability to create a Slack application with the correct permissions. Once we have that, we can continue with Sveltos, which will be used to install Botkube alongside the required configuration. Check out the official <a href="https://docs.trilio.io/kubernetes/ecosystem/monitoring-tvk-resources-from-slack-using-botkube" target="_blank" rel="noopener noreferrer" class="">Botkube and Slack guide</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="slack-caveats">Slack Caveats<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#slack-caveats" class="hash-link" aria-label="Direct link to Slack Caveats" title="Direct link to Slack Caveats" translate="no">​</a></h2>
<blockquote>
<ul>
<li class="">Must be installed manually into your Slack workspace using the provided configuration</li>
<li class="">Slack channels must be managed manually, and you need to ensure the Botkube bot is invited to any channel you want to use with Botkube</li>
<li class="">When using executor plugins (e.g. kubectl) in a multi-cluster environment, each cluster needs to have a dedicated Botkube bot for Slack in order to route commands to the correct cluster.</li>
</ul>
</blockquote>
<p>Slack does not support multi-cluster deployments. This could be addressed using <a href="https://discord.com/" target="_blank" rel="noopener noreferrer" class="">Discord</a> or <a href="https://mattermost.com/" target="_blank" rel="noopener noreferrer" class="">Mattermost</a>. However, having already a Slack account, it was an easier choice for my setup.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="slack-free-tier-account">Slack free-tier account<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#slack-free-tier-account" class="hash-link" aria-label="Direct link to Slack free-tier account" title="Direct link to Slack free-tier account" translate="no">​</a></h3>
<p>Follow the link to create a <a href="https://slack.com/intl/en-gb/pricing/paid-vs-free" target="_blank" rel="noopener noreferrer" class="">free-tier Slack account</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-slack-workspace">Create Slack Workspace<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#create-slack-workspace" class="hash-link" aria-label="Direct link to Create Slack Workspace" title="Direct link to Create Slack Workspace" translate="no">​</a></h3>
<p>If you do not already have a Slack workspace with admin rights, follow the <a href="https://slack.com/intl/en-gb/help/articles/206845317-Create-a-Slack-workspace" target="_blank" rel="noopener noreferrer" class="">Slack official documentation</a> for more details.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-slack-application">Create Slack Application<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#create-slack-application" class="hash-link" aria-label="Direct link to Create Slack Application" title="Direct link to Create Slack Application" translate="no">​</a></h3>
<p>To allow Botkube to use the <strong>Slack socket</strong>, we need to create an Application for Botkube and define the right permissions for the users who are part of a channel. Perform the steps described below to create an application.</p>
<ol>
<li class="">Go to the <a href="https://api.slack.com/apps" target="_blank" rel="noopener noreferrer" class="">Slack App console</a></li>
<li class="">Create a new App and select "From an app manifest"</li>
<li class="">Choose the workspace created in a previous step</li>
<li class="">For Public and Private channels configuration</li>
</ol>
<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">  </span><span class="token key atrule" style="color:#00a4db">display_information</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"> Botkube</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">description</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Botkube</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">background_color</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"#a653a6"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">features</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">bot_user</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">display_name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Botkube</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">always_online</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">oauth_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">scopes</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">bot</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"> channels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">read</span></span><br></div><div class="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"> channels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">join</span></span><br></div><div class="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"> groups</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">read</span></span><br></div><div class="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"> app_mentions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">read</span></span><br></div><div class="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"> reactions</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">write</span></span><br></div><div class="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"> chat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">write</span></span><br></div><div class="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"> chat</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">write.public</span></span><br></div><div class="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"> users</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">read</span></span><br></div><div class="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"> im</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">read</span></span><br></div><div class="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"> mpim</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">read</span></span><br></div><div class="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"> commands</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">settings</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">event_subscriptions</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">bot_events</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"> app_mention</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">interactivity</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">is_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">org_deploy_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">socket_mode_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">token_rotation_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 class="token comment" style="color:#999988;font-style:italic"># Enable for production workloads</span></span><br></div></code></pre></div></div>
<ol>
<li class="">Install the Botkube in the Slack workspace</li>
<li class="">Bot OAuth Token<!-- -->
<ul>
<li class="">Navigate to <strong>Features &gt; OAuth &amp; Permissions</strong></li>
<li class="">Copy the "Bot Use OAuth Token"</li>
</ul>
</li>
<li class="">App-Level Token<!-- -->
<ul>
<li class="">Navigate to "Settings &gt; Basic Information &gt; App-Level Tokens"</li>
<li class="">Click the "Generate Token and Scopes"</li>
<li class="">Define a name of your preference</li>
<li class="">Define the <code>connections: write</code> scope</li>
<li class="">Generate and copy the token</li>
</ul>
</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="add-botkube-user-to-slack-channel">Add Botkube user to Slack Channel<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#add-botkube-user-to-slack-channel" class="hash-link" aria-label="Direct link to Add Botkube user to Slack Channel" title="Direct link to Add Botkube user to Slack Channel" translate="no">​</a></h3>
<p>You can either create a new channel within a defined workspace or use one of the autogenerated channels. As we have an application ready, we can invite the <code>@&lt;your application name&gt;</code> user to a channel. For more information about inviting a user to a channel, take a look at the <a href="https://slack.com/intl/en-gb/help/articles/201980108-Add-people-to-a-channel" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="install-botkube-helm-chart">Install Botkube Helm Chart<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#install-botkube-helm-chart" class="hash-link" aria-label="Direct link to Install Botkube Helm Chart" title="Direct link to Install Botkube Helm Chart" translate="no">​</a></h2>
<p>As Botkube offer the ability to use a Helm chart installation without needing to use the botkube cli utility, we will follow this approach. But, before we perform the deployment, let’s create a <code>values.yaml</code> file that contains all our settings first to enable the connection and communication with a specific Slack channel within a workspace, and then enable the Botkube capabilities and permissions working with the Kubernetes cluster.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="craft-valuesyaml-file">Craft values.yaml file<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#craft-valuesyaml-file" class="hash-link" aria-label="Direct link to Craft values.yaml file" title="Direct link to Craft values.yaml file" 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">serviceAccountMountPath</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> /var/run/7e7fd2f5</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">b15d</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">4803</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">bc52</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">f54fba357e76/secrets/kubernetes.io/serviceaccount</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">groups</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">'botkube-plugins-default'</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">rules</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">apiGroups</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 string" style="color:#e3116c">""</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 class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"pods"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"services"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"configmaps"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"events"</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">verbs</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 string" style="color:#e3116c">"get"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"list"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"watch"</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">apiGroups</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 string" style="color:#e3116c">"apiextensions.k8s.io"</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 class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"customresourcedefinitions"</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">verbs</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 string" style="color:#e3116c">"get"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"list"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"watch"</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">apiGroups</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 string" style="color:#e3116c">"config.projectsveltos.io"</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 class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"clusterpromotions"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"clusterpromotions/status"</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">verbs</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 string" style="color:#e3116c">"get"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"list"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"watch"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"update"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"patch"</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">actions</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">'revoke-approval'</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">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ClusterPromotion Approval Handler"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"kubectl describe {{ .Event.Kind | lower }}{{ if .Event.Namespace }} -n {{ .Event.Namespace }}{{ end }} {{ .Event.Name }}"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">bindings</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">sources</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"> k8s</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">clusterpromotions</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">executors</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"> k8s</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">default</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">tools</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">sources</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-clusterpromotions'</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">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ClusterPromotion Events"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">botkube/kubernetes</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"> </span><span class="token important">&amp;default-plugin-context</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">rbac</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">group</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"> Static</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">prefix</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">static</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">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 string" style="color:#e3116c">"botkube-plugins-default"</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">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">namespaces</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token important">&amp;k8s-events-namespaces</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">include</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">".*"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">event</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">types</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"> 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 punctuation" style="color:#393A34">-</span><span class="token plain"> update</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">filters</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">objectAnnotationChecker</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">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"> </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> config.projectsveltos.io/v1beta1/clusterpromotions</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">event</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">types</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"> 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 punctuation" style="color:#393A34">-</span><span class="token plain"> update</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">updateSetting</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">includeDiff</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">fields</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"> spec.stages</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">.trigger.manual.approved</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">executors</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-default-tools</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">botkube/kubectl</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">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Kubectl"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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">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">defaultNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"default"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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"> </span><span class="token important">*default-plugin-context</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">aliases</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">k</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">command</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kubectl</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">displayName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Kubectl alias"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">communications</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">'default-group'</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">socketSlack</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">channels</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">'default'</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">'all-sveltos-promotions-demo'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">bindings</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">executors</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"> k8s</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">default</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">tools</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">sources</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"> k8s</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">clusterpromotions</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">botToken</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'xoxb-'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">appToken</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'xapp-'</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">settings</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">clusterName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"dev-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">log</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">level</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> info</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">plugins</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">cacheDir</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/tmp"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">repositories</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">botkube</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">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">//github.com/kubeshop/botkube/releases/download/v1.14.0/plugins</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">index.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">  </span><span class="token key atrule" style="color:#00a4db">botkubeExtra</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">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">//github.com/kubeshop/botkube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">plugins/releases/download/v1.14.0/plugins</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">index.yaml</span></span><br></div></code></pre></div></div>
<p>We instruct Botkube to have full permissions on the <code>ClusterPromotion</code> resource. Once a new or update <code>ClusterPromotion</code> resource is detected, we trigger a describe action. Then, we use <code>kubectl</code> to patch the resources from Slack.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="botkube-deployment">Botkube Deployment<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#botkube-deployment" class="hash-link" aria-label="Direct link to Botkube Deployment" title="Direct link to Botkube Deployment" translate="no">​</a></h3>
<p>As we have Sveltos already installed in the Kubernetes <strong>management</strong> cluster, we can utilise the <code>ClusterProfile</code> Custom Resource definition (CRD) and allow Sveltos to deploy Botkube to the 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 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"> deploy</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">botkube</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">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">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">syncMode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Continuous</span></span><br></div><div class="token-line codeLine_lJS_" style="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">//charts.botkube.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">   botkube</span></span><br></div><div class="token-line codeLine_lJS_" style="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">        botkube/botkube</span></span><br></div><div class="token-line codeLine_lJS_" style="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.14.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">      botkube</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> botkube</span></span><br></div><div class="token-line codeLine_lJS_" style="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">valuesFrom</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">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">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> botkube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">config</span></span><br></div><div class="token-line codeLine_lJS_" style="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></code></pre></div></div>
<p>The <code>ConfigMap</code> information is available at the <a href="https://github.com/egrosdou01/blog-post-resources/tree/main/sveltos-progressive-rollouts/pt3" target="_blank" rel="noopener noreferrer" class="">blog post resources GitHub repository</a>.</p>
<p>Alternatively, the following Helm chart commands will deploy Botkube to the exposed 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=/path/to/management/kubeconfig</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm repo add botkube https://charts.botkube.io/  </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ helm install botkube botkube/botkube -n botkube --create-namespace -f values.yaml # values.yaml contains the Helm chart values</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -n botkube</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 all the resources related to the Botkube deployment are 'READY' and healthy. If pods are failing or you have other issues in the clusters, troubleshoot the issues before proceeding.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="clusterpromotion-example">ClusterPromotion Example<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#clusterpromotion-example" class="hash-link" aria-label="Direct link to ClusterPromotion Example" title="Direct link to ClusterPromotion Example" translate="no">​</a></h2>
<p>Every time we create or update a <code>ClusterPromotion</code> resource, Botkube sends a notification to a Slack channel. The members of the Slack channel can perform limited actions using the <code>kubectl</code> command from Slack based on the RBAC definition in the <code>values.yaml</code> file.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos View&amp;quot;" src="https://blog.grosdouli.dev/assets/images/botkube_ask-cb2bbff50c07f0338e7c61143d70deb6.png" width="2602" height="412" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Slack Kubernetes Patch Resource&amp;quot;" src="https://blog.grosdouli.dev/assets/images/botkube_patch-b8515ce8ae85afecafba15f0a71c7774.png" width="2624" height="1036" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="workflow-in-action">Workflow in Action<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#workflow-in-action" class="hash-link" aria-label="Direct link to Workflow in Action" title="Direct link to Workflow in Action" translate="no">​</a></h2>
<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">┌─────────────────────────────────────────────────────────┐       ┌──────────────────────────────────────────────────────┐</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           KUBERNETES CLUSTER (dev-cluster)              │       │                  SLACK PLATFORM                      │</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">│  ┌───────────────────────────────────────────────────┐  │       │  Channel: #all-sveltos-promotions-demo               │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │                    BOTKUBE POD                    │  │       │                                                      │</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">│  │  ┌─────────────────┐     ┌─────────────────────┐ │  │        │  │ 🤖 Botkube: ClusterPromotion Updated!         │   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │  │  SOURCE PLUGIN  │     │  EXECUTOR PLUGIN    │ │  │        │  │    Diff: manual.approved: false ──► true      │   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │  │  Watches:       │     │  kubectl describe   │ │  │        │  │  [ 🔍 Describe ][ ✅ Approve ][ ❌ Revoke ]    │   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │  │  ClusterPromo   │     │  kubectl [k]        │ │  │        │  └──────────────────────────────────────────────┘   │</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">│  │           └──────────────┬──────────┘            │  │        │  ┌──────────────────────▼───────────────────────┐   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │                    ┌─────▼──────────┐            │  │        │  │ 👤 User: @Botkube kubectl describe           │    │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │                    │  BOTKUBE CORE  │            │  │        │  │         my-promotion -n production           │   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │                    │  RBAC + Action ├────────────────────────►  └──────────────────────┬───────────────────────┘   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │                    │  Handler       │◄───────────────────────┐                         │                           │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │                    └────────┬───────┘  Outbound WSS          │  ┌──────────────────────▼───────────────────────┐   │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  └─────────────────────────────┼─────────────────────┘  │       │  │ 🤖 Botkube: Name:   my-promotion             │    │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│                                │ Watch / Patch          │       │  │             Stages: manual.approved: true    │    │</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">│  │              KUBERNETES API SERVER               │   │       │                                                      │</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│  │              ClusterPromotion CRD                │   │       └──────────────────────────────────────────────────────┘</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">└─────────────────────────────────────────────────────────┘</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In my opinion, ChatOps is a valid approach when it comes to the approval or rejection of <code>ClusterPromotion</code> actions. It provides teams with an easy and controlled way of checking what is going on in a cluster. However, nowadays, this could be easily done using an AI Agent instead of using different Slack plugins to achieve the same result.</p>
<p>In part 4 of the series, we will explore how to achieve a ChatOps approach using AI Agents instead. Stay tuned! 🚀</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-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.cloudflare.com/en-gb/application-services/products/analytics/" target="_blank" rel="noopener noreferrer" class="">Sveltos Quick Start</a></li>
<li class=""><a href="https://projectsveltos.github.io/sveltos/main/use_cases/use_case_idp/" target="_blank" rel="noopener noreferrer" class="">Sveltos Use Cases</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-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="-support-thisproject">👏 Support this&nbsp;project<a href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3#-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" 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-progressive-rollouts-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/sveltos-progressive-rollouts-pt1">Part 1</a></td><td style="text-align:left">Introduction to Sveltos Progressive Rollouts part 1</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt2">Part 2</a></td><td style="text-align:left">Introduction to Sveltos Progressive Rollouts part 2</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt3">Part 3</a></td><td style="text-align:left">Sveltos Progressive Rollouts and ChatOps</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>Sveltos</category>
            <category>ChatOps</category>
        </item>
        <item>
            <title><![CDATA[Mkdocs Material Migration to Zensical]]></title>
            <link>https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical</link>
            <guid>https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical</guid>
            <pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A quick guide on what is required to migrate from MkDocs Material to Zensical.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>In a previous post, we looked at using MkDocs and MkDocs Material with the Mike plugin for versioning. This helps in creating a static site on GitHub with GitHub workflows. As MkDocs Material entered maintenance mode on the 6th of November 2025, I decided to migrate to <a href="https://zensical.org/" target="_blank" rel="noopener noreferrer" class="">Zensical</a>.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Documentation Meme&amp;quot;" src="https://blog.grosdouli.dev/assets/images/documentation-c91b3a92edae08140c63a5b0fca84fc5.jpg" width="500" height="709" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>The team will continue to provide <strong>critical bug fixes</strong> and <strong>security</strong> updates for at <strong>least 12 months</strong>, with <strong>no new features</strong> to MkDocs Material, while users are encouraged to migrate to <strong>Zensical</strong> once dependent features are available.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-zensical">What is Zensical?<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#what-is-zensical" class="hash-link" aria-label="Direct link to What is Zensical?" title="Direct link to What is Zensical?" translate="no">​</a></h3>
<p>Zensical is a <strong>modern</strong>, <strong>free</strong>, and <strong>scalable</strong> o<strong>pen-source</strong> toolchain for static sites from the creators of Material for MkDocs. It is designed for speed and superior authoring, and the <strong>alpha</strong> version is already compatible with Material for MkDocs!</p>
<p>Effectively, if you already use MkDocs Material, you can switch to Zensical if the features you depend on are available.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-resources">GitHub Resources<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#github-resources" class="hash-link" aria-label="Direct link to GitHub Resources" title="Direct link to GitHub Resources" translate="no">​</a></h2>
<p>The showcase repository is available <a href="https://github.com/egrosdou01/mkdocs-versioning-example" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ol>
<li class="">Go through parts <a class="" href="https://blog.grosdouli.dev/blog/mkdocs-mike-integration">one</a> and <a class="" href="https://blog.grosdouli.dev/blog/mkdocs-mike-integration-part-2">two</a> of the series</li>
<li class="">Basic knowledge and understanding of MkDocs</li>
<li class="">Basic understanding of GitHub workflows</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migration---plan-preparation">Migration - Plan Preparation<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#migration---plan-preparation" class="hash-link" aria-label="Direct link to Migration - Plan Preparation" title="Direct link to Migration - Plan Preparation" translate="no">​</a></h2>
<p>The <a href="https://zensical.org/compatibility/" target="_blank" rel="noopener noreferrer" class="">compatibility section</a> shows that the team aimed for a smooth migration. This means users can expect easy compatibility with Material for MkDocs. If you already have an <code>mkdocs.yml</code> file, you can keep it and perform only the required changes for Zensical. To learn more about how Zensical understands an existing <code>mkdocs.yml</code> file, go through the <a href="https://zensical.org/compatibility/configuration/" target="_blank" rel="noopener noreferrer" class="">configuration section</a>. To learn more about the features, go through the <a href="https://zensical.org/compatibility/features/" target="_blank" rel="noopener noreferrer" class="">features section</a>.</p>
<p>In my case, I performed the steps below to migrate the <a href="https://projectsveltos.io/main/" target="_blank" rel="noopener noreferrer" class="">Sveltos documentation</a> site to Zensical. The approach might differ based on your project and structure. However, the core idea remains the same.</p>
<ol>
<li class="">Read the <a href="https://zensical.org/docs/get-started/" target="_blank" rel="noopener noreferrer" class="">Zensical documentation</a></li>
<li class="">Go through the <a href="https://zensical.org/compatibility/features/" target="_blank" rel="noopener noreferrer" class="">features section</a></li>
<li class=""><a href="https://zensical.org/docs/setup/versioning/?h=mike#versioning_1" target="_blank" rel="noopener noreferrer" class="">Understand</a> how Mike's for versioning fits into the mix</li>
<li class="">Track down the features used for your deployment. Explore how the <code>mkdocs.yml</code> needs to be updated</li>
<li class="">Explore how the <a href="https://zensical.org/docs/publish-your-site/?h=github#with-github-actions" target="_blank" rel="noopener noreferrer" class="">GitHub workflows</a> can be modified for the migration</li>
</ol>
<p>In Sveltos' case, the changes performed were minimal. In the sections below, we will outline how the configuration was modified to accommodate the migration.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="feature-used">Feature Used<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#feature-used" class="hash-link" aria-label="Direct link to Feature Used" title="Direct link to Feature Used" translate="no">​</a></h3>
<ul>
<li class=""><a href="https://zensical.org/docs/setup/extensions/python-markdown-extensions/?h=markdown_extensions#python-markdown-extensions" target="_blank" rel="noopener noreferrer" class="">Python Markdown Extensions</a>
<ul>
<li class="">pymdownx.emoji</li>
</ul>
</li>
<li class=""><a href="https://zensical.org/docs/setup/colors/?h=pal#color-palette-toggle" target="_blank" rel="noopener noreferrer" class="">palette.toggle.icon</a></li>
<li class=""><a href="https://zensical.org/docs/setup/versioning/?h=mike#versioning_1" target="_blank" rel="noopener noreferrer" class="">Mike Versioning</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mkdocsyml">mkdocs.yml<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#mkdocsyml" class="hash-link" aria-label="Direct link to mkdocs.yml" title="Direct link to mkdocs.yml" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="before">Before<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#before" class="hash-link" aria-label="Direct link to Before" title="Direct link to Before" 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"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">markdown_extensions</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">pymdownx.emoji</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">emoji_index</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!!python/name:material.extensions.emoji.twemoji</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">emoji_generator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!!python/name:material.extensions.emoji.to_svg</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">toggle</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">icon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> material/brightness</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">7</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">toggle</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">icon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> material/brightness</span><span class="token punctuation" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">4</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">plugins</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"> search</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"> mike</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="after">After<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#after" class="hash-link" aria-label="Direct link to After" title="Direct link to After" 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"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">markdown_extensions</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">pymdownx.emoji</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">emoji_index</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!!python/name:zensical.extensions.emoji.twemoji</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</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">emoji_generator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token tag" style="color:#00009f">!!python/name:zensical.extensions.emoji.to_svg</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">""</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">toggle</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">icon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lucide/sun</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">toggle</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">icon</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lucide/moon</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">plugins</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"> search</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-workflow---updates">GitHub Workflow - Updates<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#github-workflow---updates" class="hash-link" aria-label="Direct link to GitHub Workflow - Updates" title="Direct link to GitHub Workflow - Updates" translate="no">​</a></h3>
<p>Only minimal changes were necessary here.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="dev-workflow">dev Workflow<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#dev-workflow" class="hash-link" aria-label="Direct link to dev Workflow" title="Direct link to dev Workflow" 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">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CI build dev docu</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</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">push</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">branches</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"> 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 plain"></span><span class="token key atrule" style="color:#00a4db">permissions</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">contents</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> write</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</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">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</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">steps</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">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v6</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">with</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">fetch-depth</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 punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">python@v6</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">with</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">python-version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 3.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 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"> Install Dependencies</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">run</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 theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        pip install zensical==0.0.32</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 scalar string" style="color:#e3116c">        pip install git+https://github.com/squidfunk/mike.git</span><span class="token plain"></span></span><br></div><div class="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"> Setup Docs Deploy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">run</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">        git config --global user.name "Example Docu Deploy"</span></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">        git config --global user.email "docs.deploy@eleni.dev"</span><span class="token plain"></span></span><br></div><div class="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"> Build Docs Website</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">run</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">        mike deploy --push main --update-aliases</span></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">        mike set-default main --push</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="production-workflow">Production Workflow<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#production-workflow" class="hash-link" aria-label="Direct link to Production Workflow" title="Direct link to Production Workflow" 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">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CI Build Prod Docu</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">on</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">release</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">types</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">published</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">permissions</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">contents</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> write</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">jobs</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">runs-on</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ubuntu</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">steps</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">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/checkout@v6</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</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">fetch-depth</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 punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">uses</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> actions/setup</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">python@v6</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">with</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">python-version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 3.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 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"> Install Dependencies</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</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 theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          pip install zensical==0.0.32</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 scalar string" style="color:#e3116c">          pip install git+https://github.com/squidfunk/mike.git</span><span class="token plain"></span></span><br></div><div class="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"> Setup Docs Deploy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</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">          git config --global user.name "Example Docu Deploy"</span></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">          git config --global user.email "docs.deploy@eleni.dev"</span><span class="token plain"></span></span><br></div><div class="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"> Build Docs Website</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mike deploy </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">push </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">update</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">aliases $</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> github.event.release.tag_name </span><span class="token punctuation" style="color:#393A34">}</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 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"> Hide Old Releases</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">run</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">          VISIBLE_RELEASES=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">          # Include only versions starting with `v`.</span></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">          # Sort the versions from oldest to 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 scalar string" style="color:#e3116c">          all_releases=$(mike list --json | \</span></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">                                 jq -r '.[] | select(.properties.hidden | not) | .version' | \</span></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">                                 grep -E '^v?[0-9]+\.[0-9]+\.[0-9]+(\-.*)?$' | \</span></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">                                 sort -V)</span></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">          # Add the Mike versions into an array</span></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">          releases_array=($all_releases)</span></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">          num_releases=${#releases_array[@]}</span><span class="token plain"></span></span><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">          </span><span class="token comment" style="color:#999988;font-style:italic"># Check if more than 2 releases are available</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          if (( num_releases </span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> VISIBLE_RELEASES )); then</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            hide=$((num_releases </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> VISIBLE_RELEASES))</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            echo "We have to hide $hide versions"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span></span><br></div><div class="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"># Take the oldest applicable releases and hide them</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            for (( i=0; i&lt;hide; i++ )); do</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              hide_version=$</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">releases_array</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">i</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">echo "Hiding release version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> $hide_version"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              mike props </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">set hidden=true "$hide_version" </span><span class="token punctuation" style="color:#393A34">-</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">push </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            done</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          else</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            echo "No release versions to hide. Exit"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          fi</span></span><br></div></code></pre></div></div>
<p>A detailed PR for the Sveltos production documentation is available <a href="https://github.com/projectsveltos/sveltos/pull/724" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="local-execution">Local Execution<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#local-execution" class="hash-link" aria-label="Direct link to Local Execution" title="Direct link to Local Execution" translate="no">​</a></h2>
<p>To run the code locally, only a few things are required. Follow the commands listed below.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="python-environment-setup">Python Environment Setup<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#python-environment-setup" class="hash-link" aria-label="Direct link to Python Environment Setup" title="Direct link to Python Environment Setup" 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">$ python3 -m venv .venv</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ source .venv/bin/activate</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ pip install zensical==0.0.32</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ pip install git+https://github.com/squidfunk/mike.git</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="static-site-execution">Static Site Execution<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#static-site-execution" class="hash-link" aria-label="Direct link to Static Site Execution" title="Direct link to Static Site Execution" 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">$ zensical build --clean</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ zensical serve</span><br></div></code></pre></div></div>
<p>The local static site is available at <code>http://localhost:8000</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Easy and headache-free approach to migrating from MkDocs Material to Zensical! Happy coding!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#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://zensical.org/docs/get-started/" target="_blank" rel="noopener noreferrer" class="">Zensical - Getting Started</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical#%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/mkdocs-material-migration-zensical#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/mkdocs-mike-integration">Part 1</a></td><td style="text-align:left">MkDocs Material integration with Mike Plugin</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/mkdocs-mike-integration-part-2">Part 2</a></td><td style="text-align:left">MkDocs Material integration with Mike Plugin Part 2</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/mkdocs-material-migration-zensical">Part 3</a></td><td style="text-align:left">MkDocs Material Migration to Zensical</td></tr></tbody></table>]]></content:encoded>
            <category>MkDocs</category>
            <category>MkDocs Material</category>
            <category>GitHub</category>
        </item>
        <item>
            <title><![CDATA[KubeCon Amsterdam 2026]]></title>
            <link>https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026</link>
            <guid>https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026</guid>
            <pubDate>Thu, 02 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A quick outline of the very first KubeCon Amsterdam held in RAI, highlighting key sessions.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>KubeCon Amsterdam 2026 highlights.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;KCD Geneva 2025&amp;quot;" src="https://blog.grosdouli.dev/assets/images/kubecon_amsterdam_2026-ae04ecbf2c3d6d7b29de38ac9dd9b0e4.jpg" width="4000" height="3000" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>Well, first <a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/" target="_blank" rel="noopener noreferrer" class="">KubeCon</a> ever for me! I was already hyped by the <a href="https://cloud-native.rejekts.io/" target="_blank" rel="noopener noreferrer" class="">Cloud Native Rejekts</a> and the energy of the community; I was looking forward to attending this one! <a href="https://hai.wxs.ro/guides/kubecon-guide/" target="_blank" rel="noopener noreferrer" class="">Vlad's post</a> got me thinking, "You will walk and talk a lot." He also shared useful tips: download the venue map, remember must-see sessions, avoid overscheduling, and pack light. And I would agree with most of the points mentioned! Indeed, it was going to be a long week, and I had to come up with a plan to keep the energy levels high. My plan was simple: I would run almost daily in the morning, shower, eat breakfast, pack, and head to the event. And to be honest, the morning runs were great! They were refreshing, especially with the unpredictable weather in Amsterdam. From sun to wind and rain!</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Amsterdam Morning Run&amp;quot;" src="https://blog.grosdouli.dev/assets/images/morning_run_kubecon_amsterdam_2026-1c270b1aa4757b48ad03d3533a012069.jpg" width="4000" height="3000" class="img_ev3q"></p>
<p>From the moment I entered the venue, I noticed the vibrant community. It struck me that it was full of engineers who work with open-source and cloud-native technologies. They share my passions and interests, and we all face the same issues and frustrations. So, let the week begin. And in all truth, it was an amazing week, with amazing humans!</p>
<p>Briefly, my main focus was to discuss and exchange ideas with fellow platform engineers on scalability, security, and the different ways and approaches of running AI workloads. Apart from that, I wanted to visit a few booths and ask about roadmap items and what is coming next.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-0-co-located-events">Day-0: Co-located Events<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#day-0-co-located-events" class="hash-link" aria-label="Direct link to Day-0: Co-located Events" title="Direct link to Day-0: Co-located Events" translate="no">​</a></h2>
<p>I was lucky enough to attend the KubeCon co-located events. I was between the Platform Engineering, Flux, Cilium and MCP Con. My morning started with the session <a href="https://colocatedeventseu2026.sched.com/event/2DY11/vibe-coding-meets-gitops-stefan-prodan-controlplane" target="_blank" rel="noopener noreferrer" class="">"Vibe Coding Meets Gitops" by Stefan Prodan</a>, where the Flux MCP was introduced alongside its usability and its purpose when it comes to AI agents and GitOps. A bit later on, the session <a href="https://colocatedeventseu2026.sched.com/event/2ICsA/talking-to-your-cluster-conversational-gitops-with-flux-mcp-william-rizzo-mirantis" target="_blank" rel="noopener noreferrer" class="">"Talking To Your Cluster: Conversational Gitops with Flux MCP by William Rizzo"</a> gave a practical example of how to combine a GitOps approach with an AI agent specialised in Flux.</p>
<p>Max Koerbaecher provided a nice overview and practical insights on how to create an IDP for AI engineering. The session details are available <a href="https://colocatedeventseu2026.sched.com/event/2DY2Z/creating-an-idp-for-ai-engineering-max-korbacher-liquid-reply-gmbh" target="_blank" rel="noopener noreferrer" class="">here</a>. To me, the "AIDP Reference Architecture" mentioned in the slides is something to take and start discussions with the platform team.</p>
<p>Continuing with Dominik Schmidle and the session <a href="https://colocatedeventseu2026.sched.com/event/2DY5o/overwhelmed-by-scale-how-product-thinking-fixes-platform-teams-dominik-schmidle-giantswarmio" target="_blank" rel="noopener noreferrer" class="">"Overwhelmed by Scale: How Product Thinking Fixes Platform Teams"</a>, where he explained how platform teams started off well but ended up overwhelmed with different sorts of issues and concerns, the session explains that the fix is to treat the platform like a product!</p>
<p>At the MCP Con, I had the chance to watch a talk by <a href="https://colocatedeventseu2026.sched.com/event/2DY5H/the-new-ai-coding-fabric-patrick-debois-tessl" target="_blank" rel="noopener noreferrer" class="">Patrick Debois "The New AI Coding Fabric"</a>, on how AI-driven development is evolving and goes beyond traditional IDEs. I kept the phrase "Context is the fuel", and a way to remember that garbage in, garbage out. Context will be one of the most critical aspects when it comes to AI coding.</p>
<p>Last but not least, Cilium Con was a blast! My highlight sessions were one from <a href="https://colocatedeventseu2026.sched.com/event/2DY7S/cloud-native-promises-on-premises-bump-your-load-balancing-to-v2-with-cilium-mikael-johansson-lansberg-etraveli-group-ab" target="_blank" rel="noopener noreferrer" class="">Mikael Johansson Länsberg</a> on how to replace legacy load balancers with Cilium, the lightning talk from <a href="https://colocatedeventseu2026.sched.com/event/2DY8x/cllightning-talk-whats-happening-in-cilium-current-projects-you-need-to-see-martynas-pumputis-isovalent-at-cisco" target="_blank" rel="noopener noreferrer" class="">Martynas Pumputis</a> on what's happening in Cilium and the lessons learned when it comes to Tetragon policies from <a href="https://colocatedeventseu2026.sched.com/event/2DY8B/one-policy-to-rule-them-all-scaling-tetragon-without-flooding-your-cluster-alessio-biancalana-suse" target="_blank" rel="noopener noreferrer" class="">Alessio Biancalana</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="keynotes">KeyNotes<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#keynotes" class="hash-link" aria-label="Direct link to KeyNotes" title="Direct link to KeyNotes" translate="no">​</a></h2>
<p>From a keynote's point of view and more on the technical side, I felt we moved away from the AI general talks, and we headed into scalable, secure and extensible platforms for AI. Platforms are once again in the center of operations and serve developers the best way possible by the use of self-service portals or APIs. The Platform teams will have to provide Al infrastructure and capabilities using best practices and guardrails. Let the challenge begin!</p>
<p>Sovereignty and the Open Sovereign Cloud came up as a big topic and names like the <a href="https://neonephos.org/" target="_blank" rel="noopener noreferrer" class="">NeoNephos</a>, <a href="https://www.ovhcloud.com/en/" target="_blank" rel="noopener noreferrer" class="">OVH</a> and <a href="https://upcloud.com/" target="_blank" rel="noopener noreferrer" class="">Upcloud</a> popped up. Apart from that, <a href="https://www.cncf.io/blog/2026/03/24/welcome-llm-d-to-the-cncf-evolving-kubernetes-into-sota-ai-infrastructure/" target="_blank" rel="noopener noreferrer" class="">llm-d</a> joined the Cloud Native Computing Foundation (CNCF), and <a href="https://www.solo.io/" target="_blank" rel="noopener noreferrer" class="">solo.io</a> announced the launch of <strong>agentevals</strong> and the contribution of the open source project agentregistry to the CNCF.</p>
<p>Last but not least, day 1 keynotes concluded with an <a href="https://kccnceu2026.sched.com/event/2CtJP/keynote-riding-the-waves-around-the-world-in-an-electric-glider-powered-by-nature-data-and-open-science-ricardo-rocha-lead-platforms-infrastructure-cern-klaus-ohlmann-founder-mountain-wave-project" target="_blank" rel="noopener noreferrer" class="">electric glider</a> powered by renewable energy. A session out of the ordinary. Very interesting topic around sustainability.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-1">Day-1<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#day-1" class="hash-link" aria-label="Direct link to Day-1" title="Direct link to Day-1" translate="no">​</a></h2>
<p><a href="https://kccnceu2026.sched.com/event/2CVy5/api-is-the-new-ssh-forging-a-zero-trust-vm-platform-on-kubernetes-evangelista-tragni-devoteam" target="_blank" rel="noopener noreferrer" class="">Evangelista Tragni</a> had a great session on <a href="https://kubevirt.io/" target="_blank" rel="noopener noreferrer" class="">KubeVirt</a>. He shared many insights about the technology, how it works, and its current limitations. If your organisation is looking for ways to use Kubernetes for hosting virtual machines, I would recommend taking a look at the session notes.</p>
<p>I particularly enjoyed the session from <a href="https://kccnceu2026.sched.com/event/2EMyb/1000-services-1-year-0-downtime-airbnbs-zonal-cluster-migration-sunny-beatteay-airbnb" target="_blank" rel="noopener noreferrer" class="">Sunny Beatteay</a>. They shared their journey of moving cloud infrastructure from regional to zonal clusters. Their team’s experiences and the lessons learned during the migration were especially insightful. Worth checking out.</p>
<p><a href="https://kccnceu2026.sched.com/event/2CVzF/the-future-of-kubernetes-scalability-challenges-of-the-gigawatt-computing-power-of-the-ai-era-maciek-rozacki-google-cloud-artur-rodrigues-anthropic" target="_blank" rel="noopener noreferrer" class="">Maciek Różacki and Artur Rodrigues</a> discussed the architectural shifts required for Kubernetes to remain the backbone of modern computing when it comes to AI and LLMs.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-2">Day-2<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#day-2" class="hash-link" aria-label="Direct link to Day-2" title="Direct link to Day-2" translate="no">​</a></h2>
<p>So many great sessions at day 2; however, my personal highlight was a session from <a href="https://kccnceu2026.sched.com/event/2CW1r/in-place-updates-with-cluster-api-the-sweet-spot-between-immutable-and-mutable-infrastructure-fabrizio-pandini-stefan-buringer-broadcom" target="_blank" rel="noopener noreferrer" class="">Stefan Bueringer and Fabrizio Pandini "In-place Updates with Cluster API: The Sweet Spot Between Immutable and Mutable Infrastructure"</a>, where they explored Cluster API's innovative in-place updates feature, which eliminates the need to choose between immutable and mutable infrastructure approaches.</p>
<p>Day 2 for me was mostly spent at the show expo floor and at the booth area, mainly talking to vendors I had an interest in. Apart from that, I met and had discussions with different people from different backgrounds and experiences! Loved it!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="booths-i-always-visit">Booths I Always Visit<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#booths-i-always-visit" class="hash-link" aria-label="Direct link to Booths I Always Visit" title="Direct link to Booths I Always Visit" translate="no">​</a></h3>
<p>I make it a point to visit the booths below at conferences and ask what is coming next:</p>
<ul>
<li class=""><a href="https://www.vcluster.com/" target="_blank" rel="noopener noreferrer" class="">vCluster</a>: I use vCluster to set up multitenant environments and automate workflows with <a href="https://projectsveltos.github.io/sveltos/main/" target="_blank" rel="noopener noreferrer" class="">Sveltos</a></li>
<li class=""><a href="https://www.siderolabs.com/" target="_blank" rel="noopener noreferrer" class="">Sidero Labs</a>: As a Talos fan, I always check in on what is next. I am particularly excited about SBOM capabilities for the open-source version.</li>
<li class=""><a href="https://isovalent.com/" target="_blank" rel="noopener noreferrer" class="">Isovalent</a>: Great conversations with knowledgeable people about Cilium and the Isovalent Platform. Plus, nice stickers and hands-on labs to explore Cilium features</li>
<li class=""><a href="https://documentation.suse.com/cloudnative/rke2/" target="_blank" rel="noopener noreferrer" class="">SUSE</a>: RKE2 clusters are heavily used in my lab setup alongside Talos. I am always curious about what is coming</li>
<li class=""><a href="https://www.dash0.com/" target="_blank" rel="noopener noreferrer" class="">Dash0</a>: Discovered a fresh approach to collecting and displaying metrics; it is worth checking out!</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="day-3">Day-3<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#day-3" class="hash-link" aria-label="Direct link to Day-3" title="Direct link to Day-3" translate="no">​</a></h2>
<p>Day-3 was a short one for me as I had to make my way back home. If you are into Kubernetes networking and want to explore how Cilium could fit in your Platform and solve issues on the network layers using a modern and innovative approach, check out the session from <a href="https://kccnceu2026.sched.com/event/2CW5p/an-immersive-and-visual-journey-into-kubernetes-networking-benoit-entzmann-feesh" target="_blank" rel="noopener noreferrer" class="">Benoit Entzmann "An Immersive and Virsual Journey Into Kubernetes Networking"</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#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://kccnceu2026.sched.com/" target="_blank" rel="noopener noreferrer" class="">KubeCon Europe Amsterdam Schedule 2026</a></li>
<li class=""><a href="https://www.youtube.com/playlist?list=PLj6h78yzYM2MXCOWSN9CqqID6OOvF7wxL" target="_blank" rel="noopener noreferrer" class="">Youtube - KubeCon and CloudNativeCon Series</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>I will take with me the chance to meet new people, build connections, and share ideas on various topics. AI was everywhere at the conference and will remain there. Still, we are humans after all!</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Communication Meme&amp;quot;" src="https://blog.grosdouli.dev/assets/images/communication_meme-7797e3d7430379afcaec0c77277883dc.png" width="568" height="434" class="img_ev3q"></p>
<p><a href="https://makeameme.org/" target="_blank" rel="noopener noreferrer" class="">Source</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/kubecon-amsterdam-2026#%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>]]></content:encoded>
            <category>Conference</category>
            <category>Kubernetes</category>
        </item>
    </channel>
</rss>