<?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 Eleni Grosdouli's official 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>Tue, 01 Sep 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[Cilium Gateway API for vCluster Tenant Clusters on RKE2 | Shared Gateway API Resources per Tenant | vCluster]]></title>
            <link>https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources</link>
            <guid>https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources</guid>
            <pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Share Kubernetes resources between the Control plane cluster and the vCluster tenants. In this example, we dive into sharing Gateway API resources between setups.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:
In previous parts of the series, we laid the foundation for creating and using multitenant environments with <a href="https://www.vcluster.com/" target="_blank" rel="noopener noreferrer" class="">vCluster</a> and <a href="https://docs.cilium.io/en/stable/" target="_blank" rel="noopener noreferrer" class="">Cilium</a> for networking, observability, and security. In today's post, we introduce a way of sharing Kubernetes resources and custom resource defintions between the Control Plane cluster and the underlying virtual clusters.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario">Scenario<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#scenario" class="hash-link" aria-label="Direct link to Scenario" title="Direct link to Scenario" translate="no">​</a></h2>
<p>As platform engineering teams, we always want control over what we deploy for our consumers such as cluster types, configuration, etc.
In multitenant setups, this means allowing fundamental resources from the Control Plane cluster to be shared across tenant environments. The goal is to give teams the freedom to use their clusters as they see fit, while still be in full control over the deployments.</p>
<p>In today's demonstration, we will allow teams to share Gateway API resources backed by <code>LoadBalancer</code> services provided by Cilium. We introduce a straightforward way of sharing Gateway API resources between the Control Plane cluster and the underlying tenant environments. Cilium is configured to integrate with Gateway API, the required CRDs are installed only in the Control Plane cluster, and we keep the same versions and cluster names used in the previous posts.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#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.35.6+rke2r1   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-d     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|         Cilium          |     CNI      |     v1.19.4      |</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="introduction-to-gateway-api">Introduction to Gateway API<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#introduction-to-gateway-api" class="hash-link" aria-label="Direct link to Introduction to Gateway API" title="Direct link to Introduction to Gateway API" translate="no">​</a></h2>
<p>While the Ingress API supports basic routing based on path and host rules, it lacks support for advanced routing features. This is where Gateway API enters the discussion.</p>
<blockquote>
<p>Gateway API is an official Kubernetes project focused on L4 and L7 routing in Kubernetes. This project represents the next generation of Kubernetes Ingress, Load Balancing, and Service Mesh APIs.</p>
</blockquote>
<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>On the 24th of March 2026, the <a href="https://github.com/kubernetes/ingress-NGINX" target="_blank" rel="noopener noreferrer" class="">ingress-NGINX</a> project was officially archived. <code>ingress-nginx</code> was an Ingress controller for Kubernetes using NGINX as a reverse proxy and load balancer. Of course, other options are available to serve as Ingress controllers, but a large percent of the community out there worked on adopting Gateway API as the next generation of traffic engineering.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-gateway-api-matters">Why Gateway API Matters?<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#why-gateway-api-matters" class="hash-link" aria-label="Direct link to Why Gateway API Matters?" title="Direct link to Why Gateway API Matters?" translate="no">​</a></h3>
<p>Gateway API does not only overcome the constraints of supporting only <code>HTTP</code> and <code>HTTPS</code> traffic, it provides a more robust, extensible, and role-oriented approach to traffic engineering. The project represents the next generation of Kubernetes Ingress, Load Balancing, and Service Mesh APIs.</p>
<p><a href="https://gateway-api.sigs.k8s.io/docs/introduction/" target="_blank" rel="noopener noreferrer" class="">Source</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="control-plane-cluster---cilium-configuration">Control Plane Cluster - Cilium Configuration<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#control-plane-cluster---cilium-configuration" class="hash-link" aria-label="Direct link to Control Plane Cluster - Cilium Configuration" title="Direct link to Control Plane Cluster - Cilium Configuration" translate="no">​</a></h2>
<p>As a starting point, we will expand the Cilium configuration and add the required Helm values to enable the integration of Cilium with the Gateway API. Cilium is the underlying layer for our networking, observability, and security, powered by eBPF, and since version 1.12.x, Cilium integrates nicely with the Gateway API.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cilium-helm-chart-upgrade">Cilium Helm Chart Upgrade<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#cilium-helm-chart-upgrade" class="hash-link" aria-label="Direct link to Cilium Helm Chart Upgrade" title="Direct link to Cilium Helm Chart Upgrade" translate="no">​</a></h3>
<p>To enable the integration and going through the <a href="https://docs.cilium.io/en/v1.19/network/servicemesh/gateway-api/gateway-api/" target="_blank" rel="noopener noreferrer" class="">official documentation</a>, a few prerequisites are required. Take a look at the updated Helm chart values file.</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 theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">gatewayAPI</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">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">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 for the Gateway API integration</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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>
<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.19.400 --namespace kube-system -f values_control_plane.yaml</span><br></div></code></pre></div></div>
<p>Once the <code>helm upgrade</code> command is complete, deploy the below Gateway API CRDs to the Control Plane 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">$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.1/config/crd/standard/gateway.networking.k8s.io_gatewayclasses.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.1/config/crd/standard/gateway.networking.k8s.io_gateways.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.1/config/crd/standard/gateway.networking.k8s.io_httproutes.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.1/config/crd/standard/gateway.networking.k8s.io_referencegrants.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.1/config/crd/standard/gateway.networking.k8s.io_grpcroutes.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/gateway-api/v1.4.1/config/crd/experimental/gateway.networking.k8s.io_tlsroutes.yaml(Optional)</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#validation" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get crds | grep gateway.networking.k8s.io</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">gatewayclasses.gateway.networking.k8s.io                   2026-07-28T06:52:01Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gateways.gateway.networking.k8s.io                         2026-07-28T06:52:02Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">grpcroutes.gateway.networking.k8s.io                       2026-07-28T06:52:03Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">httproutes.gateway.networking.k8s.io                       2026-07-28T06:52:05Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">referencegrants.gateway.networking.k8s.io                  2026-07-28T06:52:06Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tlsroutes.gateway.networking.k8s.io                        2026-07-28T06:52:07Z</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 gatewayclass</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME     CONTROLLER                     ACCEPTED   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cilium   io.cilium/gateway-controller   True       47h</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>Especially in older version of Cilium, there were instances the <code>GatewayClass</code> was not available in the cluster or in an Unknown state. Take a look <a href="https://github.com/cilium/cilium/issues/42956#issuecomment-3708750583" target="_blank" rel="noopener noreferrer" class="">here</a> for more details. Feel free to explore any related GitHub issues to pin point to a specific behaviour observed.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ciliumloadbalancerippool">CiliumLoadBalancerIPPool<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#ciliumloadbalancerippool" class="hash-link" aria-label="Direct link to CiliumLoadBalancerIPPool" title="Direct link to CiliumLoadBalancerIPPool" translate="no">​</a></h3>
<p>We already described in a dedicated <a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2">vCluster multi-pool setup</a> post how to enable the Cilium <code>Multi-Pool</code> mode and <code>CiliumLoadBalancerIPPool</code> functionality leveraging L2 Announcements. For more details on the topic, follow the sections <a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#configuration">Cilium configuration</a> and <a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#cilium-crds">Cilium CRDs</a>.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The <code>CiliumL2AnnouncementPolicy</code> resource should be available at the cluster if you followed <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2#create-ciliuml2announcementpolicy">part 2</a>.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-helm-chart-update">vCluster Helm Chart Update<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#vcluster-helm-chart-update" class="hash-link" aria-label="Direct link to vCluster Helm Chart Update" title="Direct link to vCluster Helm Chart Update" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation-and-discovery">Documentation and Discovery<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#documentation-and-discovery" class="hash-link" aria-label="Direct link to Documentation and Discovery" title="Direct link to Documentation and Discovery" translate="no">​</a></h3>
<p>Once we ensured Cilium is fully functional with Gateway API, it is time to take a look at the vCluster side and check how to share resources between the Control Plane and the multitenant cluster. According to the <a href="https://www.vcluster.com/docs/vcluster/configure/vcluster-yaml/sync/" target="_blank" rel="noopener noreferrer" class="">official documentation</a></p>
<blockquote>
<p>syncing is the process by which vCluster replicates resources between the tenant cluster and the Control Plane Cluster. By default, vCluster only syncs low-level resources, such as pods, secrets, configmaps, or services, but a user can enable many other resources for all use cases.</p>
</blockquote>
<p>This is promising, but not exactly what we look for. Reading more of the documentation, I found an <a href="https://www.vcluster.com/docs/vcluster/configure/vcluster-yaml/sync/to-host/advanced/custom-resources#configure-kubernetes-gateway-api-sync" target="_blank" rel="noopener noreferrer" class="">example</a> sharing a <code>Gateway</code> resource between the Control Plane cluster and the multitenant setups. This could have been something we could use, however, my main goal is to allow teams to use their own <code>Gateway</code> and Gateway related resources.</p>
<p>To conclude the discovery, I did not find a way to use the free version of vCluster to cover my use case. However, as I have a limited availability Enterprise license, I managed to achieve my goal. We will start with the vCluster Helm chart values, outline the additions and why they are required, while we demo a simple NGINX application at the underlying tenant cluster to prove our point.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-helm-chart-values">vCluster Helm Chart Values<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#vcluster-helm-chart-values" class="hash-link" aria-label="Direct link to vCluster Helm Chart Values" title="Direct link to vCluster Helm Chart Values" translate="no">​</a></h3>
<p>We will update the existing Helm chart values used in parts <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">1</a> and <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">2</a>. The section of interest is under the <code>sync.toHost.customResources</code> field. First, we will specify the CRDs we want to sync with the underlying tenant clusters and then add specific <a href="https://www.vcluster.com/docs/vcluster/configure/vcluster-yaml/sync/to-host/advanced/custom-resources#patches" target="_blank" rel="noopener noreferrer" class="">Patches</a> to make the setup work as expected.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="synchronise-crds">Synchronise CRDs<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#synchronise-crds" class="hash-link" aria-label="Direct link to Synchronise CRDs" title="Direct link to Synchronise CRDs" 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">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 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">customResources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># Outline the CRDs dedicated to Gateway API</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">gatewayclasses.gateway.networking.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">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">gateways.gateway.networking.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">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">httproutes.gateway.networking.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">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">grpcroutes.gateway.networking.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">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">referencegrants.gateway.networking.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">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">tlsroutes.gateway.networking.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">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>
<p>When syncing resources from the tenant clusters to the Control Plane cluster, vCluster needs to rewrite references so they point to the correct resources in the Control Plane cluster. This can only happen using the Patches mechanism. Without that, we do see the below information from the Control Plane node when we create <code>HTTPRoute</code> resources. Effectively, the mapping between the tenant and the Control Plane node do not match.</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 httproute -n vcluster-team-d -o yaml # Query the output on the Control Plane node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  parentRefs:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - name: team-d-gateway        # The name does not exist on the Control plane node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      namespace: default          # The default namespaces does not reflect the namespace on the Control plane node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  rules:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - backendRefs:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        - name: nginx             # The backendRefs is defined as nginx-x-default-x-vcluster-team-d in the Control plane node</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          port: 80</span><br></div></code></pre></div></div>
<p>To overcome the obstacle mentioned above, a patch needs to be added under <code>sync.toHost.customResources.httproutes.gateway.networking.k8s.io</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">httproutes.gateway.networking.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">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">patches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> spec.parentRefs</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">.name </span><span class="token comment" style="color:#999988;font-style:italic"># Automatically rewrite Gateway references to synced names</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">reference</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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"> gateway.networking.k8s.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Gateway</span></span><br></div><div class="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">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> spec.rules</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">.backendRefs</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">.name </span><span class="token comment" style="color:#999988;font-style:italic"># Automatically rewrite backend service references</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">reference</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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></code></pre></div></div>
<p>Without these patches, unfortunately, the <code>HTTPRoute</code> resources would reference non-existent resources in the Control Plane cluster and fail to provide a working example.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="update-vcluster-helm-deployment">Update vCluster Helm Deployment<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#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">$ 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">$ helm upgrade --install vcluster-team-d 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-d \</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_d_syncer.yaml</span><br></div></code></pre></div></div>
<p>Once the pods in the <code>vcluster-team-d</code> namespace of the Control Plane cluster are in a <strong>READY</strong> state, proceed with the NGINX application deployment.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>If the pods in the <code>vcluster-team-d</code> namespace are in an <strong>Error</strong> state, check the logs of the pod using the command <code>kubectl logs &lt;pod-name&gt; -n vcluster-team-d</code>. If there is a line indicating a license issue, ensure the tenant cluster is registered with the vCluster Platform, and an <a href="https://www.vcluster.com/pricing" target="_blank" rel="noopener noreferrer" class="">Enterprise license</a> is available.</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation-1">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#validation-1" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h4>
<p>After the successful deployment, the Gateway API CRDs are available in the underlying tenant 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=vcluster-team-d.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 crds | grep gateway.networking.k8s.io</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gatewayclasses.gateway.networking.k8s.io    2026-07-28T07:16:49Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">gateways.gateway.networking.k8s.io          2026-07-28T07:16:51Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">grpcroutes.gateway.networking.k8s.io        2026-07-28T07:16:52Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">httproutes.gateway.networking.k8s.io        2026-07-28T07:16:53Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">referencegrants.gateway.networking.k8s.io   2026-07-28T07:16:55Z</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tlsroutes.gateway.networking.k8s.io         2026-07-28T07:16:56Z</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deploy-an-nginx-application---multitenant-cluster">Deploy an NGINX Application - Multitenant Cluster<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#deploy-an-nginx-application---multitenant-cluster" class="hash-link" aria-label="Direct link to Deploy an NGINX Application - Multitenant Cluster" title="Direct link to Deploy an NGINX Application - Multitenant Cluster" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="gateway-resource">Gateway Resource<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#gateway-resource" class="hash-link" aria-label="Direct link to Gateway Resource" title="Direct link to Gateway Resource" translate="no">​</a></h4>
<p>Let's start by creating a <code>Gateway</code> resource for an NGINX application deployment.</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"> gateway.networking.k8s.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Gateway</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">d</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span></span><br></div><div class="token-line codeLine_lJS_" style="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">gatewayClassName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">listeners</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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"> http</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTP</span></span><br></div><div class="token-line codeLine_lJS_" style="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">allowedRoutes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">from</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> All</span></span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-d.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 apply -f team-d-gateway.yaml</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=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 gateway -n vcluster-team-d</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME             CLASS    ADDRESS       PROGRAMMED   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">v48m682h72rpai   cilium   10.10.20.24   True         57s</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 svc -n vcluster-team-d | grep -i cilium-gateway</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">cilium-gateway-v48m682h72rpai              LoadBalancer   10.43.111.85    10.10.20.24   80:32583/TCP             67s</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="httproute-resource">HTTPRoute Resource<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#httproute-resource" class="hash-link" aria-label="Direct link to HTTPRoute Resource" title="Direct link to HTTPRoute Resource" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> gateway.networking.k8s.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HTTPRoute</span></span><br></div><div class="token-line codeLine_lJS_" style="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">route</span></span><br></div><div class="token-line codeLine_lJS_" style="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">parentRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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"> team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">d</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">gateway</span></span><br></div><div class="token-line codeLine_lJS_" style="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">matches</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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"> PathPrefix</span></span><br></div><div class="token-line codeLine_lJS_" style="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><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">backendRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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">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><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="nginx-resource">NGINX Resource<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#nginx-resource" class="hash-link" aria-label="Direct link to NGINX Resource" title="Direct link to NGINX Resource" translate="no">​</a></h4>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 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><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">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">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">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">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><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">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><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="apply-resources">Apply Resources<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#apply-resources" class="hash-link" aria-label="Direct link to Apply Resources" title="Direct link to Apply Resources" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-d.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 apply -f team-d-httproute.yaml,nginx-deployment.yaml</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">$ kubectl get pods,svc,httproute</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-59c4c87bc6-b5c56   1/1     Running   0          20s</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/cilium-gateway-team-d-gateway   LoadBalancer   10.43.111.85   10.10.20.24   80:32583/TCP   3m11s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/kubernetes                      ClusterIP      10.43.213.98   &lt;none&gt;        443/TCP        96m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/nginx                           ClusterIP      10.43.42.143   &lt;none&gt;        80/TCP         20s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                              HOSTNAMES   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">httproute.gateway.networking.k8s.io/nginx-route               20s</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation-2">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#validation-2" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h4>
<p>The application should be accessible from within the <strong>vcluster-team-d</strong> cluster and from any location within the defined subnet/network segment. We can simply perform a cURL test.</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">curl http://${GATEWAY_IP}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-issues-and-troubleshooting-steps">Common Issues and Troubleshooting Steps<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#common-issues-and-troubleshooting-steps" class="hash-link" aria-label="Direct link to Common Issues and Troubleshooting Steps" title="Direct link to Common Issues and Troubleshooting Steps" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cilium-gateway-class">Cilium Gateway Class<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#cilium-gateway-class" class="hash-link" aria-label="Direct link to Cilium Gateway Class" title="Direct link to Cilium Gateway Class" translate="no">​</a></h3>
<p>In some Cilium version between <strong>1.17</strong> and <strong>1.18</strong>, when the Gateway API integration is enabled, the <code>GatewayClass</code> resource is not automatically created. To force the creation of the resource, update the Cilium Helm chart values and include the highlighted lines below.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv 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">gatewayAPI</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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 theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">gatewayClass</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">create</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"true"</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="gateway-stuck-in-pending-state">Gateway Stuck in Pending State<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#gateway-stuck-in-pending-state" class="hash-link" aria-label="Direct link to Gateway Stuck in Pending State" title="Direct link to Gateway Stuck in Pending State" translate="no">​</a></h3>
<p>If the synchronisation of resources between the tenant and the Control Plane cluster is not done correctly, the <code>Gateway</code> resource on the tenant cluster will never get an IP address. Some common issues are around <strong>IP pool exhaustion</strong>, <strong>service selection does not match the tenant namespace</strong>, or some underlying issue with the Cilium Operator. Follow the commands described below to troubleshoot the issue further.</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 describe gateway team-d-gateway</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get ciliumloadbalancerippool vcluster-team-d-pool -o yaml</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="httproute-not-working">HTTPRoute Not Working<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#httproute-not-working" class="hash-link" aria-label="Direct link to HTTPRoute Not Working" title="Direct link to HTTPRoute Not Working" translate="no">​</a></h3>
<p>The <code>HTTPRoute</code> created does not route the traffic correctly. Some common issues relate to the <strong>backend service</strong> not being available or the <strong>port mismatch</strong> between the <code>HTTPRoute</code> and the service.</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 describe httproute nginx-route</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get gateway team-d-gateway -o jsonpath='{.status.listeners}'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get svc nginx</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get httproute nginx-route -o yaml</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advantages-of-setup">Advantages of Setup<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#advantages-of-setup" class="hash-link" aria-label="Direct link to Advantages of Setup" title="Direct link to Advantages of Setup" translate="no">​</a></h2>
<p>While we could allow teams to deploy their own CRDs on a tenant cluster, we give them the ability to utilise resources available in the Control Plane cluster without going through the process of installing CRDs or other resources required for their work. This matters as developers and teams can have their own <code>Gateway</code> and relevant resources without worrying about other tenants or conflicts!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.vcluster.com/docs/vcluster/configure/vcluster-yaml/sync/to-host/advanced/custom-resources" target="_blank" rel="noopener noreferrer" class="">vCluster Custom Resources Documentation</a></li>
<li class=""><a href="https://docs.cilium.io/en/latest/network/servicemesh/gateway-api/gateway-api/" target="_blank" rel="noopener noreferrer" class="">Cilium Gateway API Documentation</a></li>
<li class=""><a href="https://docs.cilium.io/en/stable/network/lb-ipam/" target="_blank" rel="noopener noreferrer" class="">Cilium IPAM</a></li>
<li class=""><a href="https://gateway-api.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class="">Gateway API Specification</a></li>
<li class=""><a href="https://kubernetes.io/docs/concepts/services-networking/gateway/" target="_blank" rel="noopener noreferrer" class="">Kubernetes Gateway API Reference</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In today's post, we explored how to share Gateway API resources between the Control Plane cluster and underlying tenant clusters using vCluster's
sync mechanism and Cilium. This approach gives platform teams full control over shared infrastructure while allowing tenant teams the flexibility to manage their own Gateway and HTTPRoute resources. In the next post, we will explore how to setup a Cilium multi-tenant pool for the clusters.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources#%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-cilium-gateway-api-shared-resources#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">Part 1</a></td><td style="text-align:left">vCluster Recent Updates</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">Part 2</a></td><td style="text-align:left">Introduction to Cilium L2 Announcements and vCluster Platform</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3">Part 3</a></td><td style="text-align:left">vCluster Networking and Cilium Under the Hood</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2">Part 4 </a></td><td style="text-align:left">vCluster and Cilium Multi-Pool Mode</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources">Part 5</a></td><td style="text-align:left">vCluster and Cilium Gateway API Shared Resources</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>vCluster</category>
            <category>Cilium</category>
            <category>Gateway API</category>
        </item>
        <item>
            <title><![CDATA[Cilium Multi-Pool Mode for vCluster Tenant Clusters on RKE2 | Dedicated PodCIDRs and LoadBalancer IPs per Tenant | vCluster]]></title>
            <link>https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2</link>
            <guid>https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2</guid>
            <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[This is a technical guide on enabling vCluster development environments with the Cilium Multi-Pool. The underlying RKE2 cluster with serve different CIDRs for individual multitenant environments.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>When I started the vCluster series, I did not expect to keep writing and have already releases a few parts. Having said that, I strongly believe that combining an RKE2 Kubernetes cluster with vCluster and Cilium Multi-Pool IPAM allows us to create powerful multitenant setups for teams building development environments following a GitOps approach. In today's part, we extend the setup to include individual PodCIDRs and LoadBalancer IP ranges for each tenant. This is made possible by Cilium's Multi-Pool IPAM mode, which assigns pod IPs from different pools on a per-namespace basis. We also cover the RKE2 1.35.x cluster bootstrap, touching the cgroup v2 migration required by newer Kubelet versions.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vCluster with Cilium multipool diagram on RKE2&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_cilium_multipool-c657d1a7dea1d496f0231e795843c4e2.png" width="4575" height="1400" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>While the first parts of series <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">1</a> and <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">2</a> covered the foundation and, with all honesty, a fast and easy way to create multitenant environments, this part of the series looks into extending this to enable teams to use different PodCIDRs for individual environments. This is made possible with the power of Cilium.</p>
<p><a href="https://docs.cilium.io/en/stable/network/concepts/ipam/index.html" target="_blank" rel="noopener noreferrer" class="">Cilium's IPAM</a> works in three different modes: Kubernetes Host Scope, Cluster Scope, and Multi-Pool Scope. The first one is when Kubernetes assigns the PodCIDRs to each node. In the second mode, Cilium manages the PodCIDR allocation with the help of the Cilium Operator. The third and more flexible mode allows pods to receive an IP address from multiple IP pools, either from an annotated namespace or an annotation appended to an application manifest. Keep in mind, the default Cilium mode is set to Cluster Scope. For more information about the Cilium Helm chart values, take a look at the <a href="https://github.com/cilium/cilium/blob/main/install/kubernetes/cilium/values.yaml#L2317" target="_blank" rel="noopener noreferrer" class="">Cilium official GitHub repository</a>.</p>
<p>What are the advantages of enabling Cilium Multi-Pool IPAM for multitenant environments? It enables us to allocate IP addresses to pods on the same node, but from different <code>CiliumPodIPPool</code> resources. This is ideal for teams who want to have granular control over per-namespace IP allocation while having the flexibility to add new CIDRs dynamically when required. Combined with <code>CiliumLoadBalancerIPPool</code> and L2 announcements or BGP, we can also scope the LoadBalancer IPs per tenant, ensuring no resource exhaustion between teams. This is a strong use case when teams provide services to different tenants and want to control the traffic exiting the cluster. They now have an easy way to identify the tenant behind the environment by source IP alone.</p>
<p>If you are new to RKE2 and Cilium, the <a class="" href="https://blog.grosdouli.dev/blog/cilium-cluster-mesh-rke2">Cilium Cluster Mesh on RKE2</a> post covers the foundational setup. For advanced Cilium networking on RKE2, take a look at the <a class="" href="https://blog.grosdouli.dev/blog/rke2-dual-stack-cilium-proxmox">Dual-Stack RKE2 with Cilium on Proxmox</a> series.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#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.35.6+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">|         Cilium          |     CNI      |     v1.19.4      |</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-cilium-multi-pool-rke2#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>Go through parts 1,2 and 3 of the series to gain a better understanding of the concept and what we aim to achieve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rke2-initial-cluster-setup">RKE2 Initial Cluster Setup<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#rke2-initial-cluster-setup" class="hash-link" aria-label="Direct link to RKE2 Initial Cluster Setup" title="Direct link to RKE2 Initial Cluster Setup" translate="no">​</a></h2>
<p>Before we dive into the Cilium configuration, it is worth taking a look at the control plane cluster configuration first. We will use the recommended way to build a cluster. This is usually via an Infrastructure as Code (IaC) approach, or, to keep things simple and easy, the automated installer. As the demo focuses on the underlying Cilium configuration, I decided to use the automated installer configuration for simplicity purposes. In case you want to explore what an IaC example looks like, take a look at the <a class="" href="https://blog.grosdouli.dev/blog/opentofu-rke2-cilium-azure">RKE2 on Azure blog</a>.</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>As we moved to <strong>RKE2 1.35.x</strong>, keep in mind that <a href="https://kubernetes.io/docs/concepts/architecture/cgroups/" target="_blank" rel="noopener noreferrer" class="">Kubelet works only with <code>cgroup v2</code></a>. If your underlying machine uses <code>cgroup v1</code>, it is time to upgrade and migrate to v2.</p><p>Common errors during cluster bootstrap.</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">$ journalctl -xu rke2-server.service -f</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">level=error msg="Kubelet exited: exit status 1"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">msg="Failed to test etcd connection: failed to get etcd status: rpc error: code = Unavailable desc = connection error: desc = \"transport: Error while dialing: dial tcp 127.0.0.1:2379: connect: connection refused\""</span><br></div></code></pre></div></div><p>If you see messages like the above, the next steps are to check the kubelet logs.</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">$ tail /var/lib/rancher/rke2/agent/logs/kubelet.log</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">E0731 07:50:00.631256    1983 run.go:72] "command failed" err="failed to validate kubelet configuration, error: kubelet is configured to not run on a host using cgroup v1. cgroup v1 support is unsupported and will be removed in a future release, path: &amp;TypeMeta{Kind:,APIVersion:,}"</span><br></div></code></pre></div></div><p>To migrate to <code>cgroup v2</code>, check out the official Kubernetes documentation mentioned above.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="configuration">Configuration<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#configuration" class="hash-link" aria-label="Direct link to Configuration" title="Direct link to Configuration" translate="no">​</a></h3>
<p>Once any issues with the <code>cgroup</code> version are resolved, it is time to set up the RKE2 cluster to support the Cilium Multi-Pool scope. Before going any further, ensure you have an understanding of the <a href="https://docs.rke2.io/reference/server_config" target="_blank" rel="noopener noreferrer" class="">RKE2 official documentation server and agent settings</a>.</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">write-kubeconfig-mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0644</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">tls-san</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> &lt;YOUR TLS SAN</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> &lt;YOUR token to connect nodes to the cluster</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">cni</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">node-ip</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR NODE IP Address"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">advertise-address</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"YOUR NODE IP Address"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">disable-kube-proxy</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-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The following arguments can be excluded from the RKE2 configuration as they get default values by the automated installer.</p><ul>
<li class=""><code>cluster-cidr: "10.42.0.0/16"</code></li>
<li class=""><code>service-cidr: "10.43.0.0/16"</code></li>
</ul></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm.cattle.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HelmChartConfig</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> rke2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cilium</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">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">valuesContent</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">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">tag</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1.19.4 </span><span class="token comment" style="color:#999988;font-style:italic"># The Cilium Version supported by [RKE2 v1.35.6+rke2r1](https://docs.rke2.io/release-notes/v1.35.X)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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"># We want to enable Cilium with kube-proxy replacement</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">k8sServiceHost</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 127.0.0.1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">k8sServicePort</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6443</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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><br></div><div class="token-line codeLine_lJS_" style="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">bpf</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">masquerade</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"># This is required by the Multi-Pool scope setup for Cilium.</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">ipam</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">mode</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"multi-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">operator</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">autoCreateCiliumPodIPPools</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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 class="token comment" style="color:#999988;font-style:italic"># A default pool will be created by Cilium at start-up and assign prefixes to Nodes based on the `ipam.operator.autoCreateCiliumPodIPPools.default` value.</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">ipv4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">cidrs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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"> 10.10.0.0/16</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">maskSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">27</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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 class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><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">qps</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">50</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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">200</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">hubble</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">relay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">ui</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#validation" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h3>
<p>The validation needs to take place on the RKE2 side and the Cilium side. For RKE2, ensure the <code>journal -xu rke2-server.service</code> logs are clean, and the <code>systemctl status rke2-server</code> service is set to <code>active (running)</code>. The next step is to validate the state of the cluster, Cilium, and assigned CIDRs.</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 nodes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME            STATUS   ROLES                AGE     VERSION</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mt08-master     Ready    control-plane,etcd   7d22h   v1.35.6+rke2r1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mt08-worker01   Ready    &lt;none&gt;               7d6h    v1.35.6+rke2r1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mt08-worker02   Ready    &lt;none&gt;               7d5h    v1.35.6+rke2r1</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 -o wide -l k8s-app=cilium</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">cilium-m9sp5   1/1     Running   0              7d6h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cilium-wwcbn   1/1     Running   0              7d22h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">cilium-xm4qt   1/1     Running   0              7d5h</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 ciliumpodippools.cilium.io default -o yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">apiVersion: cilium.io/v2alpha1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">kind: CiliumPodIPPool</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">metadata:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  creationTimestamp: "2026-07-31T09:03:55Z"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  generation: 1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name: default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  resourceVersion: "841"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  uid: 8987b28f-d362-4fa7-8b0d-4dd00f31dd7a</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">spec:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ipv4:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    cidrs:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    - 10.10.0.0/16</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    maskSize: 27</span><br></div></code></pre></div></div>
<p>As expected, Cilium used the <code>default</code> pool set during the configuration. Now, we can continue with the configuration of the individual pools and LoadBalancer pools per namespace.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cilium-crds">Cilium CRDs<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#cilium-crds" class="hash-link" aria-label="Direct link to Cilium CRDs" title="Direct link to Cilium CRDs" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ciliumloadbalancerippool">CiliumLoadBalancerIPPool<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#ciliumloadbalancerippool" class="hash-link" aria-label="Direct link to CiliumLoadBalancerIPPool" title="Direct link to CiliumLoadBalancerIPPool" translate="no">​</a></h3>
<p>As mentioned at the beginning of the post, we would like to assign each of the tenants its own unique <code>CiliumLoadBalancerIPPool</code> pool. For the <code>vcluster-team-a</code> tenant, we assign 11 IP addresses, while for the <code>vcluster-team-b</code> only 5. The flexibility of the setup is that we could extend the pool of LoadBalancer IPs based on the tenant's needs as we follow a declarative approach.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 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">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rke2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pool</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">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"> 10.10.20.80</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> 10.10.20.90</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">serviceSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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">io.kubernetes.service.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="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 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">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> rke2</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pool</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">b</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> 10.10.20.91</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> 10.10.20.95</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">serviceSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="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">io.kubernetes.service.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">b</span></span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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 apply -f ciliumloadbalancerippool_team_a.yaml,ciliumloadbalancerippool_team_b.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get CiliumLoadBalancerIPPool</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                          DISABLED   CONFLICTING   IPS AVAILABLE   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rke2-pool-vcluster-team-a     false      false         11              3d3h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">rke2-pool-vcluster-team-b     false      false         5               2d2h</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ciliumpodippool">CiliumPodIPPool<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#ciliumpodippool" class="hash-link" aria-label="Direct link to CiliumPodIPPool" title="Direct link to CiliumPodIPPool" translate="no">​</a></h3>
<p>Create dedicated Pools for the PodCIDRs within each tenant deployment.</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"> CiliumPodIPPool</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ipv4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cidrs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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"> 10.20.0.0/20</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">maskSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">24</span><span class="token plain"></span></span><br></div><div class="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"> 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"> CiliumPodIPPool</span></span><br></div><div class="token-line codeLine_lJS_" style="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"> team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">b</span></span><br></div><div class="token-line codeLine_lJS_" style="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">ipv4</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cidrs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="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"> 10.20.16.0/20</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">maskSize</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">24</span></span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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 apply -f ciliumpodippool_team_a.yaml,ciliumpodippool_team_b.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get CiliumPodIPPool</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME       AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">default    3d20h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">team-a     3d3h</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">team-b     3d3h</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 pools size should be customized based on your own needs and network design. This is just an example how the <code>CiliumPodIPPool</code> look like.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-did-we-achieve-with-the-setup">What did we achieve with the setup?<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#what-did-we-achieve-with-the-setup" class="hash-link" aria-label="Direct link to What did we achieve with the setup?" title="Direct link to What did we achieve with the setup?" translate="no">​</a></h3>
<p>The main goal was for us to have granural control of the CIDRs assigned to each tenant and control over the LoadBalancer IP addresses advertised by L2Announcement. For more details, take a look at the <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">Part 2</a> of the series. Now, we cannot only control the IPs assigned, but also extend the setup to meet future needs of the individual tenants.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-creation">vCluster Creation<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#vcluster-creation" class="hash-link" aria-label="Direct link to vCluster Creation" title="Direct link to vCluster Creation" translate="no">​</a></h2>
<p>We will not go through the vCluster configuration as this is covered extensively by parts <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">1</a> and <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">2</a> of the series. We will install the individual tenant environments and ensure they get the CIDRs based on our specification on the control plane 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">helm upgrade --install vcluster-tean-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 -f vcluster_team_a_lb.yaml</span><br></div></code></pre></div></div>
<p>Once the Helm chart is applied to the control plane node, we can describe the pod and extract the logs of the vCluster pod in the <code>vcluster-team-a</code> namespace. Keep in mind the pod will go through different stages till it is running. The pod will follow the classic pod creation workflow: kubelet -&gt; Container Runtime -&gt; CNI Plugin Invoke -&gt; Pod creation.</p>
<p>A snippet of the vCluster Pod might look like the below.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">Events</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">  Type     Reason                  Age                From               Message</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 punctuation" style="color:#393A34">-</span><span class="token plain">     </span><span class="token punctuation" style="color:#393A34">---</span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain">                  </span><span class="token punctuation" style="color:#393A34">---</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">---</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">               </span><span class="token punctuation" style="color:#393A34">---</span><span class="token punctuation" style="color:#393A34">---</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">  Normal   Scheduled               112s               default</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">scheduler  Successfully assigned 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/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 class="token punctuation" style="color:#393A34">-</span><span class="token plain">0 to mt08</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">worker01</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">Warning  FailedCreatePodSandBox  112s               kubelet            Failed to create pod sandbox</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">rpc error</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">code = Unknown desc = failed to setup network for sandbox "7177be8a6ed3f41734d8618b3c3124dc4f7a3800da4d97b3addc2664ecc92dda"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">plugin type="cilium-cni" failed (add)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">unable to allocate IP via local cilium agent</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">POST /ipam</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">502</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> postIpamFailure "unable to allocate from pool \"team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token key atrule" style="color:#00a4db">a\" (family ipv4)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> pool not (yet) available"</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Normal   Pulled                  100s               kubelet            spec.initContainers</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">kubernetes</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Container image "ghcr.io/loft</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sh/kubernetes</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">v1.36.0" already present on machine and can be accessed by the pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Normal   Created                 100s               kubelet            spec.initContainers</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">kubernetes</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Container created</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Normal   Started                 99s                kubelet            spec.initContainers</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">kubernetes</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Container started</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Normal   Pulled                  96s                kubelet            spec.containers</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">syncer</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Container image "ghcr.io/loft</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">sh/vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">pro</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">0.36.0" already present on machine and can be accessed by the pod</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Normal   Created                 96s                kubelet            spec.containers</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">syncer</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Container created</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation-1">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#validation-1" 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=/path/to/tenant/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 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">mt08-worker01   Ready    &lt;none&gt;   2d3h   v1.36.0   10.43.114.26   &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">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-97ddf668d-7hdgr   1/1     Running   0          2d3h   10.20.18.184   mt08-worker01   &lt;none&gt;           &lt;none&gt;</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 IP address <code>10.43.114.26</code> is the <code>ClusterIP</code> of the <code>service/vcluster-team-a-node-mt08-worker01</code> on the control plane node.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="advantages-of-setup">Advantages of Setup<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#advantages-of-setup" class="hash-link" aria-label="Direct link to Advantages of Setup" title="Direct link to Advantages of Setup" translate="no">​</a></h2>
<ul>
<li class=""><strong>Predictable Egress traffic</strong>: Each tenant uses a distinct CIDR. Firewalls and monitoring tools can identify the source tenant by IP</li>
<li class=""><strong>Dedicated LoadBalancer pool</strong>: With the <code>CiliumLoadBalancerIPPool</code> scoped per namespace, one tenant cannot exhaust the IP pool of another. Each team gets its own range, and we can extend it declaratively when required</li>
<li class=""><strong>Dynamic Tenant Onboarding</strong>: Adding a new tenant means creating a new <code>CiliumPodIPPool</code>, a new <code>CiliumLoadBalancerIPPool</code>, and a vCluster Helm release.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>The proposed setup allows us to work on the next topic, which is Cilium and Gateway API. We will demonstrate how to share Gateway API resources between the control plane cluster and the underlying tenants, while in the final part of the series, we will advance the setup to include Grafana authentication using Keycloack OIDC and Cilium Gateway API. Stay tuned.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#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://isovalent.com/books/cilium-up-and-running/" target="_blank" rel="noopener noreferrer" class="">Cilium Up &amp; Running</a></li>
<li class=""><a href="https://docs.cilium.io/en/latest/network/kubernetes/ipam-multi-pool/" target="_blank" rel="noopener noreferrer" class="">Cilium Multi-Pool IPAM</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2#%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-cilium-multi-pool-rke2#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">Part 1</a></td><td style="text-align:left">vCluster Recent Updates</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">Part 2</a></td><td style="text-align:left">Introduction to Cilium L2 Announcements and vCluster Platform</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3">Part 3</a></td><td style="text-align:left">vCluster Networking and Cilium Under the Hood</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2">Part 4 </a></td><td style="text-align:left">vCluster and Cilium Multi-Pool Mode</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources">Part 5</a></td><td style="text-align:left">vCluster and Cilium Gateway API Shared Resources</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>vCluster</category>
            <category>Cilium</category>
            <category>RKE2</category>
        </item>
        <item>
            <title><![CDATA[Automate Flux HelmReleases at Scale | Label-Driven Multi-Cluster Deployment | Sveltos]]></title>
            <link>https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo</link>
            <guid>https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo</guid>
            <pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Part three walks readers through an end-to-end hub-and-spoke demo using Flux and Sveltos Event Framework for automated workload deployment across a cluster fleet.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>In <a class="" href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation">part 2</a>, we introduced the concept of using the Sveltos Event Framework and templating capabilities to dynamically instantiate a Flux HelmRelease based on cluster labels. This blog brings to life the concept of automated Flux HelmReleases using a hub-and-spoke case scenario. We will run a local Kubernetes fleet using <a href="https://kind.sigs.k8s.io/" target="_blank" rel="noopener noreferrer" class="">KinD</a>, bootstrap Flux, and watch Sveltos automatically generate and deploy Flux HelmReleases based on labels.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos and Flux&amp;quot;" src="https://blog.grosdouli.dev/assets/images/fluxcd_and_sveltos-fe9a3f2f44383204458f5b7013a97c02.jpg" width="6830" height="2342" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation">Motivation<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#motivation" class="hash-link" aria-label="Direct link to Motivation" title="Direct link to Motivation" translate="no">​</a></h2>
