<?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>Rancher on inetshell</title><link>https://inet.sh/es/tags/rancher/</link><description>Recent content in Rancher on inetshell</description><generator>Hugo</generator><language>es</language><lastBuildDate>Sat, 26 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://inet.sh/es/tags/rancher/index.xml" rel="self" type="application/rss+xml"/><item><title>Quitar Rancher de un clúster: cattle-system en Terminating, clústeres que no se dejan borrar, el webhook que bloquea todo y recuperar el admin</title><link>https://inet.sh/es/posts/kubernetes/rancher-limpiar-cattle-system-namespaces-terminating/</link><pubDate>Sat, 26 Sep 2026 00:00:00 +0000</pubDate><guid>https://inet.sh/es/posts/kubernetes/rancher-limpiar-cattle-system-namespaces-terminating/</guid><description>Después de desinstalar Rancher (o de que se rompa), cattle-system y cattle-fleet-system se quedan en Terminating por el finalizer controller.cattle.io/namespace-auth, los objetos Cluster no se dejan borrar, y los webhooks rancher.cattle.io rechazan cualquier cambio porque el pod que los atendía ya no existe. El job oficial rancher-cleanup para limpiar todo de una vez, la cirugía manual cuando solo quieres arreglar una cosa, y reset-password / ensure-default-admin cuando el problema es que no puedes entrar.</description><content:encoded><![CDATA[<h2 id="en-corto">En corto</h2>
<p>Para <strong>quitar Rancher del todo</strong> de un clúster donde estuvo instalado (irreversible, con backup hecho):</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl create -f https://raw.githubusercontent.com/rancher/rancher-cleanup/main/deploy/rancher-cleanup.yaml
</span></span><span class="line"><span class="cl">kubectl -n kube-system logs -l job-name<span class="o">=</span>cleanup-job -f
</span></span><span class="line"><span class="cl">kubectl create -f https://raw.githubusercontent.com/rancher/rancher-cleanup/main/deploy/verify.yaml
</span></span><span class="line"><span class="cl">kubectl -n kube-system logs -l job-name<span class="o">=</span>verify-job -f      <span class="c1"># debe salir vacío</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Para <strong>arreglar una sola cosa</strong> sin arrasar, lo que sigue.</p>
<h2 id="namespace-en-terminating">Namespace en Terminating</h2>
<p><code>cattle-system</code>, <code>cattle-fleet-system</code>, <code>cattle-impersonation-system</code>, <code>local</code>, los <code>cluster-fleet-*</code>, o cualquier namespace que Rancher creó, se quedan en <code>Terminating</code> para siempre:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl get ns cattle-system -o <span class="nv">jsonpath</span><span class="o">=</span><span class="s1">&#39;{.metadata.finalizers}{&#34;\n&#34;}{.spec.finalizers}{&#34;\n&#34;}{.status.conditions}{&#34;\n&#34;}&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Dos casos distintos:</p>
<ol>
<li>
<p><strong><code>metadata.finalizers</code> trae <code>controller.cattle.io/namespace-auth</code></strong> (o cualquier <code>*.cattle.io</code>). Lo puso Rancher y solo Rancher lo quita; si Rancher ya no está, nadie lo hará. Quítalo tú:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl patch ns cattle-system --type<span class="o">=</span>merge -p <span class="s1">&#39;{&#34;metadata&#34;:{&#34;finalizers&#34;:[]}}&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div></li>
<li>
<p><strong><code>spec.finalizers</code> trae <code>kubernetes</code> y <code>status.conditions</code> dice <code>SomeResourcesRemain</code> o <code>DiscoveryFailed</code></strong>. El API server no borra el namespace porque dentro quedan recursos, casi siempre CRs de un API group cuyo servicio desapareció (un <code>apiservice</code> de Rancher). Antes de forzar, mira qué es:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl api-resources --verbs<span class="o">=</span>list --namespaced -o name <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> xargs -n1 kubectl -n cattle-system get --ignore-not-found --show-kind 2&gt;/dev/null
</span></span><span class="line"><span class="cl">kubectl get apiservice <span class="p">|</span> grep -v True        <span class="c1"># APIs muertas que rompen el discovery</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Borra el <code>apiservice</code> muerto o los CRs con finalizers, y el namespace cae solo. Forzar <code>spec.finalizers</code> a vacío es el último recurso y deja huérfanos:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl get ns cattle-system -o json <span class="p">|</span> jq <span class="s1">&#39;.spec.finalizers=[]&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span>  <span class="p">|</span> kubectl replace --raw /api/v1/namespaces/cattle-system/finalize -f -
</span></span></code></pre></td></tr></table>
</div>
</div></li>
</ol>
<h2 id="clúster-que-no-se-puede-borrar">Clúster que no se puede borrar</h2>
<p>Un clúster importado que ya no existe se queda en <em>Removing</em> en la UI, o <code>kubectl delete</code> no termina. Son dos objetos con finalizers, uno por API:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl -n fleet-default get clusters.provisioning.cattle.io
</span></span><span class="line"><span class="cl">kubectl -n fleet-default patch clusters.provisioning.cattle.io my-cluster --type<span class="o">=</span>merge -p <span class="s1">&#39;{&#34;metadata&#34;:{&#34;finalizers&#34;:[]}}&#39;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">kubectl get clusters.management.cattle.io          <span class="c1"># c-m-xxxxxxxx (v2.6+) o c-xxxxx</span>
</span></span><span class="line"><span class="cl">kubectl patch clusters.management.cattle.io c-m-xxxxxxxx --type<span class="o">=</span>merge -p <span class="s1">&#39;{&#34;metadata&#34;:{&#34;finalizers&#34;:[]}}&#39;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>Después limpia el namespace <code>cluster-fleet-default-&lt;nombre&gt;-&lt;hash&gt;</code> y los <code>clusters.fleet.cattle.io</code> que queden en <code>fleet-default</code>.</p>
<h2 id="el-webhook-que-rechaza-todo">El webhook que rechaza todo</h2>
<p><code>rancher-webhook</code> valida y muta recursos de <code>*.cattle.io</code> (y algunos de core, como namespaces y ServiceAccounts en clústeres gestionados). Si el pod no existe o está roto, cada cambio falla con:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Error from server (InternalError): Internal error occurred: failed calling webhook &#34;rancher.cattle.io&#34;: … connect: connection refused
</span></span></code></pre></td></tr></table>
</div>
</div><p>Exporta las configuraciones, bórralas, deja que el pod vuelva sano, y restáuralas:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl get validatingwebhookconfiguration rancher.cattle.io -o yaml &gt; vwc-rancher.yaml
</span></span><span class="line"><span class="cl">kubectl get mutatingwebhookconfiguration rancher.cattle.io -o yaml &gt; mwc-rancher.yaml
</span></span><span class="line"><span class="cl">kubectl delete validatingwebhookconfiguration rancher.cattle.io
</span></span><span class="line"><span class="cl">kubectl delete mutatingwebhookconfiguration rancher.cattle.io
</span></span><span class="line"><span class="cl"><span class="c1"># … arreglar rancher-webhook (kubectl -n cattle-system rollout restart deploy/rancher-webhook) …</span>
</span></span><span class="line"><span class="cl">kubectl apply -f vwc-rancher.yaml -f mwc-rancher.yaml
</span></span></code></pre></td></tr></table>
</div>
</div><p>Si estás desinstalando, no las restaures: son lo primero que hay que quitar para que el resto del borrado avance.</p>
<h2 id="recuperar-el-acceso">Recuperar el acceso</h2>
<p>Contraseña del admin perdida, o el usuario admin desactivado por error:</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-shell" data-lang="shell"><span class="line"><span class="cl">kubectl -n cattle-system <span class="nb">exec</span> -it deploy/rancher -- reset-password
</span></span><span class="line"><span class="cl"><span class="c1"># New password for default administrator (user-xxxxx): …</span>
</span></span><span class="line"><span class="cl">kubectl -n cattle-system <span class="nb">exec</span> -it deploy/rancher -- ensure-default-admin
</span></span></code></pre></td></tr></table>
</div>
</div><p><code>ensure-default-admin</code> reactiva el usuario y le devuelve el rol de administrador; <code>reset-password</code> solo cambia la contraseña.</p>
<h2 id="trampas">Trampas</h2>
<ul>
<li><strong><code>rancher-cleanup</code> borra los objetos de los clústeres aguas abajo</strong> (los clústeres siguen funcionando, pero dejan de estar registrados) y todo lo que Rancher instaló: monitoring, logging, Gatekeeper. Longhorn se queda. No lo lances en el clúster de Rancher que quieres conservar.</li>
<li><strong>Backup antes</strong>: <code>kubectl get -A -o yaml</code> de los <code>*.cattle.io</code> que te importen, o el backup-operator de Rancher. Los finalizers se quitan en un segundo; lo que había detrás no vuelve.</li>
<li><strong><code>kubectl delete ns --force --grace-period=0</code> no hace nada</strong> con un namespace en Terminating: el bloqueo está en los finalizers, no en el grace period.</li>
<li><strong>Rancher vuelve a poner los finalizers</strong> mientras esté vivo: si estás limpiando un clúster que todavía está conectado a un Rancher, desconéctalo primero (borra el <code>cattle-cluster-agent</code>) o los patches se deshacen solos.</li>
<li><strong>Los CRDs <code>*.cattle.io</code> sobreviven</strong> a una desinstalación por Helm; <code>rancher-cleanup</code> los quita, la desinstalación manual no.</li>
</ul>
<h2 id="ver-también">Ver también</h2>
<ul>
<li><a href="/es/posts/k3s/cluster-reset-perdida-de-quorum/">k3s: reset del clúster tras perder el quórum</a> — la otra cirugía de clúster que conviene tener a mano.</li>
<li><a href="https://github.com/rancher/rancher-cleanup">rancher-cleanup</a> y <a href="https://ranchermanager.docs.rancher.com/faq/technical-items">Technical FAQ de Rancher</a>.</li>
</ul>
]]></content:encoded></item></channel></rss>