En corto

Para quitar Rancher del todo de un clúster donde estuvo instalado (irreversible, con backup hecho):

1
2
3
4
kubectl create -f https://raw.githubusercontent.com/rancher/rancher-cleanup/main/deploy/rancher-cleanup.yaml
kubectl -n kube-system logs -l job-name=cleanup-job -f
kubectl create -f https://raw.githubusercontent.com/rancher/rancher-cleanup/main/deploy/verify.yaml
kubectl -n kube-system logs -l job-name=verify-job -f      # debe salir vacío

Para arreglar una sola cosa sin arrasar, lo que sigue.

Namespace en Terminating

cattle-system, cattle-fleet-system, cattle-impersonation-system, local, los cluster-fleet-*, o cualquier namespace que Rancher creó, se quedan en Terminating para siempre:

1
kubectl get ns cattle-system -o jsonpath='{.metadata.finalizers}{"\n"}{.spec.finalizers}{"\n"}{.status.conditions}{"\n"}'

Dos casos distintos:

  1. metadata.finalizers trae controller.cattle.io/namespace-auth (o cualquier *.cattle.io). Lo puso Rancher y solo Rancher lo quita; si Rancher ya no está, nadie lo hará. Quítalo tú:

    1
    
    kubectl patch ns cattle-system --type=merge -p '{"metadata":{"finalizers":[]}}'
    
  2. spec.finalizers trae kubernetes y status.conditions dice SomeResourcesRemain o DiscoveryFailed. El API server no borra el namespace porque dentro quedan recursos, casi siempre CRs de un API group cuyo servicio desapareció (un apiservice de Rancher). Antes de forzar, mira qué es:

    1
    2
    3
    
    kubectl api-resources --verbs=list --namespaced -o name \
      | xargs -n1 kubectl -n cattle-system get --ignore-not-found --show-kind 2>/dev/null
    kubectl get apiservice | grep -v True        # APIs muertas que rompen el discovery
    

    Borra el apiservice muerto o los CRs con finalizers, y el namespace cae solo. Forzar spec.finalizers a vacío es el último recurso y deja huérfanos:

    1
    2
    
    kubectl get ns cattle-system -o json | jq '.spec.finalizers=[]' \
      | kubectl replace --raw /api/v1/namespaces/cattle-system/finalize -f -
    

Clúster que no se puede borrar

Un clúster importado que ya no existe se queda en Removing en la UI, o kubectl delete no termina. Son dos objetos con finalizers, uno por API:

1
2
3
4
5
kubectl -n fleet-default get clusters.provisioning.cattle.io
kubectl -n fleet-default patch clusters.provisioning.cattle.io my-cluster --type=merge -p '{"metadata":{"finalizers":[]}}'

kubectl get clusters.management.cattle.io          # c-m-xxxxxxxx (v2.6+) o c-xxxxx
kubectl patch clusters.management.cattle.io c-m-xxxxxxxx --type=merge -p '{"metadata":{"finalizers":[]}}'

Después limpia el namespace cluster-fleet-default-<nombre>-<hash> y los clusters.fleet.cattle.io que queden en fleet-default.

El webhook que rechaza todo

rancher-webhook valida y muta recursos de *.cattle.io (y algunos de core, como namespaces y ServiceAccounts en clústeres gestionados). Si el pod no existe o está roto, cada cambio falla con:

1
Error from server (InternalError): Internal error occurred: failed calling webhook "rancher.cattle.io": … connect: connection refused

Exporta las configuraciones, bórralas, deja que el pod vuelva sano, y restáuralas:

1
2
3
4
5
6
kubectl get validatingwebhookconfiguration rancher.cattle.io -o yaml > vwc-rancher.yaml
kubectl get mutatingwebhookconfiguration rancher.cattle.io -o yaml > mwc-rancher.yaml
kubectl delete validatingwebhookconfiguration rancher.cattle.io
kubectl delete mutatingwebhookconfiguration rancher.cattle.io
# … arreglar rancher-webhook (kubectl -n cattle-system rollout restart deploy/rancher-webhook) …
kubectl apply -f vwc-rancher.yaml -f mwc-rancher.yaml

Si estás desinstalando, no las restaures: son lo primero que hay que quitar para que el resto del borrado avance.

Recuperar el acceso

Contraseña del admin perdida, o el usuario admin desactivado por error:

1
2
3
kubectl -n cattle-system exec -it deploy/rancher -- reset-password
# New password for default administrator (user-xxxxx): …
kubectl -n cattle-system exec -it deploy/rancher -- ensure-default-admin

ensure-default-admin reactiva el usuario y le devuelve el rol de administrador; reset-password solo cambia la contraseña.

Trampas

  • rancher-cleanup borra los objetos de los clústeres aguas abajo (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.
  • Backup antes: kubectl get -A -o yaml de los *.cattle.io que te importen, o el backup-operator de Rancher. Los finalizers se quitan en un segundo; lo que había detrás no vuelve.
  • kubectl delete ns --force --grace-period=0 no hace nada con un namespace en Terminating: el bloqueo está en los finalizers, no en el grace period.
  • Rancher vuelve a poner los finalizers mientras esté vivo: si estás limpiando un clúster que todavía está conectado a un Rancher, desconéctalo primero (borra el cattle-cluster-agent) o los patches se deshacen solos.
  • Los CRDs *.cattle.io sobreviven a una desinstalación por Helm; rancher-cleanup los quita, la desinstalación manual no.

Ver también