<p>Platform teams already have a working Flux setup configured to their specifications and needs. Flux is used to deliver applications, manage infrastructure, and, most importantly, the teams know how to operate it. The challenge comes when adding, extending, and scaling workflows without rewriting everything or introducing yet another layer of complexity that makes operations harder.</p>
<p>The demo setup is based on the <a href="https://github.com/fluxcd/flux2-hub-spoke-example" target="_blank" rel="noopener noreferrer" class="">official Flux Hub and Spoke example repository</a>. It aims to show teams how to integrate <a href="https://github.com/projectsveltos/addon-controller" target="_blank" rel="noopener noreferrer" class="">Sveltos</a> into an existing Flux setup in a clean, non-disruptive way. We add Sveltos on top, and immediately we profit from label-driven automation, dynamic templating, and scalability that expands from 2 clusters to 50, 100, 10000 while keeping the repository size minimal.</p>
<p>The demo highlights two distinct events;</p>
<ol>
<li class="">The cluster bootstrap approach, where Sveltos detects the label <code>type: spoke</code> on the managed clusters, Sveltos generates the Flux Kustomizations dynamically, and then Flux reconciles to the spoke clusters</li>
<li class="">The application deployment, where Sveltos detects the label <code>cert-manager: required|kyverno: required</code>, Sveltos generates a HelmRelease dynamically, and then the Flux helm-controller deploys to the specified spoke clusters</li>
</ol>
<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 today's blog, the terms hub or management and spoke or managed clusters are used interchangeably.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|          Deployment           |       Version       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|           Sveltos             |       v1.12.0       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|          Flux2 Helm           |       v2.18.3       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|      Flux Operator Helm       |       v0.40.0       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-resources">GitHub Resources<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#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/flux2-sveltos-hub-spoke-blog-demo.git" 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/flux-helmrelease-automation-sveltos-demo#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ol>
<li class=""><a href="https://docs.docker.com/engine/install/binaries/" target="_blank" rel="noopener noreferrer" class="">Docker</a> and <a href="https://kind.sigs.k8s.io/docs/user/quick-start/" target="_blank" rel="noopener noreferrer" class="">KinD</a> installed</li>
<li class=""><a href="https://fluxcd.io/flux/installation/" target="_blank" rel="noopener noreferrer" class="">Flux Command Line</a> for the bootstrap process</li>
<li class=""><a href="https://www.gnu.org/software/make/" target="_blank" rel="noopener noreferrer" class="">make utility</a> installed</li>
<li class="">Familiarity with Kubernetes manifest files</li>
<li class="">Familiarity with Flux and Sveltos</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flux-hub-and-spoke-original-repository-structure">Flux Hub and Spoke Original Repository Structure<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#flux-hub-and-spoke-original-repository-structure" class="hash-link" aria-label="Direct link to Flux Hub and Spoke Original Repository Structure" title="Direct link to Flux Hub and Spoke Original Repository Structure" translate="no">​</a></h2>
<p>Before we start talking about potential changes to the <a href="https://github.com/fluxcd/flux2-hub-spoke-example" target="_blank" rel="noopener noreferrer" class="">official Flux Hub and Spoke repository</a>, let's take a look at the project structure and the logic behind it and its purpose.</p>
<p>Flux runs only on the hub cluster and plays the role of the "brain" around operations. Once Flux is deployed, the Flux controllers are responsible for reconciling workloads to different spoke clusters using their kubeconfig secrets. Everything related to clusters and their configuration is stored under the <code>hub/</code> directory as a static YAML file.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="repository-outline">Repository Outline<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#repository-outline" class="hash-link" aria-label="Direct link to Repository Outline" title="Direct link to Repository Outline" translate="no">​</a></h3>
<p>Looking at the current project outline, it uses a static, explicit approach where each cluster's configuration is defined in the repository.</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">flux2-hub-spoke-example/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── hub/                          # Hub cluster configuration</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── flux-system/              # Flux bootstrap manifests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── staging.yaml              # Static Kustomizations for staging cluster</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── production.yaml           # Static Kustomizations for production cluster</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">├── clusters/                     # Per-cluster Kustomize overlays</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── staging/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── tenants/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── infra-controllers/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── infra-configs/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── apps/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── production/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── tenants/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── infra-controllers/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   ├── infra-configs/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   │   └── apps/</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">└── deploy/                       # Base manifests</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── tenants/                  # Namespaces, ServiceAccounts, RBAC etc.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── infra-controllers/        # Controller Flux HelmReleases</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    ├── infra-configs/            # Infrastructure Components</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    └── apps/                     # podinfo HelmRelease</span><br></div></code></pre></div></div>
<p>To add a new cluster to the setup, a number of things need to happen before we can provision anything to the spoke cluster. First, create a new cluster under <code>hub/&lt;your cluster name&gt;.yaml</code> alongside four Kustomizations. Create a new overlay under <code>clusters/&lt;your cluster name&gt;/</code>. Provision the kubeconfig secret in the hub cluster and finally, commit and push the changes to Git so that Flux applies the defined configuration to this brand new cluster.</p>
<p>In today's demonstration, we would like to offer an alternative, fresh approach and propose a few changes to the existing repository structure to allow Sveltos flexibility to extend the setup and support automatic deployment of resources while keeping the manifest in the repository minimal.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="flux-and-sveltos-repository-structure">Flux and Sveltos Repository Structure<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#flux-and-sveltos-repository-structure" class="hash-link" aria-label="Direct link to Flux and Sveltos Repository Structure" title="Direct link to Flux and Sveltos Repository Structure" translate="no">​</a></h2>
<p>The whole idea is to give teams the flexibility to scale and expand their fleet with minimal effort, fewer changes, and fewer headaches. Once Sveltos is up and running, we deploy a few manifests to describe Sveltos logic and how it should work when a new spoke cluster is detected. More information about the files, outline, and logic is provided later in the post.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-remains-unchanged">What Remains Unchanged<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#what-remains-unchanged" class="hash-link" aria-label="Direct link to What Remains Unchanged" title="Direct link to What Remains Unchanged" translate="no">​</a></h3>
<p>The <code>deploy/</code>, <code>clusters/&lt;env&gt;/</code>, and <code>hub/flux-system/</code> directories are untouched. Later on, we will see how Sveltos is used to dynamically bootstrap the managed clusters and deploy the information stored under the <code>deploy/</code> directory.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-changes">What Changes<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#what-changes" class="hash-link" aria-label="Direct link to What Changes" title="Direct link to What Changes" translate="no">​</a></h3>
<p>The static <code>hub/staging.yaml</code> and <code>hub/production.yaml</code> files are replaced by dynamic generation taken over by the Sveltos Event Framework when a new managed cluster with the label <code>type: spoke</code> is detected.</p>
<p>The changes are introduced primarily in the <code>hub/</code> directory as it reflects the brain of our operations. We kept the Flux configuration and added the Sveltos installation details and its logic to perform event-driven decisions based on spoke clusters with specific labels applied. The <code>clusters/</code> directory contains the <code>sveltos-clusters/</code> definition, which is used in this particular demo to apply the right labels to the managed clusters.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">hub/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- hub/sveltos-install.yaml # Flux Kustomization to install Sveltos</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- hub/sveltos-event-framework.yaml # Flux Kustomization to apply EventSources/EventTriggers</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- hub/sveltos-clusters.yaml # Flux Kustomization to register SveltosClusters</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- hub/sveltos/ # Sveltos main logic</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - install/ # Sveltos Flux HelmRelease</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - event-framework/event-sources/ # Sveltos EventSource resources</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - event-framework/event-triggers/ # EventTrigger resources and ConfigMap templates</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">clusters/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">- clusters/sveltos-clusters/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - hub.yaml # Hub cluster registration with `type: mgmt` label</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - staging.yaml # Namespace + SveltosCluster with labels (`type: spoke`, `environment: staging`)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  - production.yaml # Namespace + SveltosCluster with labels (`type: spoke`, `environment: production`)</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="updated-repository-structure">Updated Repository Structure<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#updated-repository-structure" class="hash-link" aria-label="Direct link to Updated Repository Structure" title="Direct link to Updated Repository Structure" 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">flux2-hub-spoke-example/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── hub/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── flux-system/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── kustomization.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── sveltos-install.yaml              # Installs Sveltos as a Flux HelmRelease</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── sveltos-event-framework.yaml      # Applies the Sveltos Event Framework</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── sveltos-clusters.yaml             # Automatically registers SveltosClusters (managed/spoke clusters)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── sveltos/                          # Sveltos configuration and logic</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── install/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       │   ├── kustomization.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       │   └── sveltos-helmrelease.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── event-framework/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           ├── kustomization.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           ├── event-sources/            # Sveltos Event Sources to detect when a cluster needs a particular deployment</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           │   ├── cert-manager.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           │   ├── kustomization.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           │   ├── kyverno.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           │   └── spoke-cluster.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│           └── event-triggers/            # Sveltos Event Trigger to perform a specific deployment based on an Event</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│               ├── bootstrap-cluster.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│               ├── cert-manager.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│               ├── kustomization.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│               └── kyverno.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">├── clusters/</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── production/                       # The production/ uses the old deployment approach</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   ├── staging/                          # The staging/ uses the old deployment approach</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│   └── sveltos-clusters/                 # Includes the dynamic cluster registrations powered by Sveltos suitable for this demo</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── hub.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── kustomization.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       ├── production.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">│       └── staging.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">└── deploy/                               # Unchanged base manifests</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="demo-flow-diagram">Demo Flow Diagram<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#demo-flow-diagram" class="hash-link" aria-label="Direct link to Demo Flow Diagram" title="Direct link to Demo Flow Diagram" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Demo Flow Diagram&amp;quot;" src="https://blog.grosdouli.dev/assets/images/sveltos_flux_demo_flow-ea10212d4d7cdaef85ff45d7322a58d1.png" width="1064" height="862" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="deployment-order-details">Deployment Order Details<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#deployment-order-details" class="hash-link" aria-label="Direct link to Deployment Order Details" title="Direct link to Deployment Order Details" translate="no">​</a></h3>
<p>The deployment of the demo follows a logical continuation. We start by creating three Kubernetes clusters. Once those are ready, we perform a Flux bootstrap on the management cluster and ensure Flux is healthy. Once this is done, Sveltos is installed in the management cluster using a Kustomization pointing to the <code>./hub/sveltos/install</code> path. When Sveltos is healthy, we continue with the Sveltos Event Framework manifests and the registration of the managed clusters with Sveltos.</p>
<p>The Sveltos Event Framework follows as it detects managed clusters with specific labels. For example, once a managed cluster with the label set to <code>type: spoke</code> is detected, Sveltos will bootstrap the clusters using Kustomization pointing to the paths <code>./clusters/{{ .Resource.metadata.name }}/apps</code>, <code>./clusters/{{ .Resource.metadata.name }}/infra-controllers</code> and <code>./clusters/{{ .Resource.metadata.name }}/tenants</code>. Traefik and podinfo will get deployed on the managed clusters.</p>
<p>Finally, cert-manager and kyverno are deployed on demand when a managed cluster with the labels set to <code>cert-manager: required</code> and <code>kyverno: required</code> is spotted. They are expressed as Sveltos templates and are dynamically instantiated using information from the management cluster. A <code>HelmRepository</code> and a <code>HelmRelease</code> are dynamically created for every cluster that needs them.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>We discussed the original Flux Hub and Spoke repository changes; the table below describes how Flux and Sveltos work together to scale deployments beyond static cluster configuration definition.</p><table><thead><tr><th>Layer</th><th>Tool</th><th>Responsibility</th></tr></thead><tbody><tr><td>Source of truth</td><td>Flux</td><td>Pulls from Git, reconciles Sveltos configuration onto the hub directory</td></tr><tr><td>Runtime templating</td><td>Sveltos EventTrigger</td><td>Detects new managed clusters by label, renders Kustomizations and HelmReleases dynamically</td></tr><tr><td>Execution</td><td>Flux controllers</td><td>Reconciles the rendered objects to the managed clusters via the Kubeconfig file</td></tr></tbody></table></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="running-the-demo">Running the Demo<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#running-the-demo" class="hash-link" aria-label="Direct link to Running the Demo" title="Direct link to Running the Demo" translate="no">​</a></h2>
<p>The repository has already been modified with the proposed changes to give readers the chance to execute it locally in any environment running Docker and KinD.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-fork-and-clone">Step 1: Fork and Clone<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#step-1-fork-and-clone" class="hash-link" aria-label="Direct link to Step 1: Fork and Clone" title="Direct link to Step 1: Fork and Clone" translate="no">​</a></h3>
<p>Fork the <a href="https://github.com/egrosdou01/flux2-sveltos-hub-spoke-blog-demo.git" target="_blank" rel="noopener noreferrer" class="">flux2-sveltos-hub-spoke-blog-demo</a> repository and clone it in a local directory.</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">$ git clone https://github.com/&lt;your-username&gt;/flux2-sveltos-hub-spoke-blog-demo &amp;&amp; cd flux2-sveltos-hub-spoke-blog-demo</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-fleet-up">Step 2: Fleet-up<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#step-2-fleet-up" class="hash-link" aria-label="Direct link to Step 2: Fleet-up" title="Direct link to Step 2: Fleet-up" translate="no">​</a></h3>
<p>By executing the <code>make fleet-up</code> command, we create <strong>three KinD</strong> clusters. One reflects the <strong>management</strong> cluster where <strong>Flux</strong> and <strong>Sveltos</strong> are installed. The other two serve as the <strong>managed</strong> clusters, which are registered with Sveltos and have specific labels assigned.</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">$ make fleet-up</span><br></div></code></pre></div></div>
<p>The script will perform a programmatic Sveltos cluster registration as described in the <a href="https://projectsveltos.io/main/register/register-cluster/#programmatic-registration" target="_blank" rel="noopener noreferrer" class="">official guide</a>. Additionally, a number of secrets required by Flux and Sveltos are created during this phase.</p>
<table><thead><tr><th>Secret</th><th>Key</th><th>Namespace</th><th>Used by</th></tr></thead><tbody><tr><td><code>cluster-kubeconfig</code></td><td><code>value</code></td><td><code>staging</code> / <code>production</code></td><td>Flux-generated Kustomizations</td></tr><tr><td><code>staging-sveltos-kubeconfig</code></td><td><code>kubeconfig</code></td><td><code>staging</code></td><td>Sveltos rendered HelmReleases</td></tr><tr><td><code>production-sveltos-kubeconfig</code></td><td><code>kubeconfig</code></td><td><code>production</code></td><td>Sveltos rendered HelmReleases</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-bootstrap-flux">Step 3: Bootstrap Flux<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#step-3-bootstrap-flux" class="hash-link" aria-label="Direct link to Step 3: Bootstrap Flux" title="Direct link to Step 3: Bootstrap Flux" translate="no">​</a></h3>
<p>This is the most important part, as we need to have a working Flux deployment before we continue. To bootstrap Flux, we can either use the <code>make</code> utility and perform a <code>make flux-up</code>, or we can use the Flux CLI.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="automatic-flux-bootstrap">Automatic Flux Bootstrap<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#automatic-flux-bootstrap" class="hash-link" aria-label="Direct link to Automatic Flux Bootstrap" title="Direct link to Automatic Flux Bootstrap" translate="no">​</a></h3>
<p>Ensure the <code>scripts/flux-up.sh</code> is updated to reflect the repository of interest and authentication credentials. Once updated, perform <code>make flux-up</code> and wait until Flux is initialised in the <strong>management</strong> cluster.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The <strong>flux-up.sh</strong> script was not updated to reflect more recent Flux versions. That means the method used by the script has been deprecated. Use it with caution.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="manual-flux-bootstrap">Manual Flux Bootstrap<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#manual-flux-bootstrap" class="hash-link" aria-label="Direct link to Manual Flux Bootstrap" title="Direct link to Manual Flux Bootstrap" translate="no">​</a></h3>
<p>To perform a manual Flux bootstrap, ensure the following points are satisfied. Start by exporting the required <strong>repository</strong> and <strong>authentication</strong> variables. Ensure the <a href="https://github.com/egrosdou01/flux2-sveltos-hub-spoke-blog-demo/blob/main/hub/flux-system/gotk-sync.yaml#L14" target="_blank" rel="noopener noreferrer" class="">hub/flux-system/gotk-sync.yaml</a> file in the new fork is updated accordingly.</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 GITHUB_TOKEN=&lt;your-token&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ export GITHUB_USER=&lt;your-username&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ export GITHUB_REPO=&lt;repo-name&gt;</span><br></div></code></pre></div></div>
<p>Then, bootstrap Flux to the <strong>management</strong> 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 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">$ flux bootstrap github \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --token-auth \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --context=kind-hub \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --owner=${GITHUB_USER} \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --repository=${GITHUB_REPO} \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --branch=main \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --personal \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    --path=hub</span><br></div></code></pre></div></div>
<p>The <code>flux bootstrap github</code> command installs the Flux controllers in the <strong>management</strong> to reconcile everything under the <code>hub/</code> directory. Once the phase is complete, Flux will automatically perform a number of tasks.</p>
<ul>
<li class="">Install Sveltos via the <code>sveltos-install</code> Kustomization</li>
<li class="">Register the two <strong>managed</strong> clusters via the <code>sveltos-clusters</code></li>
<li class="">Apply the Sveltos Event Framework manifests to the <strong>management</strong> cluster via <code>sveltos-event-framework</code></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4-validation">Step 4: Validation<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#step-4-validation" class="hash-link" aria-label="Direct link to Step 4: Validation" title="Direct link to Step 4: Validation" translate="no">​</a></h3>
<p>If the Flux CLI is already installed, we can perform the <code>watch flux get kustomizations -A</code> command to list the kustomization status in the <strong>management</strong> cluster. As every resource is controlled and managed by Flux, the output will give us a good understanding of what is happening within the cluster, alongside what works and what does not.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="initial-flux-bootstrap">Initial Flux bootstrap<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#initial-flux-bootstrap" class="hash-link" aria-label="Direct link to Initial Flux bootstrap" title="Direct link to Initial Flux bootstrap" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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">$ flux get kustomizations -A</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAMESPACE       NAME            REVISION                SUSPENDED       READY   MESSAGE                              </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     flux-system     main@sha1:eab79367      False           True    Applied revision: main@sha1:eab79367</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sveltos-deployment-and-manifests">Sveltos Deployment and Manifests<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#sveltos-deployment-and-manifests" class="hash-link" aria-label="Direct link to Sveltos Deployment and Manifests" title="Direct link to Sveltos Deployment and Manifests" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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">$ flux get kustomizations -A   </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAMESPACE       NAME                    REVISION                SUSPENDED       READY   MESSAGE                              </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     flux-system             main@sha1:eab79367      False           True    Applied revision: main@sha1:eab79367</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     sveltos-clusters        main@sha1:eab79367      False           True    Applied revision: main@sha1:eab79367</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     sveltos-event-framework main@sha1:eab79367      False           True    Applied revision: main@sha1:eab79367</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     sveltos-install         main@sha1:eab79367      False           True    Applied revision: main@sha1:eab79367</span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="all-in-one-output">All-in-One Output<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#all-in-one-output" class="hash-link" aria-label="Direct link to All-in-One Output" title="Direct link to All-in-One Output" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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">$ flux get kustomizations -A -w</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAMESPACE       NAME                    REVISION                SUSPENDED       READY   MESSAGE                              </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     flux-system             main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     sveltos-clusters        main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     sveltos-event-framework main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system     sveltos-install         main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production      apps                    main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production      infra-controllers       main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production      tenants                 main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging         apps                    main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging         infra-controllers       main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging         tenants                 main@sha1:19c2ef24      False           True    Applied revision: main@sha1:19c2ef24</span><br></div></code></pre></div></div>
<p>Notice how <code>staging</code> and <code>production</code> Kustomizations appeared automatically. Sveltos generated those dynamically using the Event Framework and by detecting managed clusters with the label set to <code>type: spoke</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">$ export KUBECONFIG=/path/to/management 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 get helmrelease.helm.toolkit.fluxcd.io -A</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAMESPACE     NAME                      AGE   READY   STATUS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">flux-system   projectsveltos            35h   True    Helm install succeeded for release projectsveltos/projectsveltos-projectsveltos.v1 with chart projectsveltos@1.11.4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production    cert-manager-production   35h   True    Helm install succeeded for release cert-manager/cert-manager-cert-manager-production.v1 with chart cert-manager@v1.18.6</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production    kyverno-production        35h   True    Helm install succeeded for release kyverno/kyverno-kyverno-production.v1 with chart kyverno@3.6.3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production    podinfo                   35h   True    Helm install succeeded for release podinfo/podinfo.v1 with chart podinfo@6.14.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production    traefik                   35h   True    Helm install succeeded for release traefik/traefik.v1 with chart traefik@40.3.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging       cert-manager-staging      35h   True    Helm install succeeded for release cert-manager/cert-manager-cert-manager-staging.v1 with chart cert-manager@v1.19.4</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging       kyverno-staging           35h   True    Helm install succeeded for release kyverno/kyverno-kyverno-staging.v1 with chart kyverno@3.7.1</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging       podinfo                   35h   True    Helm install succeeded for release podinfo/podinfo.v1 with chart podinfo@6.14.0</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging       traefik                   35h   True    Helm install succeeded for release traefik/traefik.v1 with chart traefik@40.3.0</span><br></div></code></pre></div></div>
<p>From the output above, it is clear that Sveltos dynamically created the Flux HelmReleases based on an event. The event is the managed clusters with the right set of labels.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-sveltos-work">How does Sveltos work?<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#how-does-sveltos-work" class="hash-link" aria-label="Direct link to How does Sveltos work?" title="Direct link to How does Sveltos work?" translate="no">​</a></h2>
<p>The following sections and sub-sections describe how Sveltos logic is applied and how to automatically register and deploy resources across the managed clusters using a label approach. For this demo, the managed clusters are registered with Sveltos using the labels <code>type: spoke</code>, <code>environment: staging|production</code>, <code>cert-manager: required</code>, and <code>kyverno: required</code>.</p>
<p>Having different labels in place, we cannot only distinguish in an easy manner the different environments, but also add or remove add-ons and applications based on the identity of the cluster.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>We heavily use the <code>ClusterProfile</code> Sveltos resource, which applies add-ons and application to a cluster as a whole. If working with multi-tenant setups, take a look at the <a href="https://projectsveltos.io/main/addons/profile/#profiles" target="_blank" rel="noopener noreferrer" class=""><code>Profile</code> Sveltos resource</a>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pre-validation">Pre-validation<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#pre-validation" class="hash-link" aria-label="Direct link to Pre-validation" title="Direct link to Pre-validation" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sveltosclusters-output">SveltosClusters Output<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#sveltosclusters-output" class="hash-link" aria-label="Direct link to SveltosClusters Output" title="Direct link to SveltosClusters Output" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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 get sveltosclusters -A --show-labels</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAMESPACE    NAME         READY   VERSION   AGE     SHARD   LABELS</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt         mgmt         true    v1.35.0   4h37m           kustomize.toolkit.fluxcd.io/name=sveltos-clusters,kustomize.toolkit.fluxcd.io/namespace=flux-system,projectsveltos.io/k8s-version=v1.35.0,sveltos-agent=present,type=mgmt</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">production   production   true    v1.35.0   4h37m           cert-manager=required,environment=production,kustomize.toolkit.fluxcd.io/name=sveltos-clusters,kustomize.toolkit.fluxcd.io/namespace=flux-system,kyverno=required,projectsveltos.io/k8s-version=v1.35.0,sveltos-agent=present,type=spoke</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">staging      staging      true    v1.35.0   4h37m           cert-manager=required,environment=staging,kustomize.toolkit.fluxcd.io/name=sveltos-clusters,kustomize.toolkit.fluxcd.io/namespace=flux-system,kyverno=required,projectsveltos.io/k8s-version=v1.35.0,sveltos-agent=present,type=spoke</span><br></div></code></pre></div></div>
<p>Notice the custom labels added to each of the created clusters.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="eventsource-and-eventtrigger-resources">EventSource and EventTrigger Resources<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#eventsource-and-eventtrigger-resources" class="hash-link" aria-label="Direct link to EventSource and EventTrigger Resources" title="Direct link to EventSource and EventTrigger Resources" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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 get eventsource,eventtrigger -A</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                                                      AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eventsource.lib.projectsveltos.io/detect-cluster-requiring-cert-manager   4m7s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eventsource.lib.projectsveltos.io/detect-cluster-requiring-kyverno        4m7s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eventsource.lib.projectsveltos.io/detect-spoke-cluster                    4m7s</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                                                         AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eventtrigger.lib.projectsveltos.io/bootstrap-spoke-cluster   4m7s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eventtrigger.lib.projectsveltos.io/deploy-cert-manager       4m7s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">eventtrigger.lib.projectsveltos.io/deploy-kyverno            4m7s</span><br></div></code></pre></div></div>
<p>The different Sveltos resources are applied in the management cluster.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="sveltos-clusterprofile-and-clustersummary-resources">Sveltos ClusterProfile and ClusterSummary Resources<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#sveltos-clusterprofile-and-clustersummary-resources" class="hash-link" aria-label="Direct link to Sveltos ClusterProfile and ClusterSummary Resources" title="Direct link to Sveltos ClusterProfile and ClusterSummary Resources" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=/path/to/management 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 get clusterprofile,clustersummary -A</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                                                                   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-2ned8r1c51d5m82fxyz7   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-3xtrl5sg1dgzqnspfup7   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-6bkznpyd5kbp3wujgftg   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-bs7nw7dhsper5pypyxbx   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-foajrwp2g7y3ablcstdr   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-sy2obzjictcys4y2w1je   4h39m</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">NAMESPACE   NAME                                                                                AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-2ned8r1c51d5m82fxyz7-sveltos-mgmt   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-3xtrl5sg1dgzqnspfup7-sveltos-mgmt   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-6bkznpyd5kbp3wujgftg-sveltos-mgmt   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-bs7nw7dhsper5pypyxbx-sveltos-mgmt   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-foajrwp2g7y3ablcstdr-sveltos-mgmt   4h39m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-sy2obzjictcys4y2w1je-sveltos-mgmt   4h39m</span><br></div></code></pre></div></div>
<p>The available resources triggered by the Event Framework while Sveltos detected spoke clusters with specific labels set.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>We can have predictable <code>ClusterProfile</code> names by defining the field <code>profileNameFormat</code> under the <code>EventTrigger.spec</code> of every resource we have. For example, <code>profileNameFormat: "{{ .Cluster.metadata.name }}-{{ .Resource.metadata.name }}-certmanager"|kyverno</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 clusterprofile,clustersummary -A</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                                                   AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/cert-manager-helmrepository    10m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/kyverno-helmrepository         10m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/mgmt-production-certmanager    115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/mgmt-production-kyverno        115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/mgmt-staging-certmanager       115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/mgmt-staging-kyverno           115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-84646v00sc2ep9kutpif   10m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">clusterprofile.config.projectsveltos.io/sveltos-9ne8pa9e04d3scfqomuo   10m</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">NAMESPACE   NAME                                                                                AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/cert-manager-helmrepository-sveltos-mgmt    10m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/kyverno-helmrepository-sveltos-mgmt         10m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/mgmt-production-certmanager-sveltos-mgmt    115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/mgmt-production-kyverno-sveltos-mgmt        115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/mgmt-staging-certmanager-sveltos-mgmt       115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/mgmt-staging-kyverno-sveltos-mgmt           115s</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-84646v00sc2ep9kutpif-sveltos-mgmt   10m</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">mgmt        clustersummary.config.projectsveltos.io/sveltos-9ne8pa9e04d3scfqomuo-sveltos-mgmt   10m</span><br></div></code></pre></div></div></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>If something does not work as expected, check the status of the individual <code>ClusterSummary</code> resources. Use the command <code>kubectl get clustersummary.config.projectsveltos.io/sveltos-sy2obzjictcys4y2w1je-sveltos-mgmt -n mgmt -o yaml</code>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sveltos-installation-via-flux">Sveltos Installation via Flux<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#sveltos-installation-via-flux" class="hash-link" aria-label="Direct link to Sveltos Installation via Flux" title="Direct link to Sveltos Installation via Flux" translate="no">​</a></h3>
<p>The Sveltos installation is declared as a Flux Kustomization defined in the <code>hub/sveltos-install.yaml</code> file. The reference directory defines a <code>HelmRepository</code> and a <code>HelmRelease</code> used by Flux to deploy Sveltos in the management cluster. Find the full demo code here.</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"> kustomize.toolkit.fluxcd.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Kustomization</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">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"> sveltos</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">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 1h</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">retryInterval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 3m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 5m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sourceRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> GitRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">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">path</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ./hub/sveltos/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">prune</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">wait</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>
<p>Once Sveltos is deployed, it auto-registers the <strong>management</strong> cluster as a <code>SveltosCluster</code> instance under the <code>mgmt</code> namespace. The <code>sveltos-clusters</code> Kustomization patches the <code>type: mgmt</code> label onto it so Sveltos Event Framework can manage resources in the <strong>management</strong> cluster.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-the-sveltos-event-framework-work">How does the Sveltos Event Framework Work?<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#how-does-the-sveltos-event-framework-work" class="hash-link" aria-label="Direct link to How does the Sveltos Event Framework Work?" title="Direct link to How does the Sveltos Event Framework Work?" translate="no">​</a></h3>
<p>The Sveltos resources are applied to the management cluster using Kustomization. The Sveltos Event Framework is the magic behind the automation. Two important resources are used: the <strong>EventSource</strong> and the <strong>EventTrigger</strong>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="eventsource">EventSource<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#eventsource" class="hash-link" aria-label="Direct link to EventSource" title="Direct link to EventSource" translate="no">​</a></h4>
<p>An <code>EventSource</code> tells Sveltos what to watch for. We want to watch for the labels below and deploy the required add-on to the managed cluster. Thus, three <code>EventSource</code> resources have been created.</p>
<ol>
<li class=""><strong>detect-spoke-cluster</strong>: It watches for new clusters with the label set to <code>type: spoke</code></li>
<li class=""><strong>detect-cluster-requiring-cert-manager</strong>: It watches for clusters with the label set to <code>cert-manager: required</code></li>
<li class=""><strong>detect-cluster-requiring-kyverno</strong>: It watches for clusters with the label set to <code>kyverno: required</code></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 key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lib.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EventSource</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">requiring</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">collectResources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resourceSelectors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"lib.projectsveltos.io"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1beta1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SveltosCluster"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labelFilters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Equal</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> required</span></span><br></div></code></pre></div></div>
<p>Sveltos watches the <code>SveltosCluster</code> resources. When it detects, for example, a managed cluster with the label set to <code>cert-manager: required</code>, it fires the associated <code>EventTrigger</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="eventtrigger">EventTrigger<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#eventtrigger" class="hash-link" aria-label="Direct link to EventTrigger" title="Direct link to EventTrigger" translate="no">​</a></h4>
<p>An <code>EventTrigger</code> defines what happens when an event is detected. The <code>sourceClusterSelector</code> defines where to detect the event, the <code>destinationClusterSelector</code> defines where to apply the rendered resources, the <code>eventSourceName</code> defines the <code>EventSource</code> to watch, and finally, the <code>policyRefs</code> list any <code>ConfigMaps</code> or <code>Secrets</code> containing information to be applied.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lib.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EventTrigger</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deploy</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sourceClusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destinationClusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">eventSourceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">requiring</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">oneForEvent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmreleases</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div></code></pre></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="configmap-cert-manager-helmreleases">ConfigMap cert-manager-helmreleases<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#configmap-cert-manager-helmreleases" class="hash-link" aria-label="Direct link to ConfigMap cert-manager-helmreleases" title="Direct link to ConfigMap cert-manager-helmreleases" translate="no">​</a></h4>
<p>The ConfigMap is what Sveltos deploys to the management cluster, and it is nothing more than a Sveltos template of a <code>HelmRepository</code> and a <code>HelmRelease</code> for cert-manager.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmreleases</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectsveltos.io/instantiate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ok</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">helmreleases.yaml</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    apiVersion: source.toolkit.fluxcd.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    kind: HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      name: jetstack</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      namespace: flux-system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      interval: 1h</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      url: https://charts.jetstack.io</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    ---</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    apiVersion: helm.toolkit.fluxcd.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    kind: HelmRelease</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      name: cert-manager-{{ .Resource.metadata.name }}</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      namespace: {{ .Resource.metadata.namespace }}</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      interval: 15m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      targetNamespace: cert-manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      kubeConfig:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        secretRef:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          name: {{ .Resource.metadata.name }}-sveltos-kubeconfig</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          key: kubeconfig</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      chart:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          chart: cert-manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          version: "{{ if eq (index .Resource.metadata.labels "environment") "production" }}v1.18.6{{ else }}v1.19.4{{ end }}"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          sourceRef:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            kind: HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            name: jetstack</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            namespace: flux-system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          interval: 15m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      install:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        createNamespace: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        timeout: 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        strategy:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          name: RetryOnFailure</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      upgrade:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        timeout: 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        cleanupOnFail: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        strategy:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          name: RetryOnFailure</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      values:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        crds:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          keep: true</span></span><br></div></code></pre></div></div>
<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 annotation <code>projectsveltos.io/instantiate: ok</code> is required as it converts a ConfigMap into a Sveltos template. At render time, Sveltos dynamically instantiates the template using information from the matching <strong>managed</strong> cluster.</p><ul>
<li class=""><code>{{ .Resource.metadata.name }}</code>: The cluster name (e.g., <code>staging</code>)</li>
<li class=""><code>{{ .Resource.metadata.namespace }}</code>: The cluster namespace (e.g., <code>staging</code>)</li>
<li class=""><code>{{ index .Resource.metadata.labels "environment" }}</code>: The environment label value</li>
</ul></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> "</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> if eq (index .Resource.metadata.labels "environment") "production" </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">v1.18.6</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> else </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">v1.19.4</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> end </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">"</span><br></div></code></pre></div></div>
<p>As we are working with templates, we have the ability to use simple logic and control what version of cert-manager should get deployed to which managed cluster. For example, if a managed cluster has the label set to <code>environment: production</code>, then install <strong>v1.18.6</strong>. Else, install <strong>v1.19.4</strong>. No overlay files, no duplication, just work with labels.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-to-expand-the-demo">How to expand the Demo?<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#how-to-expand-the-demo" class="hash-link" aria-label="Direct link to How to expand the Demo?" title="Direct link to How to expand the Demo?" translate="no">​</a></h2>
<p>To add a new managed cluster to the setup, it is pretty simple. Create a new managed cluster with the right set of labels. <a href="https://projectsveltos.io/main/register/register-cluster/" target="_blank" rel="noopener noreferrer" class="">Register it with Sveltos</a>. If the new cluster needs to get the <code>podinfo</code> and <code>traefik Ingress Controller</code>, add the required overlays.</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">$ mkdir -p clusters/cluster01/{tenants,infra-controllers,apps}</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>Ensure the right set of Kubeconfig secrets is available on the management 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">$ kubectl --context kind-hub create secret generic -n cluster01 cluster01-kubeconfig \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --from-file=value=&lt;path-to-kubeconfig&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl --context kind-hub create secret generic -n cluster01 cluster01-sveltos-kubeconfig \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --from-file=kubeconfig=&lt;path-to-kubeconfig&gt;</span><br></div></code></pre></div></div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="clean-up">Clean Up<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#clean-up" class="hash-link" aria-label="Direct link to Clean Up" title="Direct link to Clean Up" translate="no">​</a></h2>
<p>To clean up the environment, simply execute the command below.</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">$ make fleet-down</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="benefits">Benefits<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#benefits" class="hash-link" aria-label="Direct link to Benefits" title="Direct link to Benefits" translate="no">​</a></h2>
<p>The Flux and Sveltos combination solves the scalability problem of the traditional multi-cluster GitOps. A two-layer approach is used: Flux handles source reconciliation while Sveltos provides event-driven templating. The key benefit is effortless fleet scaling. Adding the 10th cluster requires the same single file as adding the 2nd cluster, with no growth in repository complexity. Simply label the cluster, and Sveltos will automatically generate all the necessary Flux Kustomizations and
HelmReleases, eliminating manual per-cluster manifest creation.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this post, we walked through a demo of Flux and Sveltos working together. The hub-spoke model scales nicely. The repository does not grow regardless of the fleet size. Labels drive the cluster identity, workload deployment, and Helm chart version selection. Automation does not mean complexity. The Sveltos Event Framework simplifies multi-cluster deployments by making templates reusable and clusters self-describing. To learn more about how Sveltos completes the setup, take a look at the introductory blog post to <a class="" href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt1">Sveltos Progressive Rollouts </a> alongside a more <a class="" href="https://blog.grosdouli.dev/blog/sveltos-progressive-rollouts-pt2">complex example</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://fluxcd.io/" target="_blank" rel="noopener noreferrer" class="">Flux Documentation</a></li>
<li class=""><a href="https://github.com/projectsveltos" target="_blank" rel="noopener noreferrer" class="">Sveltos GitHub Repo</a></li>
<li class=""><a href="https://projectsveltos.io/main/events/addon_event_deployment/" target="_blank" rel="noopener noreferrer" class="">Sveltos Event Framework</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>We are here to help! Whether you have questions, or issues or need assistance, our Slack channel is the perfect place for you. Click here to <a href="https://join.slack.com/t/projectsveltos/shared_invite/zt-1hraownbr-W8NTs6LTimxLPB8Erj8Q6Q" target="_blank" rel="noopener noreferrer" class="">join us</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-support-this-project">👏 Support this project<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#-support-this-project" class="hash-link" aria-label="Direct link to 👏 Support this project" title="Direct link to 👏 Support this project" translate="no">​</a></h2>
<p>Every contribution counts! If you enjoyed this article, check out the Projectsveltos <a href="https://github.com/projectsveltos" target="_blank" rel="noopener noreferrer" class="">GitHub repo</a>. You can <a href="https://github.com/projectsveltos/addon-controller" target="_blank" rel="noopener noreferrer" class="">star 🌟 the project</a> if you find it helpful.</p>
<p>The GitHub repo is a great resource for getting started with the project. It contains the code, documentation, and many more examples.</p>
<p>Thanks for reading!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">Part 1</a></td><td style="text-align:left">Sveltos the core of deployments</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation">Part 2</a></td><td style="text-align:left">Flux and Sveltos for automated Flux HelmReleases</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo">Part 3</a></td><td style="text-align:left">Flux and Sveltos: Hub and spoke demo using an Event Driven Framework</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>Sveltos</category>
            <category>Flux</category>
            <category>GitOps</category>
            <category>Platform Engineering</category>
        </item>
        <item>
            <title><![CDATA[Flux HelmRelease Automation with Sveltos | Scale GitOps Without the YAML Sprawl | Sveltos]]></title>
            <link>https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation</link>
            <guid>https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation</guid>
            <pubDate>Thu, 18 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In this part of the series, we explore how Sveltos can automate the dynamic creation of Flux HelmRelease.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>In <a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">part 1</a> of the series, we explored how <a href="https://projectsveltos.io/main/" target="_blank" rel="noopener noreferrer" class="">Sveltos</a> acts as the main brain for our deployments to a fleet of clusters. However, this is the case when we start with Continuous Deployments (CD) or when we are willing to perform a full migration to a new architecture. The next two posts are dedicated to the collaboration between <a href="https://fluxcd.io/" target="_blank" rel="noopener noreferrer" class="">Flux</a> and Sveltos. Flux remains the core way of deploying applications using the Flux Customer Resource Definitions (CRDs), while Sveltos enters the play when we talk about scalability, automation, and dynamic instantiation of deployments.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos and Flux&amp;quot;" src="https://blog.grosdouli.dev/assets/images/fluxcd_and_sveltos-fe9a3f2f44383204458f5b7013a97c02.jpg" width="6830" height="2342" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="motivation">Motivation<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#motivation" class="hash-link" aria-label="Direct link to Motivation" title="Direct link to Motivation" translate="no">​</a></h2>
