Clúster Edge K3s

Proyecto Final Integrador · Arquitectura de Computadoras 2

Mantenimiento predictivo con IA que sigue respondiendo cuando un nodo se apaga

Un clúster K3s de tres mini PC Intel clasifica lecturas de temperatura y vibración de un motor, sin depender de la nube. El proyecto mide qué pasa con el servicio cuando se desconecta un worker.

3 mini PC1 master + 2 workersNodePort 30080Datos sintéticos

Simulador laptop 192.168.1.50 SW :30080 master 192.168.1.26 plano de control worker1 192.168.1.27 pod edge-infer worker2 192.168.1.28 pod edge-infer
Montaje de las pruebas. El cliente solo usa las IP de los workers.

El problema

Una máquina que falla sin aviso detiene el trabajo, y la nube no siempre está al alcance

El mantenimiento predictivo busca detectar el desgaste de un motor antes de que se averíe. Para que sirva, la clasificación tiene que ocurrir rápido, cerca de la máquina y sin interrupciones.

La avería llega sin aviso

Sin una lectura continua de temperatura y vibración, el desgaste solo se nota cuando el motor ya falló.

Depender de la nube

Enviar cada lectura a un servicio remoto añade latencia y deja de funcionar si se pierde la conexión a Internet.

Un solo equipo es un riesgo

Si la IA corre en una sola máquina y esa máquina se cae, se pierde también la vigilancia del motor.

Objetivo del proyectoComprobar que un clúster pequeño de tres mini PC ejecuta IA de mantenimiento predictivo en el borde y sigue respondiendo cuando uno de sus nodos se desconecta.

OpciónDónde corre la IASi se pierde InternetSi cae un equipo
Servicio en la nubeServidores remotosDeja de clasificarDepende del proveedor
Un solo equipo localCerca de la máquinaSigue funcionandoSe pierde el servicio
Clúster edge con K3sCerca de la máquina, en 3 mini PCSigue funcionando: 30 lecturas con el router desconectadoEl otro worker sigue respondiendo

La solución

Clasifica el estado de un motor en tres categorías

Un servicio de inferencia HTTP recibe lecturas simuladas de temperatura y vibración y responde con el estado probable del motor. Corre dentro del clúster, cerca de la máquina, para reducir latencia y no depender de Internet.

normal

Operación estable

Temperatura y vibración dentro del rango esperado. No requiere acción.

desgaste

Degradación visible

Las señales empiezan a desviarse. Conviene programar una revisión.

falla_inminente

Riesgo de avería

Las señales indican una falla cercana. Requiere atención inmediata.

Los datos son sintéticos. Las métricas del modelo describen su desempeño sobre datos simulados, no sobre una máquina real. Las latencias de los modelos se midieron en la computadora donde se entrenó, no en los mini PC.

Arquitectura

Del sensor simulado a la respuesta, dentro del clúster

Cada petición recorre el mismo camino. Si un worker falla, el cliente reintenta contra el otro.

  1. Simulador

    simulator.py genera lecturas de temperatura y vibración y las envía por HTTP.

  2. NodePort

    El servicio de Kubernetes expone el puerto 30080 en cada worker.

  3. Pod de inferencia

    La imagen Docker edge-infer carga el modelo y clasifica la lectura.

  4. Respuesta

    El cliente recibe normal, desgaste o falla_inminente.

K3s

Kubernetes liviano: 1 master y 2 workers sobre Ubuntu Server 24.04 en mini PC Intel Atom x5-Z8350 de 64 bits.

Anti-afinidad de pods

Los dos pods se reparten, uno por worker. Si un worker cae, el pod de reemplazo queda en espera por la regla estricta.

Prueba de caída

failover_test.py envía peticiones durante 150 s, desconectando un worker a los 30 s, y calcula éxito, latencia y ventanas sin servicio.

Simulación

Provócale una falla al clúster y míralo responder

Cada punto es una petición del simulador de sensores. Sigue el recorrido guiado o usa los controles para apagar nodos, cortar Internet y comparar las políticas del servicio.

Paso 1 de 7

Todo funciona

t = 0:00en pausa
0enviadas
0respondidas
0perdidas
–éxito
–mediana
–p95

