<?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://aa42b43d.gnmic-operator2.pages.dev/</link><description>Recent content on gNMIc Operator</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 08 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://aa42b43d.gnmic-operator2.pages.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>API Reference</title><link>https://aa42b43d.gnmic-operator2.pages.dev/docs/reference/api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/concepts/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/cluster/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/getting-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/reference/helm-chart/">Helm Chart Reference&lt;/a>.&lt;/p></description></item><item><title>Target Distribution</title><link>https://aa42b43d.gnmic-operator2.pages.dev/docs/advanced/target-distribution/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/reference/helm-chart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/pipeline/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/getting-started/quick-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/concepts/resource-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/advanced/scaling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/getting-started/development/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/target/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/advanced/tls/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/targetsource/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/subscription/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/output/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/input/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/processor/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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://aa42b43d.gnmic-operator2.pages.dev/docs/user-guide/tunneltargetpolicy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://aa42b43d.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>Introducing gNMIc Operator</title><link>https://aa42b43d.gnmic-operator2.pages.dev/blog/2026-02-08-introducing-gnmic-operator/</link><pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate><guid>https://aa42b43d.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>