<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Carvel on The Nested Lab</title>
    <link>https://thenestedlab.com/tags/carvel/</link>
    <description>Recent content in Carvel on The Nested Lab</description>
    <generator>Hugo</generator>
    <language>en-gb</language>
    <lastBuildDate>Wed, 23 Sep 2026 06:10:00 +0100</lastBuildDate>
    <atom:link href="https://thenestedlab.com/tags/carvel/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Telegraf on VKS: the dependency that isn&#39;t in the README</title>
      <link>https://thenestedlab.com/posts/telegraf-vks-management-proxy/</link>
      <pubDate>Wed, 23 Sep 2026 06:10:00 +0100</pubDate>
      <guid>https://thenestedlab.com/posts/telegraf-vks-management-proxy/</guid>
      <description>On VCF 9.1 the supported route installs Telegraf in new VKS clusters for you, once VCF Operations, the Metrics Aggregator and the add-on repository are in place. Underneath sits a dependency the package&amp;rsquo;s README doesn&amp;rsquo;t mention: two secrets that only the Supervisor Management Proxy puts into guest clusters. Without them every Telegraf pod sits in FailedMount. The supported route first, then the manual path on f06 and what each hop showed.</description>
      <content:encoded><![CDATA[<p>The <a href="/posts/telegraf-windows-2025/">Windows half of this series</a> was a
story about an agent that works on an OS the vendor hasn&rsquo;t listed. This
one is the opposite: a package on a fully supported platform that does
nothing at all, silently, because of a dependency its own documentation
doesn&rsquo;t mention. The supported route comes first; the rest is the path
underneath, as it ran on f06 (VCF 9.1).</p>
<h2 id="the-symptom">The symptom</h2>
<p>Install the Telegraf package on a VKS cluster with the metric proxy flag
set (<code>isMetricProxyConfigured: true</code>, which is what you want if the
metrics are going to VCF Operations) and every Telegraf pod stays in
<code>ContainerCreating</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">NAME           PACKAGE NAME                         PACKAGE VERSION         DESCRIPTION                                                            AGE   PAUSED
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">telegraf       telegraf.kubernetes.vmware.com       1.34.4+vmware.2-vks.1   Reconcile failed: Error (see .status.usefulErrorMessage for details)   15m
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kapp: Error: waiting on reconcile deployment/telegraf (apps/v1) namespace: tanzu-system-telegraf:
</span></span><span class="line"><span class="cl">  Finished waiting unsuccessfully:
</span></span><span class="line"><span class="cl">    Deployment is not progressing:
</span></span><span class="line"><span class="cl">      ProgressDeadlineExceeded, message:
</span></span><span class="line"><span class="cl">        ReplicaSet &#34;telegraf-7cd76f96&#34; has timed out progressing.
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">NAME                      READY   STATUS              RESTARTS   AGE
</span></span><span class="line"><span class="cl">telegraf-26ppl            0/1     ContainerCreating   0          15m
</span></span><span class="line"><span class="cl">telegraf-7cd76f96-wbthp   0/1     ContainerCreating   0          15m
</span></span><span class="line"><span class="cl">telegraf-g4qlm            0/1     ContainerCreating   0          15m
</span></span><span class="line"><span class="cl">telegraf-h2pcq            0/1     ContainerCreating   0          15m
</span></span></code></pre></div><p>Describe one and the reason is <code>FailedMount</code>: two secrets don&rsquo;t exist.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">  Warning  FailedMount  5m14s (x13 over 15m)  kubelet            MountVolume.SetUp failed for volume &#34;metrics-proxy-tls-config&#34; : secret &#34;metrics-proxy-tls-config&#34; not found
</span></span><span class="line"><span class="cl">  Warning  FailedMount  3m12s (x14 over 15m)  kubelet            MountVolume.SetUp failed for volume &#34;telegraf-configs&#34; : secret &#34;metrics-proxy-http-config&#34; not found
</span></span></code></pre></div><p>Nothing creates them. The package doesn&rsquo;t. The cluster doesn&rsquo;t. The
PackageInstall reports <code>ReconcileFailed</code> and backs off, and that&rsquo;s where
it stays.</p>
<h2 id="the-supported-route-first">The supported route first</h2>
<p>On VCF 9.1, VKS add-on management installs Telegraf and Prometheus for
you. Broadcom&rsquo;s page on enabling monitoring for VKS clusters (linked at
the end) puts it plainly: &ldquo;After the prerequisites are met, any new VKS
cluster is automatically monitored.&rdquo; It speaks only of new clusters. The
prerequisites, and how to check each:</p>
<ol>
<li><strong>VCF Operations monitors the vCenter and its Supervisor</strong>:
<em>Enable vSphere Supervisor Collection</em> in the vCenter account&rsquo;s
Advanced Settings, true by default. Look for a vSphere Supervisor
adapter instance and VKS Cluster objects in the inventory.</li>
<li><strong>The Metrics Aggregator runs on the Supervisor.</strong> VCF Automation
installs it by default; check the Supervisor&rsquo;s services in vCenter.</li>
<li><strong>The add-on repository offers Telegraf and Prometheus</strong>:
<code>AddonRepository</code>, <code>Addon</code> and <code>AddonConfigDefinition</code> resources on
the Supervisor.</li>
</ol>
<p>On 9.0.1 and later, Tom Fojta&rsquo;s <a href="https://fojta.wordpress.com/2026/02/03/monitoring-vks-cluster-in-vcf-automation/">Monitoring VKS Cluster in VCF
Automation</a>
installs the same two packages as add-on tiles in VCF Automation, after
the provider enables the Supervisor Management Proxy. His notes include a
Telegraf failure over an existing <code>metrics-proxy-tls-config</code> secret: the
mirror image of the one above.</p>
<p>f06 took neither route on 23 August. It ran 9.1, but its VCF Automation
arrived the next day; Ops had a vSphere Supervisor adapter instance, the
Metrics Aggregator wasn&rsquo;t registered, and nobody looked for add-ons. The
lab&rsquo;s catalog item installed the standard package itself, following
Christian Ferber&rsquo;s <a href="https://vrealize.it/2025/10/24/monitoring-vks-clusters-in-vcf-operations/">vrealize.it
write-up</a>
for 9.0.1. That path is the rest of this post.</p>
<p>Two days later, with VCF Automation deployed and the Supervisor rebuilt,
the automatic route left a footprint. A cluster created through VCF
Automation&rsquo;s API had Telegraf and Prometheus namespaces within two
minutes, none of it mine:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">NAME                     STATUS   ROLES           AGE    VERSION
</span></span><span class="line"><span class="cl">vks-demo01-jn7xr-2gkq9   Ready    control-plane   111s   v1.35.5+vmware.1
</span></span><span class="line"><span class="cl">--- namespaces ---
</span></span><span class="line"><span class="cl">NAME                                 STATUS   AGE
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">tanzu-system-monitoring              Active   18s
</span></span><span class="line"><span class="cl">tanzu-system-telegraf                Active   11s
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>The rebuilt demo01 had them too, before the catalog item&rsquo;s package stage
ran, so the item&rsquo;s PackageInstalls collided with another kapp app:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">=== telegraf ===
</span></span><span class="line"><span class="cl">kapp: Error: Ownership errors: - Resource &#39;clusterrole/telegraf-kubelet-metric-access (rbac.authorization.k8s.io/v1) cluster&#39; is already associated with a different label &#39;kapp.k14s.io/app=1787648814041772277&#39; - Resource &#39;serviceaccount/telegraf-sa (v1) namespace: tanzu-system-telegraf&#39; is already a
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>I didn&rsquo;t inspect what installed them (the Supervisor was serving the
<code>addons.kubernetes.vmware.com</code> API by then): a footprint, not a test.
Check for Telegraf before you install it.</p>
<h2 id="what-sits-underneath">What sits underneath</h2>
<p>The two secrets come from the <strong>Supervisor Management Proxy</strong>, a
Supervisor Service on the Supervisor, not in the guest. It runs envoy
behind a load balancer on port 10093. Each guest cluster gets a headless
Service, <code>supervisor-management-proxy</code> in <code>default</code>, pointing at it, plus
the two secrets in <code>kube-system</code>, each with a <code>SecretExport</code>. The
package&rsquo;s <code>SecretImport</code>s copy them into <code>tanzu-system-telegraf</code>, and
Telegraf posts to
<code>https://supervisor-management-proxy.default.svc.&lt;serviceDomain&gt;:10093/arc/tkgs/metric</code>.</p>
<p><img alt="Diagram: the secrets, the headless Service and the proxy&rsquo;s load balancer on f06, with the onward path to VCF Operations dashed" loading="lazy" src="/images/telegraf-vks-management-proxy-diagram.svg">
<em>Solid: what f06 showed. Dashed: the 9.1 design, in which the Supervisor also issues Telegraf&rsquo;s certificates and cert-manager rotates them.</em></p>
<p>The manual path needs a Supervisor with a load balancer, registry access
to <code>projects.packages.broadcom.com</code>, vCenter rights to register
Supervisor Services and cluster-admin in the guest. The cluster is
<code>demo01</code>: one control-plane node, two workers.</p>
<h2 id="1-install-the-supervisor-management-proxy">1. Install the Supervisor Management Proxy</h2>
<p>The lab&rsquo;s catalog item that deploys a Supervisor has an
<code>installMgmtProxy</code> tick box: register the service, then install it.
Every attempt was refused, and the definition shows why:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">data.packaging.carvel.dev/v1alpha1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Package</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">supervisor-management-proxy.vmware.com.0.4.1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">annotations</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">appplatform.vmware.com/use-system-vpc</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;true&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">appplatform.vmware.com/required_capability</span><span class="p">:</span><span class="w"> </span><span class="l">Load_Balancer_Supported</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">appplatform.vmware.com/vcenter-version-constraints</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;&gt;=9.0.0&#39;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">refName</span><span class="p">:</span><span class="w"> </span><span class="l">supervisor-management-proxy.vmware.com</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="m">0.4.1</span><span class="w">
</span></span></span></code></pre></div><p>The proxy asks for the <strong>system VPC</strong>, and vCenter only places services
there that it can verify as Broadcom-published:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">=== install on supervisor domain-c9 ===
</span></span><span class="line"><span class="cl">  install failed: 500
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">      &#34;default_message&#34;: &#34;Service supervisor-management-proxy.vmware.com version 0.4.1 is not a trusted service published by Broadcom and cannot be placed on the system VPC.&#34;,
</span></span><span class="line"><span class="cl">      &#34;id&#34;: &#34;vcenter.wcp.appplatform.signature_verification.system_vpc&#34;
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>Registered through the API as Carvel YAML, even byte-identical to
Broadcom&rsquo;s download, it never passed. The other Carvel services here
carry no such annotation and installed fine:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">harbor                       2.14.2+vmware.2-vks.2    no system-vpc annotation  content_type=CARVEL_APPS_YAML
</span></span><span class="line"><span class="cl">cci-ns                       9.1.0-embedded+739b5075  no system-vpc annotation  content_type=CARVEL_APPS_YAML
</span></span><span class="line"><span class="cl">velero                       1.9.0-embedded+25369333  no system-vpc annotation  content_type=CARVEL_APPS_YAML
</span></span></code></pre></div><p>That check is doing its job, and I won&rsquo;t show how the lab got past it.
On a platform you care about, install the proxy the way Broadcom&rsquo;s
proxy page (linked at the end) describes, so vCenter can verify what it
places on the system VPC. Whichever way it goes in, <strong>check it</strong> on the
Supervisor:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl">  <span class="p">[</span><span class="mi">30</span><span class="n">s</span><span class="p">]</span> <span class="n">service</span><span class="o">=</span><span class="n">CONFIGURED</span>  <span class="n">pod</span><span class="o">=</span><span class="n">Running</span> <span class="n">ready</span><span class="o">=</span><span class="mi">1</span><span class="o">/</span><span class="mi">1</span>
</span></span><span class="line"><span class="cl"><span class="o">---</span> <span class="n">LB</span> <span class="n">services</span> <span class="ow">in</span> <span class="n">proxy</span> <span class="n">ns</span> <span class="o">---</span>
</span></span><span class="line"><span class="cl">  <span class="n">workload</span><span class="o">-</span><span class="n">metrics</span><span class="o">-</span><span class="n">loadbalancer</span><span class="p">:</span> <span class="n">type</span><span class="o">=</span><span class="n">LoadBalancer</span> <span class="n">ip</span><span class="o">=</span><span class="mf">10.26</span><span class="o">.</span><span class="mf">20.21</span> <span class="n">ports</span><span class="o">=</span><span class="mi">10093</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span></code></pre></div><p>and in vCenter, where the install record holds only the namespace the
platform chose (the base64 is <code>namespace: svc-supervisor-management-proxy-acqyd</code>):</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">--- current install record ---
</span></span><span class="line"><span class="cl">{
</span></span><span class="line"><span class="cl">  &#34;desired_version&#34;: &#34;0.4.1&#34;,
</span></span><span class="line"><span class="cl">  &#34;current_version&#34;: &#34;0.4.1&#34;,
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">        &#34;default_message&#34;: &#34;Reason: ReconcileSucceeded. Message: Reconcile succeeded.&#34;,
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">  &#34;yaml_service_config&#34;: &#34;bmFtZXNwYWNlOiBzdmMtc3VwZXJ2aXNvci1tYW5hZ2VtZW50LXByb3h5LWFjcXlkCg==&#34;,
</span></span><span class="line"><span class="cl">  &#34;service_namespace&#34;: &#34;svc-supervisor-management-proxy-acqyd&#34;,
</span></span><span class="line"><span class="cl">  &#34;display_name&#34;: &#34;Supervisor Management Proxy&#34;,
</span></span><span class="line"><span class="cl">  &#34;config_status&#34;: &#34;CONFIGURED&#34;
</span></span><span class="line"><span class="cl">}
</span></span></code></pre></div><h2 id="2-create-the-cluster-with-servicedomain">2. Create the cluster with serviceDomain</h2>
<p><code>clusterNetwork.serviceDomain</code> can&rsquo;t be added later (step 7). The catalog
item now sets it on every demo cluster; demo01 as rebuilt:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">{
</span></span><span class="line"><span class="cl">  &#34;clusterNetwork&#34;: {
</span></span><span class="line"><span class="cl">    &#34;pods&#34;: {
</span></span><span class="line"><span class="cl">      &#34;cidrBlocks&#34;: [
</span></span><span class="line"><span class="cl">        &#34;192.168.0.0/16&#34;
</span></span><span class="line"><span class="cl">      ]
</span></span><span class="line"><span class="cl">    },
</span></span><span class="line"><span class="cl">    &#34;serviceDomain&#34;: &#34;cluster.local&#34;,
</span></span><span class="line"><span class="cl">    &#34;services&#34;: {
</span></span><span class="line"><span class="cl">      &#34;cidrBlocks&#34;: [
</span></span><span class="line"><span class="cl">        &#34;10.96.0.0/12&#34;
</span></span><span class="line"><span class="cl">      ]
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">  },
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><h2 id="3-add-the-package-repository">3. Add the package repository</h2>
<p>Telegraf ships in Broadcom&rsquo;s VKS standard packages. Register the
repository in the guest&rsquo;s <code>tkg-system</code> namespace:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">packaging.carvel.dev/v1alpha1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">PackageRepository</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">broadcom-standard-repo</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">namespace</span><span class="p">:</span><span class="w"> </span><span class="l">tkg-system</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">fetch</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">imgpkgBundle</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">projects.packages.broadcom.com/vsphere/supervisor/packages/2025.8.19/vks-standard-packages:v2025.8.19</span><span class="w">
</span></span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">packagerepository.packaging.carvel.dev/broadcom-standard-repo created
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">NAME                     AGE   DESCRIPTION           PAUSED
</span></span><span class="line"><span class="cl">broadcom-standard-repo   60s   Reconcile succeeded
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">=== packages available ===
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">NAME                                                                  PACKAGEMETADATA NAME                             VERSION                  AGE
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">telegraf.kubernetes.vmware.com.1.34.4+vmware.2-vks.1                  telegraf.kubernetes.vmware.com                   1.34.4+vmware.2-vks.1    54s
</span></span><span class="line"><span class="cl">telegraf.tanzu.vmware.com.1.32.1+vmware.1-tkg.1                       telegraf.tanzu.vmware.com                        1.32.1+vmware.1-tkg.1    54s
</span></span></code></pre></div><h2 id="4-install-telegraf">4. Install Telegraf</h2>
<p>Two values matter, from the package&rsquo;s own schema:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="o">---</span><span class="w"> </span><span class="nx">telegraf</span><span class="w"> </span><span class="kn">package</span><span class="w"> </span><span class="nx">valuesSchema</span><span class="w"> </span><span class="nx">keys</span><span class="w"> </span><span class="o">---</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="o">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nf">domainName</span><span class="w">  </span><span class="p">(</span><span class="k">default</span><span class="p">:</span><span class="w"> </span><span class="nx">cluster</span><span class="p">.</span><span class="nx">local</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="o">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nf">isMetricProxyConfigured</span><span class="w">  </span><span class="p">(</span><span class="k">default</span><span class="p">:</span><span class="w"> </span><span class="nx">False</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nf">namespace</span><span class="w">  </span><span class="p">(</span><span class="k">default</span><span class="p">:</span><span class="w"> </span><span class="nx">tanzu</span><span class="o">-</span><span class="nx">system</span><span class="o">-</span><span class="nx">telegraf</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="o">...</span><span class="w">
</span></span></span></code></pre></div><p>The catalog item installs it the Carvel way, in a <code>package-installs</code>
namespace whose service account has cluster-admin: a values Secret, then
a PackageInstall.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-js" data-lang="js"><span class="line"><span class="cl">    <span class="kd">function</span> <span class="nx">pkgSecret</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">valuesYml</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">k8sApply</span><span class="p">(</span><span class="nx">gk</span><span class="p">,</span> <span class="nx">gTok</span><span class="p">,</span> <span class="s2">&#34;/api/v1/namespaces/package-installs/secrets&#34;</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">            <span class="nx">apiVersion</span><span class="o">:</span> <span class="s2">&#34;v1&#34;</span><span class="p">,</span> <span class="nx">kind</span><span class="o">:</span> <span class="s2">&#34;Secret&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">metadata</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">namespace</span><span class="o">:</span> <span class="s2">&#34;package-installs&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">            <span class="nx">stringData</span><span class="o">:</span> <span class="p">{</span> <span class="s2">&#34;values.yml&#34;</span><span class="o">:</span> <span class="nx">valuesYml</span> <span class="p">}</span> <span class="p">},</span> <span class="s2">&#34;secret &#34;</span> <span class="o">+</span> <span class="nx">name</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="kd">function</span> <span class="nx">pkgInstall</span><span class="p">(</span><span class="nx">name</span><span class="p">,</span> <span class="nx">refName</span><span class="p">,</span> <span class="nx">ver</span><span class="p">,</span> <span class="nx">valuesSecret</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="p">...</span>
</span></span><span class="line"><span class="cl">        <span class="kd">var</span> <span class="nx">pi</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">apiVersion</span><span class="o">:</span> <span class="s2">&#34;packaging.carvel.dev/v1alpha1&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">kind</span><span class="o">:</span> <span class="s2">&#34;PackageInstall&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="nx">metadata</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">namespace</span><span class="o">:</span> <span class="s2">&#34;package-installs&#34;</span> <span class="p">},</span>
</span></span><span class="line"><span class="cl">            <span class="nx">spec</span><span class="o">:</span> <span class="p">{</span> <span class="nx">serviceAccountName</span><span class="o">:</span> <span class="s2">&#34;pkgi-sa&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                <span class="p">...</span>
</span></span><span class="line"><span class="cl">                <span class="nx">packageRef</span><span class="o">:</span> <span class="p">{</span> <span class="nx">refName</span><span class="o">:</span> <span class="nx">refName</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="nx">versionSelection</span><span class="o">:</span> <span class="p">{</span> <span class="nx">constraints</span><span class="o">:</span> <span class="nx">ver</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="p">(</span><span class="nx">valuesSecret</span><span class="p">)</span> <span class="p">{</span> <span class="nx">pi</span><span class="p">.</span><span class="nx">spec</span><span class="p">.</span><span class="nx">values</span> <span class="o">=</span> <span class="p">[{</span> <span class="nx">secretRef</span><span class="o">:</span> <span class="p">{</span> <span class="nx">name</span><span class="o">:</span> <span class="nx">valuesSecret</span> <span class="p">}</span> <span class="p">}];</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">        <span class="p">...</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    <span class="p">...</span>
</span></span><span class="line"><span class="cl">    <span class="nx">pkgSecret</span><span class="p">(</span><span class="s2">&#34;telegraf-values&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;domainName: cluster.local\n&#34;</span> <span class="o">+</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;isMetricProxyConfigured: true\n&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="nx">pkgInstall</span><span class="p">(</span><span class="s2">&#34;telegraf&#34;</span><span class="p">,</span> <span class="s2">&#34;telegraf.kubernetes.vmware.com&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">        <span class="s2">&#34;1.34.4+vmware.2-vks.1&#34;</span><span class="p">,</span> <span class="s2">&#34;telegraf-values&#34;</span><span class="p">);</span>
</span></span></code></pre></div><p>The pods land in <code>tanzu-system-telegraf</code>: one per node from a DaemonSet,
plus one Deployment pod.</p>
<h2 id="5-watch-the-secrets-arrive">5. Watch the secrets arrive</h2>
<p>This is the dependency. Within two minutes of the proxy reporting
<code>CONFIGURED</code>, the secrets and their <code>SecretExport</code>s were in demo01&rsquo;s
<code>kube-system</code>, and the <code>SecretImport</code>s had copied them across:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">---</span> <span class="n">secrets</span> <span class="o">+</span> <span class="n">secretimports</span> <span class="ow">in</span> <span class="n">tanzu</span><span class="o">-</span><span class="n">system</span><span class="o">-</span><span class="n">telegraf</span> <span class="o">---</span>
</span></span><span class="line"><span class="cl">  <span class="n">secrets</span><span class="p">:</span> <span class="n">metrics</span><span class="o">-</span><span class="n">proxy</span><span class="o">-</span><span class="n">http</span><span class="o">-</span><span class="n">config</span><span class="p">,</span> <span class="n">metrics</span><span class="o">-</span><span class="n">proxy</span><span class="o">-</span><span class="n">tls</span><span class="o">-</span><span class="n">config</span><span class="p">,</span> <span class="n">telegraf</span><span class="o">-</span><span class="n">registry</span><span class="o">-</span><span class="n">creds</span>
</span></span><span class="line"><span class="cl">  <span class="n">secretimport</span><span class="p">:</span> <span class="n">metrics</span><span class="o">-</span><span class="n">proxy</span><span class="o">-</span><span class="n">http</span><span class="o">-</span><span class="n">config</span> <span class="o">-&gt;</span> <span class="n">ReconcileSucceeded</span><span class="o">=</span><span class="n">True</span>
</span></span><span class="line"><span class="cl">  <span class="n">secretimport</span><span class="p">:</span> <span class="n">metrics</span><span class="o">-</span><span class="n">proxy</span><span class="o">-</span><span class="n">tls</span><span class="o">-</span><span class="n">config</span> <span class="o">-&gt;</span> <span class="n">ReconcileSucceeded</span><span class="o">=</span><span class="n">True</span>
</span></span><span class="line"><span class="cl">  <span class="n">kube</span><span class="o">-</span><span class="n">system</span> <span class="n">secretexport</span><span class="p">:</span> <span class="n">metrics</span><span class="o">-</span><span class="n">proxy</span><span class="o">-</span><span class="n">http</span><span class="o">-</span><span class="n">config</span> <span class="n">toNamespaces</span><span class="o">=</span>
</span></span><span class="line"><span class="cl">  <span class="n">kube</span><span class="o">-</span><span class="n">system</span> <span class="n">secretexport</span><span class="p">:</span> <span class="n">metrics</span><span class="o">-</span><span class="n">proxy</span><span class="o">-</span><span class="n">tls</span><span class="o">-</span><span class="n">config</span> <span class="n">toNamespaces</span><span class="o">=</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span></code></pre></div><p>The pods came up on their own:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">  [30s] telegraf pods ready: 0/4  pkgi: ReconcileFailed=True
</span></span><span class="line"><span class="cl">  [60s] telegraf pods ready: 2/4  pkgi: ReconcileFailed=True
</span></span><span class="line"><span class="cl">  [90s] telegraf pods ready: 4/4  pkgi: ReconcileFailed=True
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">  [480s] telegraf pods ready: 4/4  pkgi: ReconcileFailed=True
</span></span></code></pre></div><p>After an hour and forty minutes of <code>FailedMount</code>, all four were Running
four minutes after the proxy went <code>CONFIGURED</code>.</p>
<h2 id="6-clear-the-stale-backoff">6. Clear the stale backoff</h2>
<p>The PackageInstall stayed in its <code>ReconcileFailed</code> backoff with every pod
Running. Bumping an annotation forces a fresh reconcile:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$K</span><span class="p">=</span><span class="vm">@</span><span class="p">{</span><span class="n">Authorization</span><span class="p">=</span><span class="s2">&#34;Bearer </span><span class="p">$(</span><span class="nv">$lg</span><span class="p">.</span><span class="n">session_id</span><span class="p">)</span><span class="s2">&#34;</span><span class="p">;</span> <span class="s1">&#39;Content-Type&#39;</span><span class="p">=</span><span class="s1">&#39;application/merge-patch+json&#39;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="nv">$u</span><span class="p">=</span><span class="s2">&#34;https://</span><span class="nv">${gk}</span><span class="s2">:6443/apis/packaging.carvel.dev/v1alpha1/namespaces/package-installs/packageinstalls/telegraf&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">...</span>
</span></span><span class="line"><span class="cl"><span class="c"># force re-reconcile by bumping an annotation</span>
</span></span><span class="line"><span class="cl"><span class="nv">$patch</span><span class="p">=</span><span class="s1">&#39;{&#34;metadata&#34;:{&#34;annotations&#34;:{&#34;lab.kick&#34;:&#34;&#39;</span><span class="p">+(</span><span class="nb">Get-Random</span><span class="p">)+</span><span class="s1">&#39;&#34;}}}&#39;</span>
</span></span><span class="line"><span class="cl"><span class="nb">Invoke-RestMethod</span> <span class="n">-Method</span> <span class="n">Patch</span> <span class="n">-Uri</span> <span class="nv">$u</span> <span class="n">-Headers</span> <span class="nv">$K</span> <span class="n">-Body</span> <span class="nv">$patch</span> <span class="n">-SkipCertificateCheck</span> <span class="p">|</span> <span class="nb">Out-Null</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">kicked; polling...
</span></span><span class="line"><span class="cl">  [30s] ReconcileSucceeded=True Reconcile succeeded
</span></span></code></pre></div><h2 id="7-check-the-output-url">7. Check the output URL</h2>
<p>Telegraf still wasn&rsquo;t delivering. Its log, one error a minute:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">  2026-08-23T19:17:56Z I! [agent] Config: Interval:5m0s, Quiet:false, Hostname:&#34;telegraf-7cd76f96-wbthp&#34;, Flush Interval:1m0s
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">  2026-08-23T19:20:03Z E! [agent] Error writing to outputs.http: Post &#34;https://supervisor-management-proxy.default.svc.:10093/arc/tkgs/metric&#34;: dial tcp: lookup supervisor-management-proxy.default.svc. on 10.96.0.10:53: no such host
</span></span><span class="line"><span class="cl">  2026-08-23T19:20:56Z E! [agent] Error writing to outputs.http: Post &#34;https://supervisor-management-proxy.default.svc.:10093/arc/tkgs/metric&#34;: dial tcp: lookup supervisor-management-proxy.default.svc. on 10.96.0.10:53: no such host
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>Note the trailing dot and nothing after <code>svc</code>. The name is that headless
Service:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">--- guest &#39;default&#39; ns services ---
</span></span><span class="line"><span class="cl">  kubernetes: type=ClusterIP extName= clusterIP=10.96.0.1
</span></span><span class="line"><span class="cl">  supervisor: type=ClusterIP extName= clusterIP=None
</span></span><span class="line"><span class="cl">  supervisor-management-proxy: type=ClusterIP extName= clusterIP=None
</span></span><span class="line"><span class="cl">...
</span></span><span class="line"><span class="cl">--- endpoints of supervisor-management-proxy (default ns) ---
</span></span><span class="line"><span class="cl">  ips=10.26.20.21 ports=10093
</span></span></code></pre></div><p>The domain part follows the cluster&rsquo;s <code>serviceDomain</code>, which demo01
lacked; the package&rsquo;s own <code>domainName</code> was <code>cluster.local</code> all along and
made no difference. Adding the field later was refused:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">patch rejected:  { &#34;kind&#34;: &#34;Status&#34;, &#34;apiVersion&#34;: &#34;v1&#34;, &#34;metadata&#34;: {}, &#34;status&#34;: &#34;Failure&#34;, &#34;message&#34;: &#34;admission webhook \u0022capi.validating.tanzukubernetescluster.run.tanzu.vmware.com\u0022 denied the request: spec.clusterNetwork is immutable and cannot be upd
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>Two fixes, both applied:</p>
<ul>
<li><strong>Every new cluster:</strong> <code>serviceDomain: cluster.local</code> in the spec
(step 2). Every add-on that constructs a service URL is assuming it&rsquo;s
there.</li>
<li><strong>Live cluster:</strong> a CoreDNS <code>rewrite</code> rule in the guest&rsquo;s <code>coredns</code>
ConfigMap that maps the domainless name onto the real one. Ugly,
effective, documented in the cluster&rsquo;s notes; the <code>reload</code> plugin
picked it up:</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">--- Corefile now ---
</span></span><span class="line"><span class="cl">.:53 {
</span></span><span class="line"><span class="cl">    errors
</span></span><span class="line"><span class="cl">    health {
</span></span><span class="line"><span class="cl">       lameduck 5s
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">    ready
</span></span><span class="line"><span class="cl">    rewrite name supervisor-management-proxy.default.svc supervisor-management-proxy.default.svc.cluster.local
</span></span><span class="line"><span class="cl">    kubernetes cluster.local in-addr.arpa ip6.arpa {
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><h2 id="8-leave-the-proxys-values-alone">8. Leave the proxy&rsquo;s values alone</h2>
<p>The error moved on: the name resolves, and nothing answers:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">checked at (UTC): 19:35:38
</span></span><span class="line"><span class="cl">telegraf-26ppl: STILL FAILING (4 errors)
</span></span><span class="line"><span class="cl">  last: 2026-08-23T19:35:07Z E! [agent] Error writing to outputs.http: Post &#34;https://supervisor-management-proxy.default.svc.:10093/arc/tkgs/metric&#34;: context deadline exceeded (Client.Timeout exceeded while awaiting headers)
</span></span><span class="line"><span class="cl">...
</span></span></code></pre></div><p>In 9.1 terms a prerequisite was missing: the Metrics Aggregator, which
terminates the cluster&rsquo;s TLS in that design, didn&rsquo;t exist on f06 yet. I
tried pointing the proxy at Ops by hand, with a value from its
definition:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="w">        </span><span class="nt">metricsHTTPRemoteEndpoint</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="l">HTTP remote endpoint configuration for pushing workload metrics</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">          </span><span class="nt">properties</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">host</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">port</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="m">443</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">tlsClientSecretName</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">type</span><span class="p">:</span><span class="w"> </span><span class="l">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="l">Name of the secret which contains the TLS configuration required to push metrics to remote endpoint.</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nt">tlsClientSecretNamespace</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="l">...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">              </span><span class="nt">default</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;vmware-system-monitoring&#34;</span><span class="w">
</span></span></span></code></pre></div><p>A <code>PUT</code> on the install record (<code>PATCH</code> returns 404) reconciled:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-powershell" data-lang="powershell"><span class="line"><span class="cl"><span class="nv">$vals</span><span class="p">=</span><span class="s2">&#34;namespace: svc-supervisor-management-proxy-acqyd</span><span class="se">`n</span><span class="s2">metricsHTTPRemoteEndpoint:</span><span class="se">`n</span><span class="s2">  host: </span><span class="se">`&#34;</span><span class="s2">f06-flt-ops01.res.lab</span><span class="se">`&#34;`n</span><span class="s2">  port: 443</span><span class="se">`n</span><span class="s2">&#34;</span>
</span></span><span class="line"><span class="cl"><span class="nv">$b64</span><span class="p">=[</span><span class="no">Convert</span><span class="p">]::</span><span class="n">ToBase64String</span><span class="p">([</span><span class="no">Text.Encoding</span><span class="p">]::</span><span class="n">UTF8</span><span class="p">.</span><span class="py">GetBytes</span><span class="p">(</span><span class="nv">$vals</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="nv">$body</span><span class="p">=</span><span class="vm">@</span><span class="p">{</span> <span class="n">version</span><span class="p">=</span><span class="s1">&#39;0.4.1&#39;</span><span class="p">;</span> <span class="n">yaml_service_config</span><span class="p">=</span><span class="nv">$b64</span> <span class="p">}</span> <span class="p">|</span> <span class="nb">ConvertTo-Json</span>
</span></span><span class="line"><span class="cl"><span class="p">...</span>
</span></span><span class="line"><span class="cl">  <span class="nv">$r</span><span class="p">=</span><span class="nb">Invoke-WebRequest</span> <span class="n">-Method</span> <span class="n">Put</span> <span class="n">-Uri</span> <span class="s2">&#34;https://</span><span class="nv">$vc</span><span class="s2">/api/vcenter/namespace-management/clusters/domain-c9/supervisor-services/</span><span class="nv">$svc</span><span class="s2">&#34;</span> <span class="n">-Headers</span> <span class="nv">$H</span> <span class="n">-ContentType</span> <span class="s1">&#39;application/json&#39;</span> <span class="n">-Body</span> <span class="nv">$body</span> <span class="n">-SkipCertificateCheck</span> <span class="n">-TimeoutSec</span> <span class="mf">120</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PUT -&gt; 204
</span></span><span class="line"><span class="cl">  [30s] CONFIGURED
</span></span><span class="line"><span class="cl">  [60s] CONFIGURED
</span></span><span class="line"><span class="cl">  [90s] CONFIGURED
</span></span></code></pre></div><p>and Telegraf timed out as before. Broadcom&rsquo;s proxy page is blunt: &ldquo;No
additional configuration values for the Supervisor Management Proxy
service are required in this case.&rdquo; Set at install time, the value did
harm: with no <code>tlsClientSecretName</code> the package renders a nameless
<code>SecretImport</code>, and kapp refuses it:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">=== supervisor-management-proxy.vmware.com ===
</span></span><span class="line"><span class="cl">Reason: ReconcileFailed. Message: kapp: Error: Validation errors:
</span></span><span class="line"><span class="cl">- Expected &#39;metadata.name&#39; on resource &#39;secretimport/ (secretgen.carvel.dev/v1alpha1) namespace: svc-supervisor-management-proxy-htarg&#39; to be non-empty (stdin doc 5).
</span></span></code></pre></div><p>The next day the Supervisor was rebuilt onto the lab&rsquo;s planned address
range, and the catalog item installed the proxy and the Metrics
Aggregator with no values. Both went <code>CONFIGURED</code>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">---</span> <span class="n">ALL</span> <span class="n">LoadBalancer</span> <span class="n">VIPs</span> <span class="n">on</span> <span class="n">the</span> <span class="n">rebuilt</span> <span class="n">supervisor</span> <span class="o">---</span>
</span></span><span class="line"><span class="cl"><span class="o">...</span>
</span></span><span class="line"><span class="cl">  <span class="n">svc</span><span class="o">-</span><span class="n">metrics</span><span class="o">-</span><span class="n">aggregator</span><span class="o">-</span><span class="mi">5</span><span class="n">q0of</span>             <span class="n">workload</span><span class="o">-</span><span class="n">metrics</span><span class="o">-</span><span class="n">loadbalancer</span> <span class="mf">192.168</span><span class="o">.</span><span class="mf">144.7</span>
</span></span><span class="line"><span class="cl">  <span class="n">svc</span><span class="o">-</span><span class="n">supervisor</span><span class="o">-</span><span class="n">management</span><span class="o">-</span><span class="n">proxy</span><span class="o">-</span><span class="n">htarg</span>    <span class="n">workload</span><span class="o">-</span><span class="n">metrics</span><span class="o">-</span><span class="n">loadbalancer</span> <span class="mf">192.168</span><span class="o">.</span><span class="mf">144.6</span>
</span></span></code></pre></div><p>demo01 was recreated on that Supervisor with <code>serviceDomain</code> set. This
check read a Telegraf pod&rsquo;s last two minutes of log; the broken state had
logged an error a minute:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">=== observability packages ===
</span></span><span class="line"><span class="cl">  cert-manager   ReconcileSucceeded=True
</span></span><span class="line"><span class="cl">  contour        Reconciling=True
</span></span><span class="line"><span class="cl">  fluent-bit     ReconcileSucceeded=True
</span></span><span class="line"><span class="cl">  prometheus     ReconcileFailed=True
</span></span><span class="line"><span class="cl">  telegraf       ReconcileFailed=True
</span></span><span class="line"><span class="cl">=== telegraf delivery (last 2 min) ===
</span></span><span class="line"><span class="cl">  CLEAN - metrics flowing to mgmt proxy
</span></span></code></pre></div><p>&ldquo;Metrics flowing&rdquo; is my script&rsquo;s wording for no failed writes. And the
<code>telegraf</code> PackageInstall is the one kapp refused, so the clean Telegraf
wasn&rsquo;t mine.</p>
<h2 id="9-vcf-operations">9. VCF Operations</h2>
<p>Broadcom&rsquo;s consumption docs show the result in VCF Automation (Manage
and Govern → Kubernetes Management → Clusters) and in a Workload
Management Activated Cluster Summary tab in VCF Operations. The 9.0.1
write-up adds a switch on the VKS Cluster object, which the catalog item
still names at the end of each run:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">... | Ops manual step: set &#39;Pod And Container Monitoring Enabled&#39; on VKS Cluster demo01 in VCF Operations inventory; ...
</span></span></code></pre></div><p>This record has neither: the switch was never set, and my one capture
of a VKS Cluster object (vks-demo01, 1 September, in the <a href="/posts/vks-kubectl-vs-vcfa-all-apps/">two-ways
post</a>) counts 0 pods, deployments
and DaemonSets. The last hop I can show is Telegraf writing without
errors.</p>
<h2 id="clean-up-and-repeatability">Clean-up and repeatability</h2>
<ul>
<li><strong>One owner per add-on.</strong> Where add-on management installs Telegraf,
don&rsquo;t add your own PackageInstall; to run it yourself, set the cluster
label <code>addons.kubernetes.vmware.com/automated-monitoring</code> to <code>disabled</code>
first. The catalog item&rsquo;s answer to the ownership errors,
<code>--dangerous-override-ownership-of-existing-resources=true</code>, only hands
the objects to a second owner.</li>
<li><strong>Supervisor Service API on 9.1:</strong> service
<code>carvel_spec.version_spec.content</code>, version <code>carvel_spec.content</code>,
install <code>{supervisor_service, version}</code>, values
<code>PUT {version, yaml_service_config}</code>, removal
<code>PATCH …?action=deactivate</code> then <code>DELETE</code>. New definition bytes need a
new service record.</li>
<li><strong>A definition outlives the Supervisor.</strong> What you register lives on
vCenter&rsquo;s service record, so a rebuilt Supervisor installs the same
definition again. Replacing it means deactivating and deleting that
record first.</li>
<li><strong>Services break later.</strong> In September the proxy, the aggregator and
four other Supervisor Services went to <code>ERROR</code> when the platform
replaced their kapp service accounts; recreating the old ones fixed all
six within two minutes.</li>
</ul>
<h2 id="why-this-matters-outside-the-lab">Why this matters outside the lab</h2>
<p>On VCF 9.1, Kubernetes metrics in VCF Operations are meant to be a
platform setting, not a job per cluster: get three prerequisites right
and new clusters arrive monitored. The layer underneath still matters,
because every failure here had the same shape: a generic symptom
(<code>FailedMount</code>, a name that won&rsquo;t resolve, a timeout) caused by a
decision made somewhere else. For a customer that means a Supervisor
built for observability before any cluster asks, a cluster baseline with
the fields add-ons assume, and one owner per add-on: exactly what a
standard cluster class and a supervisor build checklist exist to
encode.</p>
<h2 id="rules-learned">Rules learned</h2>
<ul>
<li>On 9.1, start with the supported route: Ops collecting the Supervisor,
the Metrics Aggregator, the add-on repository. Then check for Telegraf
before installing it.</li>
<li>On VKS, the Telegraf package <strong>hard-depends on the Supervisor
Management Proxy</strong> whenever the metric proxy flag is set. <code>FailedMount</code>
on two <code>metrics-proxy-*</code> secrets is the tell.</li>
<li>The dependency heals retroactively: install the proxy, bump the
PackageInstall annotation, wait.</li>
<li>Set <code>serviceDomain</code> at cluster create. It&rsquo;s immutable, and every add-on
that builds a service URL will assume it.</li>
<li>A name that resolves isn&rsquo;t a metric delivered. Read the output log for
an error-free window, and leave the proxy&rsquo;s values alone.</li>
<li>When a package &ldquo;does nothing&rdquo;, describe the pod, not the package.</li>
</ul>
<h2 id="broadcom-documentation">Broadcom documentation</h2>
<ul>
<li><a href="https://techdocs.broadcom.com/us/en/vmware-cis/vcf/vcf-9-0-and-later/9-1/infrastructure-operations/connect-to-data-sources/vsphere-supervisor-monitoring/steps-to-monitor-vsphere-supervisor-clusters-and-resources/prerequisites-for-vsphere-supervisor-monitoring.html">Enabling Monitoring for VKS Clusters</a>:
the 9.1 route and its prerequisites.</li>
<li><a href="https://techdocs.broadcom.com/us/en/vmware-cis/vcf/vcf-9-0-and-later/9-1/infrastructure-operations/connect-to-data-sources/vsphere-supervisor-monitoring/steps-to-monitor-vsphere-supervisor-clusters-and-resources/enabling-the-vsphere-supervisor-collection.html">Enabling Monitoring for vSphere Supervisor</a>:
the Supervisor collection setting on the vCenter account.</li>
<li><a href="https://techdocs.broadcom.com/us/en/vmware-cis/vcf/vcf-consumption/latest/managing-vsphere-kuberenetes-service-clusters-and-workloads/operating-tkg-service-clusters/monitoring-vks-clusters-using-vcf-operations.html">Monitoring VKS Clusters Using VCF Operations</a>:
the automated add-ons, the metrics-aggregator service, and where
metrics appear.</li>
<li><a href="https://techdocs.broadcom.com/us/en/vmware-cis/vcf/vcf-consumption/latest/managing-vsphere-kuberenetes-service-clusters-and-workloads/operating-tkg-service-clusters/disable-automated-monitoring-on-vks-clusters-using-vcf-a.html">Disable Automated Monitoring on VKS Clusters Using VCF Automation</a>:
the per-cluster label, for clusters where you run Telegraf yourself.</li>
<li><a href="https://techdocs.broadcom.com/us/en/vmware-cis/vcf/vcf-service-administration-and-development/9-0/using-supervisor-services/install-the-supervisor-management-proxy-service.html">Using the Supervisor Management Proxy Service</a>:
what the proxy is for; no extra values for VCF Operations.</li>
</ul>
<p><em>Previously: <a href="/posts/telegraf-windows-2025/">Telegraf on Windows Server 2025</a>.
More in the <a href="/series/observability-on-vcf/">Observability on VCF</a> series.</em></p>
<hr>
<p><em>Lab environment; opinions my own.</em></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