Motor (valores ilustrativos)

Temperatura
–
Vibración
–
Última respuestasin datos
Alertas de falla perdidas0

Qué está pasando

    Dónde corre la IA
    Política del servicio
    Estado del motor
    Velocidad
    Acciones

    Es una simulación didáctica. Los comportamientos vienen de las pruebas del proyecto: unos 40 s hasta que Kubernetes retira un nodo caído, 3 intentos por petición, 0,8 s de espera por intento fallido, latencia normal cercana a 28 ms (mediana) y pod de reemplazo en Pending. Los valores del motor, la nube y la reincorporación de un nodo son ilustrativos y no se midieron.

    Resultados

    Con la política Local no se perdió ninguna petición

    El equipo desconectó un worker a los 30 s de corridas de 150 s y comparó dos políticas del servicio. Tres corridas por política, alternando el worker desconectado.

    Peticiones sin respuesta por corrida

    Serie A · Clusterpolítica por defecto
    11–13
    Serie B · LocalexternalTrafficPolicy
    0

    Con Cluster, kube-proxy puede enviar una petición al pod del worker caído hasta que Kubernetes retira ese endpoint, unos 40 s por defecto. Con Local, cada worker responde solo con su propio pod.

    ≈362respuestas en 150 s con Local, frente a ≈267–280 con Cluster
    76 sque el pod de reemplazo quedó en Pending con el worker caído
    ~580 MBde memoria usada por worker, de 1 571 MB. El master usó entre 982 y 1 003 MB

    Prueba inicial con la política por defecto

    CorridaWorker desconectadoPeticionesÉxito finalPrimer intentoMediana / p95Mayor ventana sin servicio
    1worker1118106 (89,83 %)90 (76,27 %)28,0 / 833,6 ms2,6 s
    2worker2118106 (89,83 %)92 (77,97 %)28,8 / 843,9 ms5,1 s

    Las cifras de las series A y B se leyeron de las gráficas y son aproximadas. Se pueden recalcular con python analizar_csv.py archivo.csv --cut-at 30. Con el cable al router desconectado, el simulador completó 30 lecturas: el servicio funciona sin Internet.

    Alcance

    Qué no se midió

    El repositorio separa lo medido de lo que queda como referencia.

    Datos simulados

    Ninguna métrica proviene de un motor real. El objetivo es la infraestructura, no el diagnóstico industrial.

    Sondas y tolerancias de 15 s

    Las mejoras de k8s/ con sondas de salud y tolerancias aún no se midieron en el clúster.

    Prometheus y Grafana

    No se desplegaron en los mini PC para no sobrecargar su RAM ni su CPU. Quedan como referencia en monitoring/.

    Pocas repeticiones

    Hay una sola corrida inicial por condición y tres por serie, así que no se estima la variación entre repeticiones.

    Conclusión

    Lo que aprendimos del montaje

    Las tres conclusiones salen de las pruebas hechas en los mini PC reales.

    0 perdidas

    La política de tráfico importa

    Con externalTrafficPolicy: Local no se perdió ninguna petición al desconectar un worker. Con Cluster se perdieron 11 a 13 por corrida.

    Sin Internet

    El borde funciona aislado

    Con el cable al router desconectado, el simulador completó 30 lecturas. La clasificación no depende de la nube.

    ~580 MB

    Cabe en equipos modestos

    Cada worker usó cerca de 580 MB de sus 1 571 MB de memoria, con el servicio bajo carga.

    Equipo

    Quiénes lo hicieron

    Universidad Mariano Gálvez de Guatemala · Proyecto Final Integrador de Arquitectura de Computadoras 2.

    Probarlo

    Funciona en una laptop, sin los mini PC

    El repositorio incluye el código, los manifiestos de K3s y los pasos para reproducir el montaje completo. Necesitas Python 3.11 o superior para la prueba local.

    terminal
    git clone https://github.com/Paxmer/edge-cluster-k3s
    cd edge-cluster-k3s
    python3 -m venv .venv && source .venv/bin/activate
    pip install -r requirements.txt
    python train.py
    python -m unittest discover -s tests -v