<p>Most engineers working in Platform Engineering already have a GitOps Controller like ArgoCD or Flux in place for Kubernetes deployments. It works, and it works well, until it does not. As teams grow and deployments spread across ten or more clusters, multiple environments, and different Hyperscalers, a once clean GitOps repository quickly ends up with duplicated Helm Releases, environment-specific overrides, and manual interventions nobody wants to own.</p>
<p>Having only a GitOps Controller in place is not enough when it comes to complex workloads, scalability, and management of deployments and add-ons across different environments. Teams end up juggling multiple tools just to add flexibility to an existing setup. Can we help teams work smaller, simpler, and not harder when it comes to continuous deployments? The answer is yes; follow along to explore the Sveltos magic! 🪄</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario">Scenario<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#scenario" class="hash-link" aria-label="Direct link to Scenario" title="Direct link to Scenario" translate="no">​</a></h2>
<p>In today's post, we will showcase a flexible way of using an existing Flux configuration, and how by adding Sveltos into the mix, we provide out-of-the-box capabilities like templating, event-driven workloads, and many more. We will work with an existing Flux deployment, and Sveltos will automate the dynamic creation of <a href="https://fluxcd.io/flux/components/helm/helmreleases/" target="_blank" rel="noopener noreferrer" class="">Flux HelmRelease</a> based on a <strong>cluster type</strong> or <strong>identity</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|          Deployment           |       Version       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|             RKE2              |   v1.35.3+rke2r3    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|           Sveltos             |       v1.8.0        |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|          Flux2 Helm           |       v2.18.3       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|      Flux Operator Helm       |       v0.40.0       |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------------+---------------------+</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-resources">GitHub Resources<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#github-resources" class="hash-link" aria-label="Direct link to GitHub Resources" title="Direct link to GitHub Resources" translate="no">​</a></h2>
<p>The YAML outputs are not complete. Have a look at the <a href="https://github.com/egrosdou01/blog-post-resources/tree/main/sveltos-gitops-controllers/pt2" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ol>
<li class="">A Kubernetes cluster acting as the <strong>management</strong> cluster</li>
<li class="">At least one <strong>managed</strong> cluster</li>
<li class="">Familiarity with Kubernetes manifest files</li>
<li class="">Familiarity with Flux</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="diagram">Diagram<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#diagram" class="hash-link" aria-label="Direct link to Diagram" title="Direct link to Diagram" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Sveltos and Flux Diagram&amp;quot;" src="https://blog.grosdouli.dev/assets/images/sveltos_gitops_installed-c7ccc020cb4d0c50dd5e80ec466d391c.png" width="1437" height="881" class="img_ev3q"></p>
<p>The diagram looks very similar to the one we saw in <a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">part 1</a> of the series. The difference here is that we already have a Flux deployment and project outline. We will install Sveltos using the native deployment options and let Sveltos listen for Events or specific resources and automate the deployment of Flux HelmRelease. Let's dive into the details.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="sveltos-installation">Sveltos Installation<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#sveltos-installation" class="hash-link" aria-label="Direct link to Sveltos Installation" title="Direct link to Sveltos Installation" translate="no">​</a></h2>
<p>The installation of Sveltos using Flux could be similar to the below. Feel free to use your preferred way of installing Sveltos to the management cluster.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Namespace</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> source.toolkit.fluxcd.io/v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 24h</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">url</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> https</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">//projectsveltos.github.io/helm</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">charts</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">---</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> helm.toolkit.fluxcd.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HelmRelease</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 30m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">targetNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">storageNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">chart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">chart</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"&gt;=1.6.1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">sourceRef</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> projectsveltos</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> flux</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">interval</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 12h</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">install</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">crds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Create</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">createNamespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">strategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RetryOnFailure</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">upgrade</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">crds</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CreateReplace</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">timeout</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">cleanupOnFail</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">strategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> RetryOnFailure</span></span><br></div></code></pre></div></div>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> kustomize.config.k8s.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Kustomization</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">resources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> sveltos</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmrelease.yaml</span></span><br></div></code></pre></div></div>
<p>The above yaml definition will install Sveltos to the <strong>management</strong> cluster in the <code>projectsveltos</code> nasmespace. The namespace is not negotiable. Sveltos has to be installed in this namespace.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="label-management-cluster">Label Management Cluster<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#label-management-cluster" class="hash-link" aria-label="Direct link to Label Management Cluster" title="Direct link to Label Management Cluster" translate="no">​</a></h3>
<p>To control resources in the <strong>management</strong> cluster with Sveltos, we will simply add the label <code>type: mgmt</code> to the <code>sveltoscluster</code> named <code>mgmt</code> in the <code>mgmt</code> namespace. The registration is done by Sveltos during installation. No manual intervention is needed. When we refer to the <strong>management</strong> cluster, is the cluster where Flux and Sveltos are installed.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl label sveltoscluster mgmt -n mgmt type=mgmt</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="automate-flux-helmrelease">Automate Flux HelmRelease<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#automate-flux-helmrelease" class="hash-link" aria-label="Direct link to Automate Flux HelmRelease" title="Direct link to Automate Flux HelmRelease" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-does-it-work">How does it work?<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#how-does-it-work" class="hash-link" aria-label="Direct link to How does it work?" title="Direct link to How does it work?" translate="no">​</a></h3>
<p>Sveltos works very well with the concept of labeling. We can label clusters with a dedicated <code>key: value</code> pair and use this information to dynamically create <strong>Flux HelmRelease</strong> based on our needs. In this example, everytime a cluster with the label <code>cert-manager: required</code> appears, we trigger an action and dynamically pre-instantiate and deploy a Flux Helm Release using the information located in the <strong>management</strong> cluster. To achieve our goal, we use the <a href="https://projectsveltos.io/main/events/addon_event_deployment/" target="_blank" rel="noopener noreferrer" class="">Sveltos Event Framework</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-an-eventsource">Define an EventSource<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#define-an-eventsource" class="hash-link" aria-label="Direct link to Define an EventSource" title="Direct link to Define an EventSource" translate="no">​</a></h3>
<p>A Sveltos <code>EventSource</code> is a simple way of instructing Sveltos to look for an event or a specific resource. This can be an Event within a cluster or an Event outside a cluster like NATs. In our case, we want to detect clusters with the label set to <code>cert-manager: required</code>.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lib.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EventSource</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">requiring</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">collectResources</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">resourceSelectors</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">group</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"lib.projectsveltos.io"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">version</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"v1beta1"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"SveltosCluster"</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">labelFilters</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">key</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">operation</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> Equal</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">value</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> required</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="define-an-eventtrigger">Define an EventTrigger<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#define-an-eventtrigger" class="hash-link" aria-label="Direct link to Define an EventTrigger" title="Direct link to Define an EventTrigger" translate="no">​</a></h3>
<p>Once an <code>EventSource</code> is detected, an action or multiple actions can be triggered. In this example, once an event is detected, we will deploy a ConfigMap to the <strong>management</strong> cluster which includes the Flux HelmRelease details expressed as a Sveltos template.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> lib.projectsveltos.io/v1beta1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> EventTrigger</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> deploy</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">sourceClusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">destinationClusterSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">type</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> mgmt</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">eventSourceName</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> detect</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">requiring</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">oneForEvent</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">policyRefs</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmrelease</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="automate-flux-helmrelease-1">Automate Flux HelmRelease<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#automate-flux-helmrelease-1" class="hash-link" aria-label="Direct link to Automate Flux HelmRelease" title="Direct link to Automate Flux HelmRelease" translate="no">​</a></h3>
<p>Now that we have our <code>EventSource</code> and <code>EventTrigger</code> in place, we need to define what actually gets deployed when an event is detected. We do this using a <code>ConfigMap</code> that holds the Flux Helm Release definition expressed as a Sveltos template.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> v1</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ConfigMap</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cert</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">manager</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">helmrelease</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> default</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">annotations</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">projectsveltos.io/instantiate</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> ok</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">data</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">cert-manager.yaml</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">|</span><span class="token scalar string" style="color:#e3116c"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    apiVersion: helm.toolkit.fluxcd.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    kind: HelmRelease</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    metadata:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      name: cert-manager-{{ .Resource.metadata.name  }}</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      namespace: {{ .Resource.metadata.namespace }}</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">    spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      interval: 15m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      kubeConfig:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        secretRef:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          name: {{ .Resource.metadata.name }}-sveltos-kubeconfig</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          key: kubeconfig</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      chart:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        spec:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          chart: cert-manager</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          version: "v1.16.x"</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          sourceRef:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            kind: HelmRepository</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            name: jetstack</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">            namespace: flux-system</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          interval: 15m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      install:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        createNamespace: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        timeout: 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        remediation:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          retries: 3</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      upgrade:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        timeout: 10m</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        cleanupOnFail: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        remediation:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          retries: 3</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          strategy: rollback</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">      values:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">        crds:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          enabled: true</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token scalar string" style="color:#e3116c">          keep: true</span></span><br></div></code></pre></div></div>
<p>The annotation <code>projectsveltos.io/instantiate: ok</code> is what converts a plain <code>ConfigMap</code> into a Sveltos template. Sveltos will pull information directly from the <strong>management</strong> cluster and dynamically pre-instantiate and deploy the resource using the detected cluster's metadata. Notice how <code>{{ .Resource.metadata.name }}</code> and <code>{{ .Resource.metadata.namespace }}</code> are automatically resolved per cluster, one template, many clusters. The <code>ConfigMap</code> can be further templatised based on different use cases. Both Lua and CEL languages are supported for Sveltos templating.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>The label-based approach covered here applies to <strong>any</strong> application. Explore the patterns that fit your use case and adapt them to your needs.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="result">Result<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#result" class="hash-link" aria-label="Direct link to Result" title="Direct link to Result" translate="no">​</a></h3>
<p>Every time a cluster with the label <code>cert-manager: required</code> appears, Sveltos detects the event, resolves the template, and dynamically creates a dedicated Flux Helm Release using that cluster's information. No manual intervention, no duplicated YAML. <strong>One template, one label, done</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>In this post, we explored how Sveltos and Flux can work together without replacing one another. Flux remains the backbone of your GitOps workflow, while Sveltos adds the intelligence layer on top, handling scalability, dynamic templating, and event-driven automation with minimal overhead. By combining the <code>EventSource</code>, <code>EventTrigger</code>, and a templated ConfigMap, we reduced what would otherwise be repetitive, manually maintained Flux Helm Release definitions into a single, reusable template. The moment a cluster is labeled <code>cert-manager: required</code>, Sveltos takes over and does the heavy lifting automatically.</p>
<p>The key takeaway: <strong>you do not need to abandon your existing Flux setup to benefit from Sveltos. You layer it in, and your platform becomes smarter, not more complex</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next?<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#whats-next" class="hash-link" aria-label="Direct link to What's Next?" title="Direct link to What's Next?" translate="no">​</a></h2>
<p>In the next post, we will work with a simple hub-spoke Flux deployment as our basis, and include Sveltos installation alongside the Event Framework approach to automate Flux HelmRelease. Stay tuned!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://fluxcd.control-plane.io/operator/" target="_blank" rel="noopener noreferrer" class="">Flux Operator Documentation</a></li>
<li class=""><a href="https://projectsveltos.github.io/sveltos/v1.0.0/getting_started/install/quick_start/" target="_blank" rel="noopener noreferrer" class="">Sveltos Quick Start</a></li>
<li class=""><a href="https://projectsveltos.github.io/sveltos/v1.0.0/events/addon_event_deployment/" target="_blank" rel="noopener noreferrer" class="">Sveltos Event Framework</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>We are here to help! Whether you have questions, or issues or need assistance, our Slack channel is the perfect place for you. Click here to <a href="https://join.slack.com/t/projectsveltos/shared_invite/zt-1hraownbr-W8NTs6LTimxLPB8Erj8Q6Q" target="_blank" rel="noopener noreferrer" class="">join us</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-support-thisproject">👏 Support this&nbsp;project<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#-support-thisproject" class="hash-link" aria-label="Direct link to 👏 Support this&nbsp;project" title="Direct link to 👏 Support this&nbsp;project" translate="no">​</a></h2>
<p>Every contribution counts! If you enjoyed this article, check out the Projectsveltos <a href="https://github.com/projectsveltos" target="_blank" rel="noopener noreferrer" class="">GitHub repo</a>. You can <a href="https://github.com/projectsveltos/addon-controller" target="_blank" rel="noopener noreferrer" class="">star 🌟 the project</a> if you find it helpful.</p>
<p>The GitHub repo is a great resource for getting started with the project. It contains the code, documentation, and many more examples.</p>
<p>Thanks for reading!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-gitops-controllers-pt1">Part 1</a></td><td style="text-align:left">Sveltos the core of deployments</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/sveltos-flux-helm-release-automation">Part 2</a></td><td style="text-align:left">Flux and Sveltos for automated Flux HelmReleases</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/flux-helmrelease-automation-sveltos-demo">Part 3</a></td><td style="text-align:left">Flux and Sveltos: Hub and spoke demo using an Event Driven Framework</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>Sveltos</category>
            <category>Flux</category>
            <category>GitOps</category>
            <category>Platform Engineering</category>
        </item>
        <item>
            <title><![CDATA[vCluster Network Isolation With Cilium | Isolate Tenant Traffic and Observe Flows With Cilium Hubble | vCluster]]></title>
            <link>https://blog.grosdouli.dev/blog/vcluster-updates-pt3</link>
            <guid>https://blog.grosdouli.dev/blog/vcluster-updates-pt3</guid>
            <pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Deep dive into Cilium Network Policies, Hubble, DNS, and how we can enhance networking in vCluster multi-tenant setups.]]></description>
            <content:encoded><![CDATA[<p><strong>Summary</strong>:</p>
<p>In parts <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">1</a> and <a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">2</a> of the series, we explored the different node assignment strategies, Cilium L2 Announcements, and the vCluster Platform. Today, we take a step further. We will look at how Cilium CNI running on the underlying Control Plane cluster directly enhances networking for virtual clusters. We will cover traffic isolation, policy enforcement, DNS resolution, and traffic observability.</p>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vCluster on existing Kubernetes Cluster&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_architecture-427aaea5d7db6710e493ace3cf067428.png" width="1396" height="566" class="img_ev3q"></p>
<p><a href="https://www.vcluster.com/docs/vcluster/introduction/architecture" target="_blank" rel="noopener noreferrer" class="">Source</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction">Introduction<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction" translate="no">​</a></h2>
<p>The promise of <a href="https://www.vcluster.com/docs" target="_blank" rel="noopener noreferrer" class="">vCluster</a> is to create separate and isolated control planes for virtual clusters running on top of an underlying Control Plane cluster. The different components are placed in a separate namespace for logical isolation. However, this does not ensure that the running workloads are isolated. In a Kubernetes cluster, every pod can communicate with any other pod by default. What does that really mean? Yes, the end-user will not know they are on a shared cluster, but each of the workloads running could reach workloads on any other virtual cluster.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lab-setup">Lab Setup<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#lab-setup" class="hash-link" aria-label="Direct link to Lab Setup" title="Direct link to Lab Setup" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|        Resources        |     Type     |     Version      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Control Plane Cluster  |     RKE2     | v1.34.3+rke2r1   |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-a     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     vcluster-team-b     |     K8s      |     v1.36.0      |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-------------------------+--------------+------------------+</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The control plane cluster is the cluster that hosts the virtualised control planes for the tenant clusters.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="github-resources">GitHub Resources<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#github-resources" class="hash-link" aria-label="Direct link to GitHub Resources" title="Direct link to GitHub Resources" translate="no">​</a></h2>
<p>The YAML outputs are not complete. Have a look at the <a href="https://github.com/egrosdou01/blog-post-resources/tree/main/experimenting-vcluster-multitenancy/updates-2026/pt3" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<p>Go through parts 1 and 2 of the series to gain a better understanding of the concept and what we aim to achieve.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vcluster-network-model">vCluster Network Model<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#vcluster-network-model" class="hash-link" aria-label="Direct link to vCluster Network Model" title="Direct link to vCluster Network Model" translate="no">​</a></h2>
<p>Before we jump into the examples and command outputs, it helps to understand the layered networking model. Two layers exist when we create virtual clusters.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">+-----------------------------------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|           Virtual Cluster (vcluster-team-a)    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Pod A  &lt;--&gt;  Pod B   (virtual cluster DNS)    |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+------------------+----------------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                   | Synced to Control Plane namespace</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+------------------v----------------------------+</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|     Control Plane Cluster (RKE2 + Cilium)     |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  pod/app-x-ns-x-vcluster-team-a               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  pod/app-y-ns-x-vcluster-team-a               |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">|  Cilium enforces eBPF-based policy.           |</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">+-----------------------------------------------+</span><br></div></code></pre></div></div>
<p>When we deploy a pod inside <code>vcluster-team-a</code>, the vCluster syncs the pod down to the Control Plane cluster's namespace, <code>vcluster-team-a</code>. The pod gets an IP as it would normally do. The virtual cluster's internal DNS and service abstraction sit on top, but actual packet forwarding is handled by Cilium.</p>
<p>vCluster provides control plane isolation. Each virtual cluster has its own API server, scheduler, and controller manager. Tenants cannot see each other's Kubernetes resources through the API. However, vCluster does not provide network-level isolation between tenant namespaces by default.</p>
<p>To better understand this concept, we deployed an NGINX application in the <code>default</code> namespace. This was done for the <code>vcluster-team-a</code> virtual cluster during its creation. Below are the two separate views. One from the Control Plane cluster and one from the <code>vcluster-team-a</code> virtual cluster.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=control-plane-cluster.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -n vcluster-team-a -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                                                       READY   STATUS    RESTARTS      AGE   IP            NODE   NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a   1/1     Running   1 (12d ago)   13d   10.42.0.48    el07   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nginx-6797d5487-27gcf-x-default-x-vcluster-team-a          1/1     Running   0             11d   10.42.0.125   el07   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vcluster-team-a-0                                          1/1     Running   0             11d   10.42.0.249   el07   &lt;none&gt;           &lt;none&gt;</span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE   NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">nginx-6797d5487-27gcf   1/1     Running   0          11d   10.42.0.125   el07   &lt;none&gt;           &lt;none&gt;</span><br></div></code></pre></div></div>
<p>We already have a test pod in the <code>vcluster-team-b</code> virtual cluster, and we will ping the NGINX pod using the assigned IP address 10.42.0.125. As there is no network isolation, the ping would be successful. For network-related tests, feel free to use the <a href="https://hub.docker.com/r/nicolaka/netshoot" target="_blank" rel="noopener noreferrer" class=""><code>nicolaka/netshoot</code></a> Docker image.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-b.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME              READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-pod   1/1     Running   0          11d   10.42.1.48   el07-worker1   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it test-pod -- ping -c3 10.42.0.125</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PING 10.42.0.125 (10.42.0.125) 56(84) bytes of data.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">64 bytes from 10.42.0.125: icmp_seq=1 ttl=63 time=0.165 ms</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">64 bytes from 10.42.0.125: icmp_seq=2 ttl=63 time=0.212 ms</span><br></div></code></pre></div></div>
<p>From the <code>test-pod</code>, we can also cURL the NGINX service IP address. We will get a response as expected.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="observations">Observations<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#observations" class="hash-link" aria-label="Direct link to Observations" title="Direct link to Observations" translate="no">​</a></h3>
<ul>
<li class="">Pods from <code>vcluster-team-a</code> are synced into the <code>vcluster-team-a</code> namespace on the Control Plane cluster</li>
<li class="">Pods from <code>vcluster-team-b</code> are synced into the <code>vcluster-team-b</code> namespace on the Control Plane cluster</li>
<li class="">These namespaces sit on the same flat network managed by Cilium</li>
<li class="">If someone knows the pod IP or service IP of a workload in <code>vcluster-team-b</code>, a pod in <code>vcluster-team-a</code> can reach it by <strong>default</strong></li>
</ul>
<p>For that reason, a modern CNI with capabilities and features made for complex and modern workloads is a must-have for every Kubernetes environment. Thus, <a href="https://docs.cilium.io/en/stable/" target="_blank" rel="noopener noreferrer" class="">Cilium</a> is the preferred CNI for multi-tenant environments.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Each vCluster runs its own CoreDNS instance. When vCluster syncs resources to the host cluster, the CoreDNS pod follows the standard vCluster naming convention. The CoreDNS pod lives inside the virtual cluster under the <code>kube-system</code> namespace. DNS queries from pods inside virtual clusters go to the specific CoreDNS instance.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cilium-hubble-observability">Cilium Hubble Observability<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#cilium-hubble-observability" class="hash-link" aria-label="Direct link to Cilium Hubble Observability" title="Direct link to Cilium Hubble Observability" translate="no">​</a></h2>
<p>To gain the most out of our Cilium installation, we can enable <a href="https://docs.cilium.io/en/stable/observability/hubble/" target="_blank" rel="noopener noreferrer" class="">Hubble</a>, Hubble UI, and Hubble Relay (optional) to have a visual representation of the traffic. We can expose the Hubble UI service as a <code>LoadBalancer</code> or <code>NodePort</code>, or simply port-forward it. Choose the option that suits your setup.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="helm-chart-values">Helm Chart Values<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#helm-chart-values" class="hash-link" aria-label="Direct link to Helm Chart Values" title="Direct link to Helm Chart Values" translate="no">​</a></h3>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">hubble</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">relay</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ui</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">enabled</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token boolean important" style="color:#36acaa">true</span></span><br></div></code></pre></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ helm upgrade rke2-cilium rke2-charts/rke2-cilium --version 1.18.300 --namespace kube-system -f values_control_plane.yaml</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>Hubble Relay is an optional component. However, to have visibility across the underlying nodes, it is advised to be enabled.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="hubble-ui-view">Hubble UI View<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#hubble-ui-view" class="hash-link" aria-label="Direct link to Hubble UI View" title="Direct link to Hubble UI View" translate="no">​</a></h3>
<p>Once Hubble UI is accessible, we can choose the <code>vcluster-team-a</code> or the <code>vcluster-team-b</code> namespace view and explore the traffic flow. Keep in mind that both virtual clusters are registered with the vCluster Platform, thus we see traffic to TCP port 10443.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="traffic-view-vcluster-team-a">Traffic View vcluster-team-a<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#traffic-view-vcluster-team-a" class="hash-link" aria-label="Direct link to Traffic View vcluster-team-a" title="Direct link to Traffic View vcluster-team-a" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vcluster-team-a Hubble No Restrictions View&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_team_a-25aa2e09de52826fb6207233f6668e6d.png" width="2424" height="918" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="traffic-view-vcluster-team-b">Traffic View vcluster-team-b<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#traffic-view-vcluster-team-b" class="hash-link" aria-label="Direct link to Traffic View vcluster-team-b" title="Direct link to Traffic View vcluster-team-b" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;vcluster-team-b Hubble No Restrictions View&amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_team_b-234995b3f4ce901906cfa7dcd02e5f9a.png" width="2434" height="1370" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-isolation">Network Isolation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#network-isolation" class="hash-link" aria-label="Direct link to Network Isolation" title="Direct link to Network Isolation" translate="no">​</a></h2>
<p>Observation at the Control Plane cluster is enabled, and we are ready to continue with the network isolation. As we already saw, there is no isolation between the different virtual clusters running on a Kubernetes cluster. Because virtual clusters are assigned to different teams, we want traffic to be allowed on the namespace they belong to, but blocked on other namespaces. We need to set up strong isolation and ensure different workloads are isolated. To achieve our goal, we have two options: either use the vCluster <code>NetworkPolicy</code> option provided during deployment and save time using the defaults, or use the Cilium advanced networking capabilities.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-isolation-vcluster-helm-values">Network Isolation: vCluster Helm Values<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#network-isolation-vcluster-helm-values" class="hash-link" aria-label="Direct link to Network Isolation: vCluster Helm Values" title="Direct link to Network Isolation: vCluster Helm Values" translate="no">​</a></h3>
<p>When we create virtual clusters, we can define network isolation by using the Helm values and working with the <code>policies.networkPolicy</code> configuration. By default, this will allow traffic between pods within a tenant cluster, block traffic from other namespaces, and permit DNS and API server communication. However, with this approach, we use the <code>NetworkPolicy</code> resource and not Cilium's full capabilities. For more details, take a look at the <a href="https://www.vcluster.com/docs/vcluster/next/configure/vcluster-yaml/policies/network-policy" target="_blank" rel="noopener noreferrer" class="">official documentation</a> on network policies.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="network-isolation-cilium">Network Isolation: Cilium<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#network-isolation-cilium" class="hash-link" aria-label="Direct link to Network Isolation: Cilium" title="Direct link to Network Isolation: Cilium" translate="no">​</a></h3>
<p><a href="https://docs.cilium.io/en/v1.18/security/policy/" target="_blank" rel="noopener noreferrer" class=""><code>CiliumNetworkPolicy</code></a> enhances Kubernetes security by using eBPF to filter traffic without the performance degradation of traditional <code>iptables</code>. It goes beyond simple IP-based rules to enforce identity-based security, while enabling deep <strong>Layer 7 filtering</strong> for specific HTTP paths, methods, and FQDNs.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="enforce-tenant-network-isolation">Enforce Tenant Network Isolation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#enforce-tenant-network-isolation" class="hash-link" aria-label="Direct link to Enforce Tenant Network Isolation" title="Direct link to Enforce Tenant Network Isolation" translate="no">​</a></h4>
<p>Crafting a <code>CiliumNetworkPolicy</code> for the underlying virtual clusters was more complex than anticipated. It is not only about the communication between the pods within the same namespace, but also the communication between the virtual cluster and the API server, <code>kubectl</code> execution from machines on the local network, DNS resolution, etc. I started with the simplest possible version.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumNetworkPolicy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> isolate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">endpointSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">#Applies this policy to all pods in the namespace</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div></code></pre></div></div>
<p>Applied the manifest to the Control Plane cluster, and guess what, <code>kubectl</code> commands did not work from another machine in the same network. The next step was to think about Ingress traffic. The <code>CiliumNetworkPolicy</code> was modified. This time, we scope external management access using the <code>fromCIDR</code> and the <code>fromEntities</code> host for node local traffic.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumNetworkPolicy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> isolate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">endpointSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">#Applies this policy to all pods in the namespace</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromCIDR</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> &lt;IP Subnet</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># e.g. 10.x.x.x/24 Replace with your management network CIDR</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEntities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> host </span><span class="token comment" style="color:#999988;font-style:italic"># Matches traffic routed through the local node's network interface</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster API server port; Cilium L2 LB fronts this and forwards to the Control Plane cluster API on 443</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div></code></pre></div></div>
<p>With the second version of the policy, the <code>kubectl</code> command worked. I was able to list resources and check everything in the virtual cluster. But the next issue arose, I was unable to create any resources. I tried to create a <code>busybox</code> pod, and it remained in a <code>Pending</code> state. The issue?</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Events:</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Type     Reason     Age   From        Message</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ----     ------     ----  ----        -------</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  Warning  SyncError  19s   pod-syncer  Error syncing to host cluster: create object: Post "https://10.43.0.1:443/api/v1/namespaces/vcluster-team-a/pods": http2: client connection lost</span><br></div></code></pre></div></div>
<p>The policy was updated once again to include an additional Egress rule. The following is required for the virtual cluster control plane pod to sync with the Control Plane Cluster API.</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token key atrule" style="color:#00a4db">apiVersion</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> cilium.io/v2</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">kind</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> CiliumNetworkPolicy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">metadata</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">name</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> isolate</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">spec</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">endpointSelector</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">#Applies this policy to all pods in the namespace</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromCIDR</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> &lt;IP Subnet</span><span class="token punctuation" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># e.g. 10.10.x.x/24 Replace with your management network CIDR</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEntities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> host </span><span class="token comment" style="color:#999988;font-style:italic"># Matches traffic routed through the local node's network interface</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster API server port; Cilium L2 LB fronts this and forwards to the Control Plane cluster API on 443</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">              </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">team</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">a</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEntities</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> kube</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">apiserver</span></span><br></div><div class="token-line theme-code-block-highlighted-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> host</span></span><br></div></code></pre></div></div>
<p>With the latest update, we can create workloads on the virtual clusters and isolate them. DNS egress to the virtual cluster's CoreDNS pod is covered by the same-namespace egress rule <code>toEndpoints.matchLabels.io.kubernetes.pod.namespace</code>, as CoreDNS is synced into the <code>vcluster-team-a</code> namespace. If your setup uses an external DNS resolver outside this namespace, add an explicit egress rule targeting that resolver.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>To get a visual representation of a CiliumNetworkPolicy, feel free to use the <a href="https://editor.networkpolicy.io/?id=elMJ7uYDicIJCHN2" target="_blank" rel="noopener noreferrer" class="">Cilium Network Policy Editor</a></p></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>If the virtual cluster is registered with the vCluster Platform for management, TCP communication on port 10443 needs to be allowed, and access from the vCluster Platform to the virtual cluster API server on TCP port 8443.</p><div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token key atrule" style="color:#00a4db">ingress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">fromEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">platform </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster Platform namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"8443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">#vCluster API server</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key atrule" style="color:#00a4db">egress</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">toEndpoints</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">matchLabels</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token key atrule" style="color:#00a4db">io.kubernetes.pod.namespace</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> vcluster</span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain">platform </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster Platform namespace</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token key atrule" style="color:#00a4db">toPorts</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">ports</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token punctuation" style="color:#393A34">-</span><span class="token plain"> </span><span class="token key atrule" style="color:#00a4db">port</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"10443"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># vCluster Platform API port</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token key atrule" style="color:#00a4db">protocol</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> TCP</span><br></div></code></pre></div></div></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation">Validation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#validation" class="hash-link" aria-label="Direct link to Validation" title="Direct link to Validation" translate="no">​</a></h4>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-b.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods -o wide</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME              READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">test-pod   1/1     Running   0          11d   10.42.1.48   el07-worker1   &lt;none&gt;           &lt;none&gt;</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it test-pod -- ping -c3 10.42.0.125</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">PING 10.42.0.125 (10.42.0.125): 56 data bytes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">--- 10.42.0.125 ping statistics ---</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">3 packets transmitted, 0 packets received, 100% packet loss</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">command terminated with exit code 1</span><br></div></code></pre></div></div>
<p><img decoding="async" loading="lazy" alt="title image reading &amp;quot;Hubble UI - Ping Blocked vcluster-team-b -&amp;gt; NGINX vcluster-team-a &amp;quot;" src="https://blog.grosdouli.dev/assets/images/vcluster_ping_fail-c2587ec933a9204493ede85bcf46ef66.png" width="2314" height="1138" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dns-in-action">DNS in Action<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#dns-in-action" class="hash-link" aria-label="Direct link to DNS in Action" title="Direct link to DNS in Action" translate="no">​</a></h2>
<p>Each virtual cluster deploys a dedicated CoreDNS instance that handles DNS queries independently from other tenants.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl get pods,svc -n kube-system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME                           READY   STATUS    RESTARTS      AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">pod/coredns-754d567864-f9kgj   1/1     Running   1 (14d ago)   14d</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service/kube-dns   ClusterIP   10.43.196.115   &lt;none&gt;        53/UDP,53/TCP,9153/TCP   14d</span><br></div></code></pre></div></div>
<p>Let's test and see how the requests are resolved from within the virtual clusters.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it dns-test -- bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># nslookup kubernetes.default</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Server:		10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address:	10.43.196.115#53</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Name:	kubernetes.default.svc.cluster.local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address: 10.43.243.114</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># nslookup nginx.default.svc.cluster.local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Server:		10.43.196.115</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address:	10.43.196.115#53</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Name:	nginx.default.svc.cluster.local</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Address: 10.43.141.183</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">;; Got recursion not available from 10.43.196.115</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>I also had to read about the <code>Got recursion not available from</code> messages. CoreDNS does not act as a recursive resolver by default and explicitly signals this via the <a href="https://help.dnsfilter.com/hc/en-us/articles/4408415850003-DNS-return-codes" target="_blank" rel="noopener noreferrer" class="">RCODE</a> flag. DNS succeeds. <a href="https://github.com/coredns/coredns/issues/3690" target="_blank" rel="noopener noreferrer" class="">GitHub discussion</a>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="packet-capture">Packet Capture<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#packet-capture" class="hash-link" aria-label="Direct link to Packet Capture" title="Direct link to Packet Capture" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>The vCluster CoreDNS is exposed on UDP port 1053.</p></div></div>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ export KUBECONFIG=vcluster-team-a.yaml</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it dns-test -- bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">dns-test:~# tcpdump -i any -n port 1053</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tcpdump: WARNING: any: That device doesn't support promiscuous mode</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">(Promiscuous mode not supported on the "any" device)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">tcpdump: verbose output suppressed, use -v[v]... for full protocol decode</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.653097 eth0  Out IP 10.42.0.72.37346 &gt; 10.42.0.48.1053: UDP, length 57</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.653292 eth0  In  IP 10.42.0.48.1053 &gt; 10.42.0.72.37346: UDP, length 150</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.654800 eth0  Out IP 10.42.0.72.53187 &gt; 10.42.0.48.1053: UDP, length 49</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.654933 eth0  In  IP 10.42.0.48.1053 &gt; 10.42.0.72.53187: UDP, length 96</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.656420 eth0  Out IP 10.42.0.72.36073 &gt; 10.42.0.48.1053: UDP, length 49</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">06:03:24.656545 eth0  In  IP 10.42.0.48.1053 &gt; 10.42.0.72.36073: UDP, length 142</span><br></div></code></pre></div></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Instead of a packet capture with the creation of a dedicated test pod, we can use Hubble to check the traffic flow.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">$ kubectl exec -it ds/cilium -n kube-system -- bash</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">/home/cilium# hubble observe --to-port 1053 --namespace vcluster-team-a -f</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a (ID:10933) &lt;&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) post-xlate-fwd TRANSLATED (UDP)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a:34123 (ID:10933) -&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) policy-verdict:L3-Only EGRESS ALLOWED (UDP)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a:34123 (ID:10933) -&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) policy-verdict:L3-Only INGRESS ALLOWED (UDP)</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">May 26 06:09:26.930: vcluster-team-a/dns-test-x-default-x-vcluster-team-a:34123 (ID:10933) -&gt; vcluster-team-a/coredns-754d567864-f9kgj-x-kube-system-x-vcluster-team-a:1053 (ID:1616) to-endpoint FORWARDED (UDP)</span><br></div></code></pre></div></div><p>For more information about Hubble and the available commands, take a look at the <a href="https://docs.cilium.io/en/v1.18/observability/hubble/" target="_blank" rel="noopener noreferrer" class="">official documentation</a>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-dedicated-coredns-matters">Why Dedicated CoreDNS Matters<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#why-dedicated-coredns-matters" class="hash-link" aria-label="Direct link to Why Dedicated CoreDNS Matters" title="Direct link to Why Dedicated CoreDNS Matters" translate="no">​</a></h3>
<p>Each tenant cluster runs its own CoreDNS instance. DNS resolution works entirely within the boundaries of the tenant cluster. Pods in the tenant cluster can only resolve service names in their virtual cluster. They use standard Kubernetes DNS names. For example, <code>my-service.default.svc.cluster.local</code>. Different teams can deploy services with identical names without conflicts. When Team A creates <code>redis.default</code> and Team B creates <code>redis.default</code>, each vCluster's CoreDNS resolves the name within its own isolated environment. No naming collisions, no prefixes, no Helm chart updates.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Using a CNI capable of handling modern workloads matters! In today's post, we explored how the Cilium CNI and Cilium Hubble help teams to control, isolate, and observe multitenant environments while giving them the flexibility to work on what matters the most, coding. In the next post, we will demonstrate how to use <a href="https://docs.cilium.io/en/v1.18/network/servicemesh/gateway-api/gateway-api/" target="_blank" rel="noopener noreferrer" class="">Cilium and Gateway API</a> as a shared resource so that each tenant cluster can create their own Gateway API resources for its workloads. Stay tuned!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h2>
<ul>
<li class=""><a href="https://www.vcluster.com/docs/vcluster/configure/vcluster-yaml/networking" target="_blank" rel="noopener noreferrer" class="">vCluster Networking</a></li>
<li class=""><a href="https://docs.cilium.io/en/v1.18/network/kubernetes/policy/" target="_blank" rel="noopener noreferrer" class="">Cilium Network Policies</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contact">✉️ Contact<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#%EF%B8%8F-contact" class="hash-link" aria-label="Direct link to ✉️ Contact" title="Direct link to ✉️ Contact" translate="no">​</a></h2>
<p>If you have any questions, feel free to get in touch! You can use the <code>Discussions</code> option found <a href="https://github.com/egrosdou01/blog.grosdouli.dev/discussions" target="_blank" rel="noopener noreferrer" class="">here</a> or reach out to me on any of the social media platforms provided. 😊 We look forward to hearing from you!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="series-navigation">Series Navigation<a href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3#series-navigation" class="hash-link" aria-label="Direct link to Series Navigation" title="Direct link to Series Navigation" translate="no">​</a></h2>
<table><thead><tr><th style="text-align:left">Part</th><th style="text-align:left">Title</th></tr></thead><tbody><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt1">Part 1</a></td><td style="text-align:left">vCluster Recent Updates</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt2">Part 2</a></td><td style="text-align:left">Introduction to Cilium L2 Announcements and vCluster Platform</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-updates-pt3">Part 3</a></td><td style="text-align:left">vCluster Networking and Cilium Under the Hood</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-multi-pool-rke2">Part 4 </a></td><td style="text-align:left">vCluster and Cilium Multi-Pool Mode</td></tr><tr><td style="text-align:left"><a class="" href="https://blog.grosdouli.dev/blog/vcluster-cilium-gateway-api-shared-resources">Part 5</a></td><td style="text-align:left">vCluster and Cilium Gateway API Shared Resources</td></tr></tbody></table>]]></content:encoded>
            <category>Kubernetes</category>
            <category>vCluster</category>
            <category>Cilium</category>
        </item>
    </channel>
</rss>