Despliega OpenTelemetry Collector en Kubernetes: Observabilidad Total para tus Aplicaciones
Hoy vamos a desplegar OpenTelemetry Collector en tu clúster de Kubernetes sobre VPS. Si no tienes muy claro qué es OpenTelemetry, piensa en ello como el estándar moderno para obtener métricas, logs y trazas de tus aplicaciones, permitiendo que detectes cuellos de botella, errores y problemas de rendimiento mucho más fácilmente. Prepárate porque con este despliegue, tu infraestructura casera puede igualar a la de los grandes nombres, y con un toque pro: ¡tú tienes el control!
¿Para qué sirve OpenTelemetry Collector?
- Reúne métricas, logs y trazas desde todas tus apps y servicios en Kubernetes.
- Agrega, transforma y exporta los datos a sistemas como Prometheus, Jaeger o Elastic.
- Centraliza la observabilidad sin necesitar agentes específicos para cada lenguaje.
- Facilita el diagnóstico de problemas de rendimiento y permite analizar el comportamiento de apps distribuidas ¡incluyendo microservicios!
Arquitectura: ¿qué vamos a desplegar?
Usaremos los siguientes componentes:
- Un Deployment de OpenTelemetry Collector configurado como gateway (recibe datos de los agentes sidecar o instrumentados en tus apps y los exporta a Prometheus y Jaeger).
- Un Service para hacerlo accesible en el clúster.
- Un ConfigMap con la configuración de pipelines para métricas y trazas.
💡 Puedes adaptar la configuración para enviar los datos a tu stack favorito, pero en este ejemplo cubrimos Prometheus y Jaeger como destinos estándar.
Ficheros YAML necesarios
Aquí tienes todo lo necesario para ponerlo a funcionar. Puedes adaptar los nombres de namespace y endpoints según tu entorno.
1. ConfigMap para la configuración del Collector
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-collector-config
namespace: observabilidad
data:
otel-collector-config.yaml: |
receivers:
otlp:
protocols:
grpc:
http:
prometheus:
config:
scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
processors:
batch:
memory_limiter:
check_interval: 1s
limit_mib: 400
spike_limit_mib: 60
exporters:
jaeger:
endpoint: "jaeger-collector.observabilidad.svc.cluster.local:14250"
tls:
insecure: true
prometheus:
endpoint: "0.0.0.0:8888"
namespace: "otel-collector"
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, memory_limiter]
exporters: [jaeger]
metrics:
receivers: [otlp, prometheus]
processors: [batch]
exporters: [prometheus]
2. Deployment para OpenTelemetry Collector
apiVersion: apps/v1
kind: Deployment
metadata:
name: otel-collector
namespace: observabilidad
spec:
replicas: 1
selector:
matchLabels:
app: otel-collector
template:
metadata:
labels:
app: otel-collector
spec:
containers:
- name: otel-collector
image: otel/opentelemetry-collector:0.96.0
args:
- "--config=/conf/otel-collector-config.yaml"
ports:
- containerPort: 4317 # OTLP gRPC
- containerPort: 4318 # OTLP HTTP
- containerPort: 8888 # Prometheus exporter
volumeMounts:
- name: otel-config
mountPath: /conf
volumes:
- name: otel-config
configMap:
name: otel-collector-config
3. Service para exponer los endpoints del Collector
apiVersion: v1
kind: Service
metadata:
name: otel-collector
namespace: observabilidad
spec:
selector:
app: otel-collector
ports:
- name: otlp-grpc
protocol: TCP
port: 4317
targetPort: 4317
- name: otlp-http
protocol: TCP
port: 4318
targetPort: 4318
- name: prometheus
protocol: TCP
port: 8888
targetPort: 8888
4. (Opcional) Namespace de trabajo
Recomiendo tener los recursos en el namespace observabilidad:
apiVersion: v1
kind: Namespace
metadata:
name: observabilidad
¿Cómo probarlo?
- Despliega Jaeger (puedes usar
jaeger-all-in-one) en el mismo namespace. - Apunta los SDK OTLP de tus apps o sidecars (instrumentación automática) a
otel-collector.observabilidad.svc.cluster.local. - Prometheus puede recoger métricas en el endpoint
http://otel-collector.observabilidad.svc.cluster.local:8888/metrics. - Lanza alguna petición a tu app y observa las trazas en la UI de Jaeger y las métricas en Prometheus.
Consejos Extra y Troubleshooting
- Depuración básica: Si no ves trazas en Jaeger, mira los logs del pod del collector con
kubectl logspara pistas de errores de configuración o conexión. - Rendimiento: Si procesas grandes volúmenes, escala el deployment y ajusta los límites en
memory_limiter. - Personalización: Prueba a exportar datos también a Elastic, Loki, Tempo… ¡OpenTelemetry collector es muy versátil!
- Utiliza OpenTelemetry Operator para despliegues más complejos o automáticos en todo el clúster.
Como ves, la observabilidad de nueva generación ya no es exclusiva de grandes empresas. ¡Exprímela en tu Kubernetes y lleva tus despliegues caseros a otro nivel!
