<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>gNMIc Operator</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/</link><description>Recent content on gNMIc Operator</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 17 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://fbe70dc2.gnmic-operator2.pages.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>API Reference</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/reference/api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/reference/api/</guid><description>&lt;h2 id="cluster">Cluster&lt;/h2>
&lt;p>&lt;strong>API Version&lt;/strong>: &lt;code>operator.gnmic.dev/v1alpha1&lt;/code>&lt;/p>
&lt;h3 id="clusterspec">ClusterSpec&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>replicas&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Number of gNMIc pods&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>image&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Container image&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api&lt;/code>&lt;/td>
 &lt;td>APISpec&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>API configuration&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>grpcTunnel&lt;/code>&lt;/td>
 &lt;td>GRPCTunnelConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>gRPC tunnel server configuration&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>resources&lt;/code>&lt;/td>
 &lt;td>ResourceRequirements&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Pod resources&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>env&lt;/code>&lt;/td>
 &lt;td>[]EnvVar&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Environment variables&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="apispec">APISpec&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>restPort&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>REST API port&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>gnmiPort&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>gNMI server port&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tls&lt;/code>&lt;/td>
 &lt;td>ClusterTLSConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>TLS configuration&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="clustertlsconfig">ClusterTLSConfig&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>issuerRef&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>cert-manager Issuer name for certificates&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>useCSIDriver&lt;/code>&lt;/td>
 &lt;td>bool&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>false&lt;/td>
 &lt;td>Use cert-manager CSI driver instead of projected volumes&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>bundleRef&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Additional CA bundle for client certificate verification&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="grpctunnelconfig">GRPCTunnelConfig&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>port&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Port for the gRPC tunnel server&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tls&lt;/code>&lt;/td>
 &lt;td>ClusterTLSConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>TLS configuration for the tunnel&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>service&lt;/code>&lt;/td>
 &lt;td>ServiceConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Kubernetes service configuration&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="serviceconfig">ServiceConfig&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>type&lt;/code>&lt;/td>
 &lt;td>ServiceType&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>LoadBalancer&lt;/td>
 &lt;td>Kubernetes service type (ClusterIP, NodePort, LoadBalancer)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>annotations&lt;/code>&lt;/td>
 &lt;td>map[string]string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>-&lt;/td>
 &lt;td>Annotations to add to the service&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="clusterstatus">ClusterStatus&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>readyReplicas&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Number of ready replicas&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>pipelinesCount&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Number of enabled pipelines referencing this cluster&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>targetsCount&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Total unique targets across all pipelines&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>subscriptionsCount&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Total unique subscriptions across all pipelines&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>inputsCount&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Total unique inputs across all pipelines&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>outputsCount&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Total unique outputs across all pipelines&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>conditions&lt;/code>&lt;/td>
 &lt;td>[]Condition&lt;/td>
 &lt;td>Standard Kubernetes conditions&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="cluster-conditions">Cluster Conditions&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Type&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>Ready&lt;/code>&lt;/td>
 &lt;td>All replicas are ready and configured&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>CertificatesReady&lt;/code>&lt;/td>
 &lt;td>TLS certificates are issued (when TLS enabled)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>ConfigApplied&lt;/code>&lt;/td>
 &lt;td>Configuration successfully applied to pods&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="pipeline">Pipeline&lt;/h2>
