Cómo un Segundo Contenedor de Rancher Rompió mi Configuración de Kubernetes en WSL (y Cómo lo Arreglé)

·

4 min read

Cómo un Segundo Contenedor de Rancher Rompió mi Configuración de Kubernetes en WSL (y Cómo lo Arreglé)

Photo by Growtika on Unsplash

📌 Contexto:
Todo comenzó con un simple experimento: tenía un contenedor de Rancher corriendo sin problemas en WSL con los puertos 80 y 443 mapeados. Quise probar otra instancia de Rancher con puertos distintos (8080:80 y 4443:443). Lo inicié, lo detuve, lo eliminé... y boom 💥, kubectl dejó de funcionar por completo en mi WSL.

Lo que parecía un pequeño cambio terminó en una batalla de troubleshooting con errores como:

"Connection refused" (localhost:8080 no responde)
"x509: certificate signed by unknown authority" (error de TLS con localhost:443)
"The server has asked for the client to provide credentials" (autenticación rota)

Este artículo explica cómo se rompió mi configuración de Kubernetes en WSL, qué causó el problema, y cómo lo solucioné sin destruir mi entorno.


🚀 ¿Qué Ocurrió?

1️⃣ Tenía Rancher corriendo en un contenedor con los puertos 80 y 443:

docker run -d --restart=unless-stopped --name rancher -p 80:80 -p 443:443 --privileged rancher/rancher:latest

Todo funcionaba bien, kubectl en WSL se conectaba sin problemas al clúster K3s dentro de Rancher.

2️⃣ Ejecuté un segundo contenedor Rancher con puertos diferentes:

docker run -d --restart=unless-stopped --name rancher2 -p 8080:80 -p 4443:443 --privileged rancher/rancher:latest

Esto creó otro Rancher en la misma máquina, pero con diferentes puertos.

3️⃣ Detuve y eliminé el segundo Rancher (rancher2):

docker stop rancher2
docker rm rancher2

Aquí comenzó el problema.

4️⃣ Al volver a iniciar Rancher, kubectl dejó de funcionar en WSL:

kubectl get pods

Aparecieron errores como:

Unable to connect to the server: dial tcp 127.0.0.1:8080: connect: connection refused

Luego intenté apuntarlo a localhost:443, y obtuve:

tls: failed to verify certificate: x509: certificate signed by unknown authority

Y finalmente:

The server has asked for the client to provide credentials

🛑 ¿Qué había pasado?

  • Eliminé accidentalmente la configuración correcta de kubectl en WSL.

  • kubectl intentaba conectarse al API Server de Kubernetes en localhost:8080, que ya no existía.

  • Se rompió la autenticación porque WSL ya no tenía los certificados correctos de K3s dentro de Rancher.


🔧 Cómo Lo Arreglé

Después de algunas pruebas fallidas, la solución final fue:

1️⃣ Verificar Que Rancher Estaba Corriendo Correctamente

docker ps | grep rancher

Confirmé que el contenedor Rancher estaba corriendo en 80 y 443, pero que kubectl intentaba conectarse a localhost:8080.

2️⃣ Entrar al Contenedor Rancher y Verificar K3s

docker exec -it rancher /bin/bash

Dentro del contenedor, revisé el kubeconfig de K3s:

cat /var/lib/rancher/k3s/server/cred/admin.kubeconfig | grep -A 5 "users:"

Confirmé que K3s estaba autenticando con certificados, no con tokens.

3️⃣ Copiar los Certificados Correctos a WSL

Para que kubectl en WSL pudiera conectarse a K3s, copié los certificados desde el contenedor Rancher:

docker cp rancher:/var/lib/rancher/k3s/server/tls/client-admin.crt ~/.kube/client-admin.crt
docker cp rancher:/var/lib/rancher/k3s/server/tls/client-admin.key ~/.kube/client-admin.key
docker cp rancher:/var/lib/rancher/k3s/server/tls/server-ca.crt ~/.kube/server-ca.crt

Aseguré los permisos:

chmod 600 ~/.kube/client-admin.crt ~/.kube/client-admin.key ~/.kube/server-ca.crt

4️⃣ Encontrar la IP Correcta del API Server de K3s

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' rancher
172.17.0.2

Esta IP es la que kubectl debía usar.

5️⃣ Configurar kubectl en WSL con la IP Correcta

Edité el archivo de configuración:

vi ~/.kube/config

Modifiqué las rutas y la dirección del servidor:

apiVersion: v1
clusters:
- cluster:
    server: https://172.17.0.2:6443
    certificate-authority: /home/k8s/.kube/server-ca.crt
  name: k3s-cluster
contexts:
- context:
    cluster: k3s-cluster
    user: admin
  name: k3s-context
current-context: k3s-context
users:
- name: admin
  user:
    client-certificate: /home/k8s/.kube/client-admin.crt
    client-key: /home/k8s/.kube/client-admin.key

🔹 Nota: No usar ~/.kube/, sino rutas absolutas.


✅ Resultado Final

Después de estos cambios, kubectl en WSL volvió a funcionar 🎉:

kubectl get nodes
kubectl get pods -A
kubectl cluster-info

NAME      STATUS   ROLES                  AGE   VERSION
node-1    Ready    control-plane,master   24h   v1.31.1+k3s1

🎯 Lecciones Aprendidas

🔹 No lanzar múltiples instancias de Rancher en la misma máquina sin entender los efectos.
🔹 Nunca asumir que localhost:8080 seguirá funcionando después de eliminar un contenedor.
🔹 En WSL, kubectl necesita credenciales y la IP correcta del API Server de K3s dentro del contenedor.
🔹 Los errores de x509 casi siempre son un problema de certificados faltantes o mal configurados.

Si te pasa algo similar, no te desesperes. 🚀 Sigue los pasos de esta guía y tu kubectl volverá a funcionar sin problemas.


📌 ¿Te ha pasado algo similar? Cuéntame en los comentarios cómo lo solucionaste. 😃