<?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>Supervisor-Services on The Nested Lab</title>
    <link>https://thenestedlab.com/tags/supervisor-services/</link>
    <description>Recent content in Supervisor-Services 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/supervisor-services/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>The VKS Telegraf package mounts two secrets that only the Supervisor Management Proxy service propagates into guest clusters. Without it every pod sits in FailedMount forever and nothing says why. Install the proxy and the chain heals itself — then a second trap: a domainless output URL on any cluster created without serviceDomain.</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 documentation
doesn&rsquo;t mention.</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>. 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">MountVolume.SetUp failed for volume &#34;metrics-proxy-tls-config&#34;  : secret not found
</span></span><span class="line"><span class="cl">MountVolume.SetUp failed for volume &#34;metrics-proxy-http-config&#34; : secret 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-dependency">The dependency</h2>
<p>Those two secrets are <strong>published by the Supervisor Management Proxy</strong>,
a Supervisor Service you install on the supervisor, not in the guest
cluster. It exports the proxy&rsquo;s TLS and HTTP config into every guest
cluster&rsquo;s <code>kube-system</code> as a <code>SecretExport</code>; a matching <code>SecretImport</code>
in <code>tanzu-system-telegraf</code> pulls them across. No proxy on the supervisor,
no export, no secrets, no pods.</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 (Supervisor Service)
</span></span><span class="line"><span class="cl">  └─ SecretExport  (guest kube-system)
</span></span><span class="line"><span class="cl">       └─ SecretImport  (guest tanzu-system-telegraf)
</span></span><span class="line"><span class="cl">            └─ metrics-proxy-tls-config + metrics-proxy-http-config
</span></span><span class="line"><span class="cl">                 └─ Telegraf pods mount them → Running
</span></span></code></pre></div><p>The fix is one install on the supervisor, and it&rsquo;s retroactive: once the
proxy exists the exports appear, the imports follow, and pods that had
been failing to mount for a day come up on their own. The only nudge
needed was an annotation bump on the PackageInstall to clear the stale
<code>ReconcileFailed</code> backoff.</p>
<h2 id="the-second-trap-a-url-with-no-domain">The second trap: a URL with no domain</h2>
<p>With pods running, Telegraf still wasn&rsquo;t delivering. Its output URL had
come out as:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">https://supervisor-management-proxy.default.svc.:10093
</span></span></code></pre></div><p>Note the trailing dot and nothing after <code>svc</code>. The package builds that URL
from the cluster&rsquo;s service domain, and this cluster had been created
without <code>clusterNetwork.serviceDomain</code> — so the domain was empty. That
field is immutable after create.</p>
<p>Two fixes, both applied:</p>
<ul>
<li><strong>Live cluster:</strong> a CoreDNS <code>rewrite</code> rule that maps the domainless name
onto the real one. Ugly, effective, documented in the cluster&rsquo;s notes.</li>
<li><strong>Every new cluster:</strong> <code>serviceDomain: cluster.local</code> in the spec. Every
add-on that constructs a service URL is assuming it&rsquo;s there.</li>
</ul>
<h2 id="why-this-matters-outside-the-lab">Why this matters outside the lab</h2>
<p>Both traps have the same shape: a platform component that fails with a
generic symptom (<code>FailedMount</code>, a name that won&rsquo;t resolve) whose cause is
a decision made somewhere else — a service not installed on the
supervisor, a field left blank at cluster create. For a customer that
means two things. Metrics from Kubernetes workloads into VCF Operations
are a <em>platform</em> feature, so the supervisor has to be built for it, not
just the cluster. And cluster specs need a baseline that includes the
fields add-ons assume, because the immutable ones can&rsquo;t be fixed later.
This is exactly the kind of thing a standard cluster class and a
supervisor build checklist exist to encode.</p>
<h2 id="rules-learned">Rules learned</h2>
<ul>
<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>When a package &ldquo;does nothing&rdquo;, describe the pod, not the package.</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>