&lt;p>&lt;strong>API Version&lt;/strong>: &lt;code>operator.gnmic.dev/v1alpha1&lt;/code>&lt;/p></description></item><item><title>Architecture</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/concepts/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/concepts/architecture/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>The gNMIc Operator follows the Kubernetes operator pattern to manage gNMIc telemetry collectors. It watches Custom Resources and reconciles the actual state with the desired state.&lt;/p>
&lt;h2 id="components">Components&lt;/h2>
&lt;p>This diagram illustrates how the gNMIc Operator orchestrates gNMIc deployments inside a Kubernetes cluster by reconciling Custom Resources into concrete Kubernetes primitives and gNMIc configurations.&lt;/p>
&lt;p>At the core, the Cluster Controller watches a set of CRDs.
It uses their desired state to create and manage resources like ConfigMaps, Secrets, Services, and a StatefulSet.
The StatefulSet, together with the associated Services, materializes as multiple gNMIc pods (e.. gnmic-0, gnmic-1, gnmic-2), each responsible for a subset of targets.&lt;/p></description></item><item><title>Cluster</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/cluster/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/cluster/</guid><description>&lt;p>The &lt;code>Cluster&lt;/code> resource defines a gNMIc collector deployment. It creates a StatefulSet, headless Service, Certificates, and manages the initial configuration for the gNMIc pods.&lt;/p>
&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;p>This CR creates a gNMIc cluster of 3 pods based on the referenced container image.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Cluster&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">telemetry-cluster&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">replicas&lt;/span>: &lt;span style="color:#ae81ff">3&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">image&lt;/span>: &lt;span style="color:#ae81ff">ghcr.io/openconfig/gnmic:latest&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="spec-fields">Spec Fields&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>replicas&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>1&lt;/td>
 &lt;td>Number of gNMIc pods to run&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>image&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>Container image for gNMIc&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>API&lt;/strong>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api&lt;/code>&lt;/td>
 &lt;td>APIConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>REST API and gNMI server configurations&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api.restPort&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>7890&lt;/td>
 &lt;td>Port for REST API&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api.gnmiPort&lt;/code>&lt;/td>
 &lt;td>int32&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>Port for gNMI server (optional)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api.tls&lt;/code>&lt;/td>
 &lt;td>ClusterTLSConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>TLS for REST API (operator ↔ pods)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api.tls.issuerRef&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>CertManager Issuer reference, used to sign the REST API certificates&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api.tls.bundleRef&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>ConfigMap reference, used to add API server trust bundles to the POD (key=&lt;code>ca.crt&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>api.tls.useCSIDriver&lt;/code>&lt;/td>
 &lt;td>bool&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>If true the API certificates are generated and mounted using CertManager CSI Driver&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>gNMI client TLS&lt;/strong>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>clientTLS&lt;/code>&lt;/td>
 &lt;td>ClusterTLSConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>TLS for gNMI client (pods → targets)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>clientTLS.issuerRef&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>CertManager Issuer reference, used to sign the gNMI client certificates&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>clientTLS.bundleRef&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>ConfigMap reference, used to add gNMI client trust bundles to the POD (key=&lt;code>ca.crt&lt;/code>)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>clientTLS.useCSIDriver&lt;/code>&lt;/td>
 &lt;td>bool&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>If true the gNMI client certificates are generated and mounted using CertManager CSI Driver&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Target Distribution&lt;/strong>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>targetDistribution&lt;/code>&lt;/td>
 &lt;td>TargetDistributionConfig&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>&lt;/td>
 &lt;td>Target distribution configuration&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>targetDistribution.perPodCapacity&lt;/code>&lt;/td>
 &lt;td>int&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>ceil(targets/pods)&lt;/td>
 &lt;td>Maximum number of targets assigned to a single pod&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="target-distribution">Target Distribution&lt;/h2>
&lt;p>By default, the operator distributes targets evenly across pods using bounded
load rendezvous hashing with an auto-calculated capacity of
&lt;code>ceil(totalTargets / replicas)&lt;/code>.&lt;/p></description></item><item><title>Installation</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/getting-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/getting-started/installation/</guid><description>&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;ul>
&lt;li>Kubernetes cluster (v1.25+)&lt;/li>
&lt;li>kubectl configured to access your cluster&lt;/li>
&lt;li>&lt;a href="https://cert-manager.io/">cert-manager&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="installation-methods">Installation Methods&lt;/h2>
&lt;h3 id="method-1-quick-install-recommended">Method 1: Quick Install (Recommended)&lt;/h3>
&lt;p>Download and apply the pre-built manifest from the release:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Install a specific version&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># This includes CRDs, RBAC, webhooks, and the operator deployment&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl apply -f https://github.com/gnmic/operator/releases/download/v0.1.0/install.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="method-2-using-kustomize">Method 2: Using Kustomize&lt;/h3>
&lt;p>For more control over the installation, use kustomize with an overlay:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Create a kustomization.yaml&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>cat &lt;span style="color:#e6db74">&amp;lt;&amp;lt;EOF &amp;gt; kustomization.yaml
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">apiVersion: kustomize.config.k8s.io/v1beta1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">kind: Kustomization
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">resources:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> - https://github.com/gnmic/operator/config/default?ref=v0.1.0
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">images:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> - name: controller
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> newName: ghcr.io/gnmic/operator
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> newTag: &amp;#34;0.1.0&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">EOF&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Apply&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl apply -k .
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="method-3-using-helm">Method 3: Using Helm&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Add the Helm repository (OCI)&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm install gnmic-operator oci://ghcr.io/gnmic/operator/charts/gnmic-operator --version 0.1.0
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Or with custom values&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm install gnmic-operator oci://ghcr.io/gnmic/operator/charts/gnmic-operator &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --version 0.1.0 &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --namespace gnmic-system &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --create-namespace &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --set resources.limits.memory&lt;span style="color:#f92672">=&lt;/span>512Mi
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>For a complete list of Helm chart configuration options, see the &lt;a href="https://fbe70dc2.gnmic-operator2.pages.dev/docs/reference/helm-chart/">Helm Chart Reference&lt;/a>.&lt;/p></description></item><item><title>Target Distribution</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/advanced/target-distribution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/advanced/target-distribution/</guid><description>&lt;p>The gNMIc Operator uses a simple algorithm to distribute targets across pods.
More placement/distribution strategies will be implemented in the future.&lt;/p>
&lt;p>This page explains the algorithm and its properties.&lt;/p>
&lt;h2 id="algorithm-bounded-load-rendezvous-hashing">Algorithm: Bounded Load Rendezvous Hashing&lt;/h2>
&lt;p>The operator uses &lt;strong>bounded load rendezvous hashing&lt;/strong>, which combines two techniques:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Rendezvous hashing&lt;/strong>: For stability (targets stay on same pod)&lt;/li>
&lt;li>&lt;strong>Bounded load&lt;/strong>: For even distribution (no pod is overloaded)&lt;/li>
&lt;/ol>
&lt;h2 id="how-it-works">How It Works&lt;/h2>
&lt;h3 id="step-1-determine-capacity">Step 1: Determine Capacity&lt;/h3>
&lt;p>If the Cluster CR specifies &lt;code>spec.targetDistribution.perPodCapacity&lt;/code>, that value
is used as a fixed ceiling. Otherwise capacity is calculated automatically:&lt;/p></description></item><item><title>Helm Chart</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/reference/helm-chart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/reference/helm-chart/</guid><description>&lt;p>This page documents all configuration options available in the gNMIc Operator Helm chart.&lt;/p>
&lt;h2 id="installation">Installation&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># From OCI registry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm install gnmic-operator oci://ghcr.io/gnmic/operator/charts/gnmic-operator &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --namespace gnmic-system &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --create-namespace
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># From source&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>helm install gnmic-operator ./helm &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --namespace gnmic-system &lt;span style="color:#ae81ff">\
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#ae81ff">&lt;/span> --create-namespace
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="values">Values&lt;/h2>
&lt;h3 id="image-configuration">Image Configuration&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Parameter&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>image.repository&lt;/code>&lt;/td>
 &lt;td>Container image repository&lt;/td>
 &lt;td>&lt;code>ghcr.io/gnmic/operator&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>image.tag&lt;/code>&lt;/td>
 &lt;td>Container image tag&lt;/td>
 &lt;td>Chart&amp;rsquo;s &lt;code>appVersion&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>image.pullPolicy&lt;/code>&lt;/td>
 &lt;td>Image pull policy&lt;/td>
 &lt;td>&lt;code>IfNotPresent&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>imagePullSecrets&lt;/code>&lt;/td>
 &lt;td>Image pull secrets&lt;/td>
 &lt;td>&lt;code>[]&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">image&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">repository&lt;/span>: &lt;span style="color:#ae81ff">ghcr.io/gnmic/operator&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">tag&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;0.1.0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">pullPolicy&lt;/span>: &lt;span style="color:#ae81ff">IfNotPresent&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">imagePullSecrets&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">my-registry-secret&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="deployment-configuration">Deployment Configuration&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Parameter&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>replicaCount&lt;/code>&lt;/td>
 &lt;td>Number of operator replicas&lt;/td>
 &lt;td>&lt;code>1&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>nameOverride&lt;/code>&lt;/td>
 &lt;td>Override the chart name&lt;/td>
 &lt;td>&lt;code>&amp;quot;&amp;quot;&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>fullnameOverride&lt;/code>&lt;/td>
 &lt;td>Override the full resource name&lt;/td>
 &lt;td>&lt;code>&amp;quot;&amp;quot;&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">replicaCount&lt;/span>: &lt;span style="color:#ae81ff">1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">nameOverride&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">fullnameOverride&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;my-operator&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="service-account">Service Account&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Parameter&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>serviceAccount.create&lt;/code>&lt;/td>
 &lt;td>Create a service account&lt;/td>
 &lt;td>&lt;code>true&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>serviceAccount.annotations&lt;/code>&lt;/td>
 &lt;td>Annotations for the service account&lt;/td>
 &lt;td>&lt;code>{}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>serviceAccount.name&lt;/code>&lt;/td>
 &lt;td>Name of the service account&lt;/td>
 &lt;td>Generated from fullname&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">serviceAccount&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">create&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">annotations&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">eks.amazonaws.com/role-arn&lt;/span>: &lt;span style="color:#ae81ff">arn:aws:iam::123456789:role/my-role&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;gnmic-operator&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="pod-configuration">Pod Configuration&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Parameter&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>podAnnotations&lt;/code>&lt;/td>
 &lt;td>Annotations for the operator pod&lt;/td>
 &lt;td>&lt;code>{}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>podSecurityContext&lt;/code>&lt;/td>
 &lt;td>Security context for the pod&lt;/td>
 &lt;td>&lt;code>{runAsNonRoot: true}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>securityContext&lt;/code>&lt;/td>
 &lt;td>Security context for the container&lt;/td>
 &lt;td>See below&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>nodeSelector&lt;/code>&lt;/td>
 &lt;td>Node selector for pod scheduling&lt;/td>
 &lt;td>&lt;code>{}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>tolerations&lt;/code>&lt;/td>
 &lt;td>Tolerations for pod scheduling&lt;/td>
 &lt;td>&lt;code>[]&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>affinity&lt;/code>&lt;/td>
 &lt;td>Affinity rules for pod scheduling&lt;/td>
 &lt;td>&lt;code>{}&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">podAnnotations&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">prometheus.io/scrape&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;true&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">podSecurityContext&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">runAsNonRoot&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">securityContext&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">allowPrivilegeEscalation&lt;/span>: &lt;span style="color:#66d9ef">false&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">capabilities&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">drop&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#e6db74">&amp;#34;ALL&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">nodeSelector&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">node-role.kubernetes.io/infra&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">tolerations&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">key&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;dedicated&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">operator&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;Equal&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">value&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;infra&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">effect&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;NoSchedule&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">affinity&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">podAntiAffinity&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">preferredDuringSchedulingIgnoredDuringExecution&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">weight&lt;/span>: &lt;span style="color:#ae81ff">100&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">podAffinityTerm&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">labelSelector&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">matchLabels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">app.kubernetes.io/name&lt;/span>: &lt;span style="color:#ae81ff">gnmic-operator&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">topologyKey&lt;/span>: &lt;span style="color:#ae81ff">kubernetes.io/hostname&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="resources">Resources&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Parameter&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>resources.limits.cpu&lt;/code>&lt;/td>
 &lt;td>CPU limit&lt;/td>
 &lt;td>&lt;code>500m&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>resources.limits.memory&lt;/code>&lt;/td>
 &lt;td>Memory limit&lt;/td>
 &lt;td>&lt;code>256Mi&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>resources.requests.cpu&lt;/code>&lt;/td>
 &lt;td>CPU request&lt;/td>
 &lt;td>&lt;code>10m&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>resources.requests.memory&lt;/code>&lt;/td>
 &lt;td>Memory request&lt;/td>
 &lt;td>&lt;code>64Mi&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">resources&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">limits&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">cpu&lt;/span>: &lt;span style="color:#ae81ff">1000m&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">memory&lt;/span>: &lt;span style="color:#ae81ff">512Mi&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">requests&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">cpu&lt;/span>: &lt;span style="color:#ae81ff">100m&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">memory&lt;/span>: &lt;span style="color:#ae81ff">128Mi&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="leader-election">Leader Election&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Parameter&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;th>Default&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>leaderElection.enabled&lt;/code>&lt;/td>
 &lt;td>Enable leader election&lt;/td>
 &lt;td>&lt;code>true&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;p>Leader election ensures only one controller instance is active when running multiple replicas.&lt;/p></description></item><item><title>Pipeline</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/pipeline/</guid><description>&lt;p>The &lt;code>Pipeline&lt;/code> resource connects targets, tunnelTargetPolicies, subscriptions, outputs, and inputs together. It defines the flow of telemetry data through the cluster.&lt;/p>
&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;p>The simplest way to configure a &lt;code>Pipeline&lt;/code> is using direct references to &lt;code>tagets&lt;/code>,&lt;code>subscriptions&lt;/code> and &lt;code>outputs&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Pipeline&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">core-telemetry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">clusterRef&lt;/span>: &lt;span style="color:#ae81ff">telemetry-cluster&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">enabled&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">targetRefs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">router1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">router2&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">subscriptionRefs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">interface-counters&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">outputs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">outputRefs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">prometheus-output&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>It can also be configured with &lt;code>labelSelectors&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Pipeline&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">core-telemetry&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">clusterRef&lt;/span>: &lt;span style="color:#ae81ff">telemetry-cluster&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">enabled&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">targetSelectors&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">matchLabels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">role&lt;/span>: &lt;span style="color:#ae81ff">core&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">env&lt;/span>: &lt;span style="color:#ae81ff">prod&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">matchLabels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">role&lt;/span>: &lt;span style="color:#ae81ff">edge&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">env&lt;/span>: &lt;span style="color:#ae81ff">prod&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">subscriptionSelectors&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">matchLabels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#ae81ff">interface-stats&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">outputs&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">outputSelectors&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#f92672">matchLabels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#ae81ff">prometheus&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">env&lt;/span>: &lt;span style="color:#ae81ff">prod&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The above example build a pipeline that includes:&lt;/p></description></item><item><title>Quick Start</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/getting-started/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/getting-started/quick-start/</guid><description>&lt;p>This guide walks you through deploying a complete telemetry collection setup with gNMIc Operator.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>We&amp;rsquo;ll create:&lt;/p>
&lt;ol>
&lt;li>A &lt;strong>TargetProfile&lt;/strong> with connection settings&lt;/li>
&lt;li>A &lt;strong>Target&lt;/strong> pointing to a network device&lt;/li>
&lt;li>A &lt;strong>Subscription&lt;/strong> defining what data to collect&lt;/li>
&lt;li>An &lt;strong>Output&lt;/strong> to send data to Prometheus&lt;/li>
&lt;li>A &lt;strong>Pipeline&lt;/strong> connecting everything together&lt;/li>
&lt;li>A &lt;strong>Cluster&lt;/strong> to run the gNMIc collectors&lt;/li>
&lt;/ol>
&lt;h2 id="step-1-create-a-targetprofile">Step 1: Create a TargetProfile&lt;/h2>
&lt;p>The TargetProfile defines shared settings for connecting to devices:&lt;/p>



&lt;ul class="nav nav-tabs" id="tabs-0" role="tablist">
 &lt;li class="nav-item">
 &lt;button class="nav-link active"
 id="tabs-00-00-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-00" role="tab"
 data-td-tp-persist="yaml" aria-controls="tabs-00-00" aria-selected="true">
 YAML
 &lt;/button>
 &lt;/li>&lt;li class="nav-item">
 &lt;button class="nav-link"
 id="tabs-00-01-tab" data-bs-toggle="tab" data-bs-target="#tabs-00-01" role="tab"
 data-td-tp-persist="bash" aria-controls="tabs-00-01" aria-selected="false">
 kubectl
 &lt;/button>
 &lt;/li>
&lt;/ul>

&lt;div class="tab-content" id="tabs-0-content">
 &lt;div class="tab-pane fade show active"
 id="tabs-00-00" role="tabpanel" aria-labelled-by="tabs-00-00-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">TargetProfile&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">default-profile&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># Reference to a Secret containing username/password&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">credentialsRef&lt;/span>: &lt;span style="color:#ae81ff">device-credentials&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># TLS without server certificate verification&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">tls&lt;/span>: {}
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e"># Connection timeout&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">timeout&lt;/span>: &lt;span style="color:#ae81ff">10s&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
 &lt;div class="tab-pane fade"
 id="tabs-00-01" role="tabpanel" aria-labelled-by="tabs-00-01-tab" tabindex="0">
 &lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>cat &lt;span style="color:#e6db74">&amp;lt;&amp;lt; &amp;#39;EOF&amp;#39; | kubectl apply -f -
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">apiVersion: operator.gnmic.dev/v1alpha1
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">kind: TargetProfile
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">metadata:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> name: default-profile
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">spec:
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> # Reference to a Secret containing username/password
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> credentialsRef: device-credentials
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> # TLS without server certificate verification
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> tls: {}
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> # Connection timeout
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74"> timeout: 10s
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#e6db74">EOF&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
 &lt;/div>
&lt;/div>

&lt;p>Create the credentials secret:&lt;/p></description></item><item><title>Resource Model</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/concepts/resource-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/concepts/resource-model/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>The gNMIc Operator uses a set of Custom Resource Definitions (CRDs) to model telemetry infrastructure. The resources are designed to be composable and reusable.&lt;/p>
&lt;h2 id="resource-hierarchy">Resource Hierarchy&lt;/h2>
&lt;a>
 &lt;img src="https://fbe70dc2.gnmic-operator2.pages.dev/images/resources_model.svg" alt="Resource Model CRD Diagram" style="display:block; margin:auto;">
&lt;/a>
&lt;h2 id="separation-of-concerns">Separation of Concerns&lt;/h2>
&lt;p>Each resource type handles a single concern:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Resource&lt;/th>
 &lt;th>Concern&lt;/th>
 &lt;th>Lifecycle&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>Cluster&lt;/strong>&lt;/td>
 &lt;td>Infrastructure&lt;/td>
 &lt;td>Where and how to run collectors&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Pipeline&lt;/strong>&lt;/td>
 &lt;td>Wiring&lt;/td>
 &lt;td>What connects to what&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Target&lt;/strong>&lt;/td>
 &lt;td>Device&lt;/td>
 &lt;td>Network device to collect from&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>TargetSource&lt;/strong>&lt;/td>
 &lt;td>Discovery&lt;/td>
 &lt;td>Dynamic target discovery&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>TargetProfile&lt;/strong>&lt;/td>
 &lt;td>Credentials&lt;/td>
 &lt;td>How to authenticate&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>TunnelTargetPolicy&lt;/strong>&lt;/td>
 &lt;td>Tunnel Matching&lt;/td>
 &lt;td>Rules for tunnel-connected devices&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Subscription&lt;/strong>&lt;/td>
 &lt;td>Data&lt;/td>
 &lt;td>What paths to subscribe to&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Output&lt;/strong>&lt;/td>
 &lt;td>Destination&lt;/td>
 &lt;td>Where to send data&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Input&lt;/strong>&lt;/td>
 &lt;td>Source&lt;/td>
 &lt;td>External data sources&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Processor&lt;/strong>&lt;/td>
 &lt;td>Transformation&lt;/td>
 &lt;td>How to transform data&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="resource-selection">Resource Selection&lt;/h2>
&lt;p>Resources are tied together in two main ways:&lt;/p></description></item><item><title>Scaling</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/advanced/scaling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/advanced/scaling/</guid><description>&lt;p>The gNMIc Operator supports horizontal scaling of collector clusters. This page explains how scaling works and best practices for production deployments.&lt;/p>
&lt;h2 id="scaling-a-cluster">Scaling a Cluster&lt;/h2>
&lt;p>To scale a cluster, update the &lt;code>replicas&lt;/code> field:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e"># Scale to 5 replicas&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>kubectl patch cluster my-cluster --type merge -p &lt;span style="color:#e6db74">&amp;#39;{&amp;#34;spec&amp;#34;:{&amp;#34;replicas&amp;#34;:5}}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Or edit the Cluster resource:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">replicas&lt;/span>: &lt;span style="color:#ae81ff">5&lt;/span> &lt;span style="color:#75715e"># Changed from 3&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="what-happens-when-you-scale">What Happens When You Scale&lt;/h2>
&lt;h3 id="scale-up--3--5-pods">Scale Up ( 3 → 5 pods)&lt;/h3>
&lt;ol>
&lt;li>Kubernetes creates new pods (&lt;code>gnmic-3&lt;/code>, &lt;code>gnmic-4&lt;/code>).&lt;/li>
&lt;li>Operator waits for pods to be ready.&lt;/li>
&lt;li>Operator recomputes the distribution plan. Existing target assignments are
preserved — only unassigned targets or targets displaced by capacity limits
are placed on the new pods.&lt;/li>
&lt;li>Configuration is applied to all pods.&lt;/li>
&lt;/ol>
&lt;h3 id="scale-down--5--3-pods">Scale Down ( 5 → 3 pods)&lt;/h3>
&lt;ol>
&lt;li>Operator recomputes the distribution plan for the reduced replica count.
Targets from removed pods flow through rendezvous hashing onto surviving
pods, bounded by each pod&amp;rsquo;s capacity.&lt;/li>
&lt;li>Configuration is applied to remaining pods.&lt;/li>
&lt;li>Kubernetes terminates pods (&lt;code>gnmic-4&lt;/code>, &lt;code>gnmic-3&lt;/code>).&lt;/li>
&lt;/ol>
&lt;h2 id="target-redistribution">Target Redistribution&lt;/h2>
&lt;p>The operator uses &lt;strong>bounded load rendezvous hashing&lt;/strong> to distribute targets.
See &lt;a href="../target-distribution/">Target Distribution&lt;/a> for a detailed explanation
of the algorithm.&lt;/p></description></item><item><title>Development Guide</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/getting-started/development/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/getting-started/development/</guid><description>&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Tool&lt;/th>
 &lt;th>Version&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;a href="https://go.dev/dl/">Go&lt;/a>&lt;/td>
 &lt;td>1.25+&lt;/td>
 &lt;td>Compile the operator&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://docs.docker.com/get-docker/">Docker&lt;/a>&lt;/td>
 &lt;td>20+&lt;/td>
 &lt;td>Build container images&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://kubernetes.io/docs/tasks/tools/">kubectl&lt;/a>&lt;/td>
 &lt;td>1.25+&lt;/td>
 &lt;td>Interact with the cluster&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://kind.sigs.k8s.io/">Kind&lt;/a>&lt;/td>
 &lt;td>0.20+&lt;/td>
 &lt;td>Local Kubernetes cluster&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://containerlab.dev">Containerlab&lt;/a>&lt;/td>
 &lt;td>0.54+&lt;/td>
 &lt;td>Lab topologies with real network devices&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;a href="https://gnmic.openconfig.net">gNMIc CLI&lt;/a>&lt;/td>
 &lt;td>0.38+&lt;/td>
 &lt;td>Configure lab nodes via gNMI Set&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="repository-layout">Repository Layout&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-text" data-lang="text">&lt;span style="display:flex;">&lt;span>.
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── api/v1alpha1/ # CRD type definitions and deepcopy methods
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── cmd/main.go # Operator entrypoint
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── config/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── crd/ # Generated CRD manifests
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── default/ # Kustomize overlay that combines everything
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── manager/ # Controller Deployment and Service
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── rbac/ # ClusterRole, ServiceAccount, Bindings
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── webhook/ # Webhook configuration
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── certmanager/ # cert-manager Issuer and Certificate
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── samples/ # Example CRs
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── internal/
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── controller/ # Reconcilers (Cluster, Pipeline, TargetState, …)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── gnmic/ # gNMIc client helpers (config builder, SSE, …)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ ├── utils/ # Shared utilities
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>│ └── webhook/ # Admission webhook handlers
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── helm/ # Helm chart
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── lab/dev/ # Development lab (Containerlab topology + operator resources)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>├── Dockerfile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>└── Makefile
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="initial-setup">Initial Setup&lt;/h2>
&lt;p>Clone the repository and run the one-time setup that creates a Kind cluster, installs cert-manager, builds the operator image, loads it, and deploys it:&lt;/p></description></item><item><title>Target &amp; TargetProfile</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/target/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/target/</guid><description>&lt;h2 id="target">Target&lt;/h2>
&lt;p>The &lt;code>Target&lt;/code> resource represents a network device to collect telemetry from.
The target definition is kept as simple as possible to remain automation and scale friendly.&lt;/p>
&lt;h3 id="basic-configuration">Basic Configuration&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Target&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">router1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">labels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">vendor&lt;/span>: &lt;span style="color:#ae81ff">vendorA&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">role&lt;/span>: &lt;span style="color:#ae81ff">core&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">site&lt;/span>: &lt;span style="color:#ae81ff">dc1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">address&lt;/span>: &lt;span style="color:#ae81ff">10.0.0.1&lt;/span>:&lt;span style="color:#ae81ff">57400&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">profile&lt;/span>: &lt;span style="color:#ae81ff">default-profile&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="spec-fields">Spec Fields&lt;/h3>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>address&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Device address (host:port)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>profile&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Reference to TargetProfile&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="using-labels">Using Labels&lt;/h3>
&lt;p>Labels are essential for pipeline selection.
Any label can be used but some obvious ones include:&lt;/p></description></item><item><title>TLS Configuration</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/advanced/tls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/advanced/tls/</guid><description>&lt;p>The gNMIc Operator supports multiple TLS configurations for different communication paths:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>TLS Type&lt;/th>
 &lt;th>Config Location&lt;/th>
 &lt;th>Purpose&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;strong>API TLS&lt;/strong>&lt;/td>
 &lt;td>&lt;code>cluster.spec.api.tls&lt;/code>&lt;/td>
 &lt;td>Operator ↔ gNMIc pod REST API&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Client TLS&lt;/strong>&lt;/td>
 &lt;td>&lt;code>cluster.spec.clientTLS&lt;/code>&lt;/td>
 &lt;td>gNMIc pod → Network target gNMI&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;strong>Tunnel TLS&lt;/strong>&lt;/td>
 &lt;td>&lt;code>cluster.spec.grpcTunnel.tls&lt;/code>&lt;/td>
 &lt;td>Network device → gNMIc pod tunnel&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="api-tls-operator--pods">API TLS (Operator ↔ Pods)&lt;/h2>
&lt;p>This TLS configuration secures the REST API communication between the operator controller and gNMIc collector pods.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>When TLS is enabled:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Server TLS&lt;/strong>: Each gNMIc pod presents a certificate to the operator&lt;/li>
&lt;li>&lt;strong>Client TLS (mTLS)&lt;/strong>: The operator presents a certificate to gNMIc pods&lt;/li>
&lt;li>&lt;strong>Certificate Verification&lt;/strong>: Both sides verify the other&amp;rsquo;s certificate&lt;/li>
&lt;/ol>
&lt;h2 id="prerequisites">Prerequisites&lt;/h2>
&lt;ol>
&lt;li>&lt;strong>cert-manager&lt;/strong> must be installed in your cluster:&lt;/li>
&lt;/ol>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-bash" data-lang="bash">&lt;span style="display:flex;">&lt;span>kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.2/cert-manager.yaml
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;ol start="2">
&lt;li>&lt;strong>A CA Issuer&lt;/strong> must be configured in the gNMIc cluster&amp;rsquo;s namespace&lt;/li>
&lt;/ol>
&lt;h2 id="quick-start">Quick Start&lt;/h2>
&lt;p>Assuming the gNMIc cluster will be created in the &lt;code>default&lt;/code> namespace. Start by preparing an Issuer to secure the Cluster&amp;rsquo;s REST API.&lt;/p></description></item><item><title>TargetSource</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/targetsource/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/targetsource/</guid><description>&lt;p>The &lt;code>TargetSource&lt;/code> resource enables dynamic discovery of network devices from external sources. The operator automatically creates, updates, and deletes &lt;code>Target&lt;/code> resources based on discovered devices.&lt;/p>
&lt;h2 id="discovery-sources">Discovery Sources&lt;/h2>
&lt;p>TargetSource supports multiple discovery backends:&lt;/p>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Source&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>http&lt;/code>&lt;/td>
 &lt;td>Fetch targets from an HTTP endpoint&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>consul&lt;/code>&lt;/td>
 &lt;td>Discover targets from Consul service registry&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>configMap&lt;/code>&lt;/td>
 &lt;td>Read targets from a Kubernetes ConfigMap&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>podSelector&lt;/code>&lt;/td>
 &lt;td>Create targets from Kubernetes Pods&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>serviceSelector&lt;/code>&lt;/td>
 &lt;td>Create targets from Kubernetes Services&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="http-discovery">HTTP Discovery&lt;/h2>
&lt;p>Discover targets from an HTTP endpoint that returns a JSON list of targets:&lt;/p></description></item><item><title>Subscription</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/subscription/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/subscription/</guid><description>&lt;p>The &lt;code>Subscription&lt;/code> resource defines what telemetry data to collect from targets.&lt;/p>
&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Subscription&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">interface-counters&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">labels&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#ae81ff">interfaces&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">paths&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">/interfaces/interface/state/counters&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">mode&lt;/span>: &lt;span style="color:#ae81ff">STREAM/SAMPLE&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">sampleInterval&lt;/span>: &lt;span style="color:#ae81ff">10s&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="spec-fields">Spec Fields&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>paths&lt;/code>&lt;/td>
 &lt;td>[]string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>YANG paths to subscribe to&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>mode&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Subscription mode: &lt;code>ONCE&lt;/code>, &lt;code>STREAM/SAMPLE&lt;/code>, &lt;code>STREAM/ON_CHANGE&lt;/code>, &lt;code>STREAM/TARGET_DEFINED&lt;/code>, &lt;code>POLL&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>sampleInterval&lt;/code>&lt;/td>
 &lt;td>duration&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Sampling interval for &lt;code>STREAM/SAMPLE&lt;/code> mode&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>encoding&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Data encoding: &lt;code>json&lt;/code>, &lt;code>json_ietf&lt;/code>, &lt;code>proto&lt;/code>, &lt;code>ascii&lt;/code>&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>prefix&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Common path prefix&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="subscription-modes">Subscription Modes&lt;/h2>
&lt;h3 id="stream-mode-default">Stream Mode (Default)&lt;/h3>
&lt;p>Continuous streaming of telemetry data:&lt;/p></description></item><item><title>Output</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/output/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/output/</guid><description>&lt;p>The &lt;code>Output&lt;/code> resource defines where telemetry data is sent. gNMIc supports many output types including Prometheus, Kafka, InfluxDB, and more.&lt;/p>
&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Output&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">prometheus-output&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#ae81ff">prometheus &lt;/span> &lt;span style="color:#75715e"># The output type&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">config&lt;/span>: {} &lt;span style="color:#75715e"># Output specific config fields&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="spec-fields">Spec Fields&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>type&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Output type (prometheus, kafka, influxdb, etc.)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>config&lt;/code>&lt;/td>
 &lt;td>object&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Type-specific configuration (schemaless)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>service&lt;/code>&lt;/td>
 &lt;td>OutputServiceSpec&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Kubernetes Service configuration. This is the service exposing the output endpoint (Prometheus only).&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>serviceRef&lt;/code>&lt;/td>
 &lt;td>ServiceReference&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Reference to a Kubernetes Service for address resolution&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>serviceSelector&lt;/code>&lt;/td>
 &lt;td>ServiceSelector&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Label selector to discover Kubernetes Services&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h3 id="service">Service&lt;/h3>
&lt;p>Defines the Service type, labels and annotations that will be created when the output has &lt;code>type=prometheus&lt;/code>.&lt;/p></description></item><item><title>Input</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/input/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/input/</guid><description>&lt;p>The &lt;code>Input&lt;/code> resource defines external data sources that feed telemetry data into the gNMIc cluster. This enables processing data from sources like Kafka, NATS, or other gNMIc instances.&lt;/p>
&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Input&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">kafka-input&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#ae81ff">kafka&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">config&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">brokers&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">kafka:9092&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">topics&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> - &lt;span style="color:#ae81ff">telemetry-raw&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">group&lt;/span>: &lt;span style="color:#ae81ff">gnmic-processors&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="spec-fields">Spec Fields&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>type&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Input type (kafka, nats, etc.)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>config&lt;/code>&lt;/td>
 &lt;td>object&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Type-specific configuration (schemaless)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="kafka-input">Kafka Input&lt;/h2>
&lt;p>Consume telemetry from Kafka topics:&lt;/p></description></item><item><title>Processor</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/processor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/processor/</guid><description>&lt;p>The &lt;code>Processor&lt;/code> resource defines event transformations applied to telemetry data. Processors can filter, enrich, transform, or drop events as they flow through the gNMIc cluster.&lt;/p>
&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Processor&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">add-cluster-tag&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#ae81ff">event-add-tag&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">config&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">add&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">cluster&lt;/span>: &lt;span style="color:#ae81ff">production&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">region&lt;/span>: &lt;span style="color:#ae81ff">us-east-1&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="spec-fields">Spec Fields&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>type&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Processor type (event-add-tag, event-drop, event-strings, etc.)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>config&lt;/code>&lt;/td>
 &lt;td>object&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Type-specific configuration (schemaless)&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="processor-types">Processor Types&lt;/h2>
&lt;h3 id="event-add-tag">Event Add Tag&lt;/h3>
&lt;p>Add static tags to events:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">Processor&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">add-metadata&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#ae81ff">event-add-tag&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">config&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">add&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">environment&lt;/span>: &lt;span style="color:#ae81ff">production&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">datacenter&lt;/span>: &lt;span style="color:#ae81ff">dc1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">overwrite&lt;/span>: &lt;span style="color:#66d9ef">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="event-drop">Event Drop&lt;/h3>
&lt;p>Drop events matching a condition:&lt;/p></description></item><item><title>TunnelTargetPolicy</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/tunneltargetpolicy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/docs/user-guide/tunneltargetpolicy/</guid><description>&lt;p>The &lt;code>TunnelTargetPolicy&lt;/code> resource defines rules for matching devices that connect via gRPC tunnel and associates them with configuration from a &lt;code>TargetProfile&lt;/code>.&lt;/p>
&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>In gRPC tunnel mode, network devices initiate connections to the gNMIc collector (reverse of traditional polling). When a device connects, it identifies itself with a &lt;strong>type&lt;/strong> and &lt;strong>ID&lt;/strong>. The &lt;code>TunnelTargetPolicy&lt;/code> defines matching rules to:&lt;/p>
&lt;ol>
&lt;li>Identify which tunnel-connected devices to accept&lt;/li>
&lt;li>Apply configuration (credentials, TLS settings) from a TargetProfile&lt;/li>
&lt;li>Enable subscription collection on matching devices&lt;/li>
&lt;/ol>
&lt;h2 id="basic-configuration">Basic Configuration&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-yaml" data-lang="yaml">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">apiVersion&lt;/span>: &lt;span style="color:#ae81ff">operator.gnmic.dev/v1alpha1&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">kind&lt;/span>: &lt;span style="color:#ae81ff">TunnelTargetPolicy&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">metadata&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">name&lt;/span>: &lt;span style="color:#ae81ff">core-routers&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#f92672">spec&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">match&lt;/span>:
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">type&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;router&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">id&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;^core-.*&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#f92672">profile&lt;/span>: &lt;span style="color:#ae81ff">router-profile&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="spec-fields">Spec Fields&lt;/h2>
&lt;table>
 &lt;thead>
 &lt;tr>
 &lt;th>Field&lt;/th>
 &lt;th>Type&lt;/th>
 &lt;th>Required&lt;/th>
 &lt;th>Description&lt;/th>
 &lt;/tr>
 &lt;/thead>
 &lt;tbody>
 &lt;tr>
 &lt;td>&lt;code>match&lt;/code>&lt;/td>
 &lt;td>TunnelTargetMatch&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Match criteria (if not set, matches all targets)&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>match.type&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Regex pattern to match target type&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>match.id&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>No&lt;/td>
 &lt;td>Regex pattern to match target ID&lt;/td>
 &lt;/tr>
 &lt;tr>
 &lt;td>&lt;code>profile&lt;/code>&lt;/td>
 &lt;td>string&lt;/td>
 &lt;td>Yes&lt;/td>
 &lt;td>Reference to a TargetProfile&lt;/td>
 &lt;/tr>
 &lt;/tbody>
&lt;/table>
&lt;h2 id="match-patterns">Match Patterns&lt;/h2>
&lt;p>Both &lt;code>type&lt;/code> and &lt;code>id&lt;/code> fields support Go regular expressions.&lt;/p></description></item><item><title>Designing Telemetry Pipelines</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/blog/2026-03-17-telemetry-pipeline-design/</link><pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/blog/2026-03-17-telemetry-pipeline-design/</guid><description>&lt;p>Managing gNMI telemetry at scale is not just a configuration problem. It&amp;rsquo;s an ownership problem. Subscriptions change often. Targets come and go. Different teams care about different slices of the network. And when your collector fleet spans multiple pods serving hundreds of devices, the last thing you want is a design where updating a Kafka output triggers a rolling restart, or where scaling from 3 to 5 pods means touching your telemetry wiring.&lt;/p></description></item><item><title>Introducing gNMIc Operator</title><link>https://fbe70dc2.gnmic-operator2.pages.dev/blog/2026-02-08-introducing-gnmic-operator/</link><pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate><guid>https://fbe70dc2.gnmic-operator2.pages.dev/blog/2026-02-08-introducing-gnmic-operator/</guid><description>&lt;p>Today we&amp;rsquo;re releasing &lt;strong>gNMIc Operator&lt;/strong>: A Kubernetes operator that brings cloud-native lifecycle management to &lt;a href="https://gnmic.openconfig.net/">gNMIc&lt;/a> telemetry collectors. It&amp;rsquo;s been a long road to get here, and I want to share a bit of the backstory.&lt;/p>
&lt;h2 id="an-idea-almost-4-years-in-the-making-todo-list">An idea almost 4 years in the &lt;del>making&lt;/del> TODO list&lt;/h2>
&lt;p>The idea was always clear: gNMIc should not only be a powerful CLI tool, but also a scalable, production-grade telemetry collector that could be orchestrated alongside the rest of your infrastructure. That led to multiple improvements to gNMIc (Clustering, Target Loaders,&amp;hellip;), but one of them was a bit more ambitious than the others: A gNMIc Kubernetes operator.&lt;/p></description></item></channel></rss>