# Kubernetes

## Para qué sirve

Si tus aplicaciones corren en Kubernetes, no se usa el instalador de una línea de los servidores: se instala un **chart de Helm** que pone un agente en cada nodo del cluster. El agente junta las métricas del nodo, los logs de los contenedores y recibe los datos de tus aplicaciones. También puede activar el monitoreo en detalle de aplicaciones con una anotación en el pod, sin tocar su código.

En **Infraestructura** aparece una pestaña **Kubernetes** con cada cluster: cantidad de nodos, pods en marcha y reinicios.

## Cuándo usarlo

Solo si tenés un cluster de Kubernetes. Si tus aplicaciones corren en servidores comunes, usá [Linux](https://lymen.app/docs/instalacion/agente-linux/) o [Windows](https://lymen.app/docs/instalacion/agente-windows/).

> **Qué se probó.** El chart se probó en un cluster de un solo nodo creado con kind, con una ingesta de prueba. **No se probó en un cluster de producción ni en servicios gestionados** (EKS, AKS, GKE). Hacé la primera instalación en un cluster de pruebas.

## Qué mide hoy (y qué no)

| Sí | No (todavía) |
|---|---|
| Métricas del nodo (CPU, memoria, disco, red) | Métricas por pod o por contenedor |
| Logs de los contenedores | Eventos del cluster (reinicios, desalojos) |
| Datos de las aplicaciones que mandan al agente de su nodo | Reglas de Privacidad configurables desde el portal para el agente del nodo |
| Monitoreo en detalle por anotación (Java, Node.js, Python, .NET) | |

Los datos del pod (nombre, namespace, cluster) salen del nombre del archivo de log y de la instrumentación automática.

## Requisitos

- Helm y acceso al cluster con `kubectl`.
- Un **token** de tu cuenta de Lymen, guardado como Secret de Kubernetes con la clave `token`.
- La dirección de ingesta de tu cuenta (`https://<tu-cuenta>-ingesta.lymen.app`).
- Un namespace con política de seguridad **`privileged`**, porque el agente lee el disco del nodo (logs y métricas del host).

## Paso a paso

```sh
kubectl create ns lymen
kubectl label ns lymen pod-security.kubernetes.io/enforce=privileged
kubectl -n lymen create secret generic lymen-token --from-literal=token=<tu-token>

helm dependency build chart/lymen
helm install lymen chart/lymen -n lymen --wait \
  --set ingesta.url=https://<tu-cuenta>-ingesta.lymen.app \
  --set ingesta.existingSecret=lymen-token \
  --set cluster.nombre=produccion
```

El chart lo entrega Lymen.

Para medir una aplicación en detalle, anotá su pod y reinicialo. Con `<lenguaje>` igual a `java`, `nodejs`, `python` o `dotnet`:

```yaml
metadata:
  annotations:
    instrumentation.opentelemetry.io/inject-<lenguaje>: "lymen/lymen"
```

(La anotación es el estándar del operador que usa el chart: el valor es `namespace/nombre`.)

## Valores del chart

| Valor | Para qué sirve | Por defecto | Impacto de cambiarlo |
|---|---|---|---|
| `ingesta.url` | Dirección de ingesta de tu cuenta. | — (obligatorio) | Si es incorrecta, no llega nada. |
| `ingesta.existingSecret` | Secret ya existente con la clave `token`. | — | **Seguridad.** Es lo recomendado. |
| `ingesta.token` | Token directo; el chart crea el Secret. | — | **Seguridad.** Queda guardado en el historial de Helm: preferí `existingSecret`. |
| `cluster.nombre` | Nombre del cluster en el portal. | — | Es lo que ves en la pestaña Kubernetes y en los filtros. |
| `cluster.entorno` | Entorno de los datos. | `produccion` | Etiqueta tus datos. |
| `agente.resources` | Recursos por nodo. | Pide 50m de CPU y 128Mi; tope 500m y 384Mi | Bajar el tope puede cortar el agente en nodos con mucho log. |
| `agente.limiteMemoriaMiB` | Límite blando de memoria del agente. | 256 | Tiene que ser menor que el tope del contenedor. |
| `agente.tolerations` | En qué nodos corre. | Todos | Restringirlo deja nodos sin medir. |
| `agente.recibirAplicaciones.servicioLocal` | Cada app entrega al agente de **su propio nodo**. | Sí | — |
| `agente.recibirAplicaciones.hostPort` | Además abre el puerto en el nodo. | No | Pide una política de seguridad menos estricta. |
| `agente.metricasNodo.enabled` / `.intervalo` | Métricas del nodo y cada cuánto. | Sí / 30 s | Un intervalo más corto guarda más datos (costo). |
| `agente.logs.enabled` | Lee los logs de los contenedores. | Sí | **Privacidad y costo.** Apagarlo evita guardar logs; encenderlo puede traer datos personales a los logs de las apps. |
| `agente.logs.excluirNamespaces` | Namespaces que no se leen. | `kube-system`, `kube-public`, `kube-node-lease` | Sacar uno de la lista suma ruido; sumar los que no te interesen reduce costo. |
| `operador.enabled` | Instala el operador que instrumenta aplicaciones. | Sí | Apagado, la anotación no hace nada. |
| `instrumentacion.muestreo` | Qué parte de las trazas de la instrumentación automática se guarda. | `"1"` (todo) | Menos trazas = menos costo, pero menos visibilidad. |
| `gateway.administracion.enabled` | Enlace de administración con el portal. | Sí | Apagado, el portal no ve el estado de los agentes del cluster. |

## Cómo se actualiza y se desinstala

Con `helm upgrade lymen chart/lymen -n lymen …` (los certificados del operador se conservan entre actualizaciones). Con `helm uninstall lymen -n lymen`. Algunos recursos del operador se van recién al quitar sus definiciones del cluster.

## Problemas comunes

| Síntoma | Qué hacer |
|---|---|
| Los pods del agente no arrancan | Revisá que el namespace tenga la política `privileged`. |
| No veo métricas por pod | Hoy no existen. Solo hay métricas del nodo. |
| Instalé y no llega nada | Revisá `ingesta.url`, que el Secret tenga la clave `token` y que los nodos lleguen a esa dirección. |
| La anotación no instrumenta | Reiniciá el pod después de anotarlo y confirmá que el operador esté instalado. |
