Updated: February 2026 | Reading time: 16 min
Introduction
Kubernetes changed how we deploy software. It also broke how we collect logs. Pods are ephemeral. Containers write to stdout and stderr, not to files on disk you can tail. A node might run 50 pods today and 12 tomorrow. When a pod crashes, its logs vanish unless something captured them first.
This makes Kubernetes log analysis fundamentally different from traditional log management. You cannot SSH into a server and grep through /var/log. You need a dedicated pipeline that captures container output in real time, enriches it with cluster metadata (namespace, pod name, node, labels), ships it to a durable backend, and makes it queryable within seconds. The tool you choose for this pipeline determines whether debugging a production incident takes five minutes or five hours.
This guide covers the 7 best log analysis tools for Kubernetes in 2026, evaluates each on K8s-specific criteria, and provides real manifests and Helm values you can apply to your cluster today.
TL;DR: The best Kubernetes log analysis stack in 2026 combines an OTel Collector DaemonSet for collection with an S3-native backend for storage and querying. Parseable leads here with native OTLP ingestion, S3 storage (no PVCs or StatefulSets), Helm chart deployment, SQL queries, and full MELT observability (logs, metrics, and traces) from a single platform. Grafana Loki and Elasticsearch remain viable for teams already invested in those ecosystems, while Datadog and SigNoz offer strong managed options at different price points.
The Kubernetes Logging Challenge
Before comparing tools, you need to understand why Kubernetes logging is harder than logging in traditional environments.
Ephemeral Pods and Lost Logs
In a VM-based world, your application writes logs to /var/log/myapp.log and they sit on disk until you delete them. In Kubernetes, a pod can be killed, evicted, or rescheduled at any moment. When a pod terminates, its container filesystem is gone — including any logs written to stdout/stderr. If your logging pipeline was not capturing those logs in real time, they are permanently lost.
This is not an edge case. Kubernetes routinely kills pods during rolling deployments, node autoscaling events, OOM kills, liveness probe failures, and resource pressure evictions. Any logging solution that cannot handle this ephemerality is fundamentally broken for Kubernetes.
stdout/stderr as the Log Contract
Kubernetes establishes a clear contract: applications write to stdout and stderr, and the container runtime (containerd, CRI-O) writes those streams to log files on the node at /var/log/pods/<namespace>_<pod-name>_<pod-uid>/<container-name>/<restart-count>.log. These files use the CRI log format:
2026-02-18T14:23:01.442Z stdout F {"level":"info","msg":"request processed","duration_ms":42}Any log collection tool for Kubernetes must read from these node-level files. The tool must also parse the CRI format to extract the timestamp, stream (stdout/stderr), and the actual log body.
Multi-Tenancy and Metadata
A single Kubernetes cluster typically runs workloads from multiple teams across dozens of namespaces. Without rich metadata — namespace, pod name, container name, node, labels, annotations — log data is an undifferentiated stream of text. Your logging tool must automatically enrich every log line with Kubernetes context so engineers can filter and query by the dimensions that matter.
Kubernetes Logging Architecture Patterns
There are three primary patterns for collecting logs in Kubernetes. The tool you choose determines which pattern you use.
1. DaemonSet Pattern (Node-Level Agent)
A DaemonSet runs one log collector pod per node. Each collector reads /var/log/pods on its node and ships logs to a central backend. This is the most common and recommended pattern.
┌─────────────────────────────────────────────────┐
│ Kubernetes Node │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ Pod A │ │ Pod B │ │ Pod C │ │
│ └────┬────┘ └────┬────┘ └────┬────┘ │
│ │ stdout │ stdout │ stdout │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────┐ │
│ │ /var/log/pods/* (CRI logs) │ │
│ └──────────────────┬───────────────────┘ │
│ │ │
│ ┌──────────────────▼───────────────────┐ │
│ │ OTel Collector / Fluent Bit │ │
│ │ (DaemonSet - 1 per node) │ │
│ └──────────────────┬───────────────────┘ │
│ │ │
└─────────────────────┼────────────────────────────┘
│ OTLP/HTTP
▼
┌─────────────────┐
│ Log Backend │
│ (Parseable, │
│ Loki, ES) │
└─────────────────┘Advantages: Low resource overhead (one pod per node, not per application), no application changes needed, captures logs from all pods including system components.
Tools that use this pattern: OTel Collector, Fluent Bit, Vector, Fluentd, Datadog Agent.
2. Sidecar Pattern (Per-Pod Agent)
A sidecar container runs alongside your application container inside the same pod. It reads logs from a shared volume or directly from the application's stdout.
Advantages: Isolation per workload, fine-grained resource control, can handle application-specific log formats.
Disadvantages: Doubles the container count, increases resource consumption, requires pod spec changes for every workload, does not capture logs from system pods.
When to use: Only when you need per-application log processing that cannot be done at the node level.
3. Direct Push (Application SDK)
The application itself sends logs directly to a backend via HTTP/gRPC, typically using an OpenTelemetry SDK.
Advantages: Richest metadata (application-level context), structured logging from the source.
Disadvantages: Requires application code changes, tightly couples applications to the logging backend, misses logs from pods that crash during startup.
Best practice for Kubernetes: Use the DaemonSet pattern as your baseline. It covers all workloads with zero application changes. Layer in direct push via OTel SDKs for applications that need richer application-level context.
Quick Comparison: Kubernetes Log Analysis Tools
| Feature | Parseable | Grafana Loki | Elasticsearch | Datadog | SigNoz | Fluent Bit | Vector |
|---|---|---|---|---|---|---|---|
| Tool Type | Unified Observability | Log Aggregation | Search & Analytics | SaaS Observability | Observability | Log Collector | Log Collector |
| K8s Install | Helm chart | Helm chart | Helm / Operator | DaemonSet agent | Helm chart | DaemonSet | DaemonSet |
| Storage in K8s | S3 (no PVCs) | S3 + PVCs for index | PVCs (SSD required) | SaaS (no storage) | PVCs (ClickHouse) | N/A (forwarder) | N/A (forwarder) |
| StatefulSets Needed | No | Yes (ingesters) | Yes (data nodes) | No (SaaS) | Yes (ClickHouse) | No | No |
| OTLP Native | Yes (HTTP + gRPC) | Via Promtail/OTel | Via plugin | Via agent | Yes | Via plugin | Yes |
| Query Language | SQL | LogQL | KQL / Lucene | Proprietary | ClickHouse SQL | N/A | N/A |
| Full MELT | Yes (Logs + Metrics + Traces) | Logs only | Logs primarily | Yes | Yes | No (collector only) | No (collector only) |
| K8s Metadata | Automatic via OTel | Automatic via Promtail | Via Filebeat | Via agent | Via OTel | Via K8s filter | Via K8s enrichment |
| Resource Footprint | Low (Rust binary) | Medium | High (JVM) | Medium | High (ClickHouse) | Very low (C) | Low (Rust) |
| Deployment | Cloud (app.parseable.com) + self-hosted | Self-hosted or Grafana Cloud | Self-hosted or Elastic Cloud | SaaS only | Self-hosted or Cloud | Self-hosted | Self-hosted |
1. Parseable — S3-Native Unified Observability for Kubernetes
Best for: Teams that want full MELT observability (logs, metrics, traces) from their K8s clusters with S3-native storage, no PVCs, and no StatefulSets.
Parseable is a unified observability platform built in Rust that stores all telemetry data — logs, metrics, and traces — directly on S3-compatible object storage in Apache Parquet format. For Kubernetes teams, this architecture eliminates the most painful parts of running an observability backend in-cluster: no PersistentVolumeClaims to provision, no StatefulSets to manage, no storage node rebalancing, and no capacity planning for local disks.
Why Parseable Stands Out for Kubernetes
S3-Native Storage Eliminates PVCs: This is the single biggest operational advantage for Kubernetes deployments. Every other analytics backend — Elasticsearch, ClickHouse (used by SigNoz), even Loki's ingesters — requires PersistentVolumeClaims backed by block storage. In Kubernetes, PVCs mean StorageClasses, provisioners, capacity planning, and the ever-present risk of pods stuck in Pending because the underlying volume could not be provisioned. Parseable writes directly to S3. Your cluster runs stateless compute pods. Storage scales infinitely outside the cluster.
No StatefulSets for Storage: Elasticsearch requires StatefulSets for data nodes. ClickHouse requires StatefulSets. Even Loki uses StatefulSets for ingesters. StatefulSets in Kubernetes come with ordered deployment, sticky identity, and complex failure recovery. Parseable runs as a Deployment. Pods are interchangeable. If one dies, Kubernetes replaces it without worrying about data recovery or replication lag.
Native OTLP Endpoint: Parseable accepts logs, metrics, and traces over OTLP/HTTP and OTLP/gRPC. This means a standard OTel Collector DaemonSet can ship all telemetry types to a single Parseable endpoint. No separate backends for different signal types.
Full MELT from K8s Pods: Parseable is not just a log storage tool. It ingests and correlates logs, metrics, and traces from your Kubernetes workloads in a single UI. When debugging a failing pod, you can see its logs, the metrics from its container (CPU, memory, restarts), and distributed traces from the requests it processed — all queried with SQL, all stored on S3.
Built in Rust — Low Resource Requests/Limits: In Kubernetes, every pod competes for node resources. Parseable's Rust binary runs with minimal CPU and memory, meaning your observability backend does not consume the resources your applications need. Typical resource requests for a Parseable pod: 256Mi memory, 250m CPU.
SQL Queries for K8s Log Analysis: Kubernetes metadata becomes SQL columns. Querying logs by namespace, pod, container, or label is a standard WHERE clause, not a proprietary query language.
AI-Native Analysis: Parseable integrates with LLMs for natural language log analysis. Ask questions like "Why is the payments pod crashing?" and get answers derived from your actual log data.
Deploy Parseable on Kubernetes with Helm
For teams that prefer not to run the analytics backend in-cluster, Parseable Cloud provides a managed endpoint starting at $0.37/GB ingested ($29/month minimum) — simply point your OTel Collector DaemonSet at the cloud endpoint and skip the Helm installation. A free tier is available.
To self-host, set up the namespace and install Parseable with a single Helm command:
# Create namespace
kubectl create namespace parseable
# Add the Parseable Helm repo
helm repo add parseable https://charts.parseable.com
helm repo update
# Install Parseable with S3 backend
helm install parseable parseable/parseable \
--namespace parseable \
--set parseable.store=s3 \
--set parseable.s3.url=https://s3.amazonaws.com \
--set parseable.s3.bucket=my-k8s-logs \
--set parseable.s3.region=us-east-1 \
--set parseable.s3.accessKey=YOUR_ACCESS_KEY \
--set parseable.s3.secretKey=YOUR_SECRET_KEYExample Helm values.yaml for production:
# parseable-values.yaml
parseable:
store: s3
s3:
url: "https://s3.amazonaws.com"
bucket: "production-k8s-observability"
region: "us-east-1"
accessKey: "" # Use existingSecret instead
secretKey: ""
existingSecret: "parseable-s3-credentials"
resources:
requests:
cpu: 250m
memory: 256Mi
limits:
cpu: "2"
memory: 2Gi
replicaCount: 2
service:
type: ClusterIP
port: 8000Notice what is absent from this values file: no storage class, no PVC size, no volume provisioner configuration. S3 is the storage layer, and it exists entirely outside your Kubernetes cluster.
OTel Collector DaemonSet Shipping to Parseable
Deploy an OTel Collector DaemonSet that reads logs from every node and ships them to Parseable via OTLP. This is the standard Kubernetes logging pattern.
First, create the RBAC resources:
# otel-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: otel-collector
namespace: parseable
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: otel-collector-role
rules:
- apiGroups: [""]
resources: [nodes, nodes/metrics, nodes/proxy, services, endpoints, pods]
verbs: [get, list, watch]
- apiGroups: [""]
resources: [configmaps]
verbs: [get]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: otel-collector-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: otel-collector-role
subjects:
- kind: ServiceAccount
name: otel-collector
namespace: parseableNext, the OTel Collector ConfigMap:
# otel-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-collector-conf
namespace: parseable
data:
otel-collector-config.yaml: |
receivers:
filelog/pods:
include:
- /var/log/pods/*/*/*.log
exclude:
- /var/log/pods/*/otel-collector/*.log
- /var/log/pods/kube-system_*/*/*.log
start_at: end
include_file_path: true
include_file_name: false
operators:
- type: regex_parser
id: extract_metadata_from_filepath
regex: '^/var/log/pods/(?P<namespace>[^_]+)_(?P<pod_name>[^_]+)_(?P<uid>[^/]+)/(?P<container_name>[^/]+)/.*\.log$'
parse_from: attributes["log.file.path"]
- type: regex_parser
id: parser-cri
on_error: send
regex: '^(?P<time>[^ ]+) (?P<stream>stdout|stderr) (?P<logtag>[^ ]*) ?(?P<log>.*)$'
timestamp:
parse_from: attributes.time
layout: '%Y-%m-%dT%H:%M:%S.%LZ'
- type: move
from: attributes.namespace
to: resource["k8s.namespace.name"]
- type: move
from: attributes.pod_name
to: resource["k8s.pod.name"]
- type: move
from: attributes.container_name
to: resource["k8s.container.name"]
- type: move
from: attributes.uid
to: resource["k8s.pod.uid"]
- type: move
from: attributes.log
to: body
processors:
batch:
send_batch_size: 100
send_batch_max_size: 500
timeout: 5s
resource:
attributes:
- key: k8s.cluster.name
value: "production-cluster"
action: insert
exporters:
otlphttp/parseable:
logs_endpoint: "http://parseable.parseable.svc.cluster.local:8000/v1/logs"
encoding: json
compression: gzip
tls:
insecure: true
headers:
Authorization: "Basic <BASE64_CREDENTIALS>"
X-P-Stream: "k8s-logs"
X-P-Log-Source: "otel-logs"
service:
pipelines:
logs:
receivers: [filelog/pods]
processors: [resource, batch]
exporters: [otlphttp/parseable]Finally, the DaemonSet:
# otel-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: otel-collector
namespace: parseable
spec:
selector:
matchLabels:
app: otel-collector
template:
metadata:
labels:
app: otel-collector
spec:
serviceAccountName: otel-collector
tolerations:
- operator: Exists
containers:
- name: otel-collector
image: otel/opentelemetry-collector-contrib:0.115.0
args: ["--config=/etc/otel/otel-collector-config.yaml"]
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
volumeMounts:
- name: config
mountPath: /etc/otel
- name: varlogpods
mountPath: /var/log/pods
readOnly: true
volumes:
- name: config
configMap:
name: otel-collector-conf
- name: varlogpods
hostPath:
path: /var/log/podsApply everything:
kubectl apply -f otel-rbac.yaml
kubectl apply -f otel-configmap.yaml
kubectl apply -f otel-daemonset.yamlWithin seconds, logs from every pod on every node will flow into Parseable. Query them with SQL:
-- Find errors across all namespaces
SELECT "k8s.namespace.name", "k8s.pod.name", body, p_timestamp
FROM "k8s-logs"
WHERE body LIKE '%error%' OR body LIKE '%ERROR%'
ORDER BY p_timestamp DESC
LIMIT 100;
-- Log volume by namespace in the last hour
SELECT "k8s.namespace.name", COUNT(*) as log_count
FROM "k8s-logs"
GROUP BY "k8s.namespace.name"
ORDER BY log_count DESC;
-- Crash loop detection: pods with stderr spikes
SELECT "k8s.pod.name", "k8s.namespace.name", COUNT(*) as error_count
FROM "k8s-logs"
WHERE stream = 'stderr'
GROUP BY "k8s.pod.name", "k8s.namespace.name"
ORDER BY error_count DESC
LIMIT 20;For a detailed walkthrough of this setup, see our guide on ingesting Kubernetes logs with OTel Collector.
Parseable Cloud
Teams that prefer a managed solution can use Parseable Cloud — point your in-cluster OTel Collector at the cloud endpoint and skip the Helm installation entirely. Starts at $0.37/GB ingested ($29/month minimum) with a free tier available.
2. Grafana Loki — Label-Based K8s Log Aggregation
Best for: Teams already running Grafana and Prometheus that want to add log aggregation with a similar label-based model.
Grafana Loki indexes only metadata labels, not the full content of log lines. In Kubernetes, labels map naturally to namespace, pod, container, and custom Kubernetes labels. This makes Loki inexpensive for high-volume clusters where you primarily query by known dimensions.
K8s Deployment
Loki deploys via Helm in several modes — monolithic, simple scalable, and microservices. For Kubernetes, the simple scalable mode is most common:
helm install loki grafana/loki \
--namespace loki \
--set loki.storage.type=s3 \
--set loki.storage.s3.endpoint=s3.amazonaws.com \
--set loki.storage.s3.bucketnames=loki-logsLoki typically uses Promtail as a DaemonSet to collect logs, though you can also use an OTel Collector.
K8s-Specific Strengths
- Natural fit for the Prometheus/Grafana ecosystem — Kubernetes labels become Loki labels
- Object storage backend reduces cost compared to Elasticsearch
- Grafana dashboards can correlate Prometheus metrics with Loki logs side by side
- Lightweight log collection via Promtail DaemonSet
K8s-Specific Limitations
- Label cardinality problems: Kubernetes generates high-cardinality labels (pod UIDs, unique deployment hashes). Loki's index is built on label combinations, and high cardinality causes ingestion failures, slow queries, and index bloat. You must carefully manage which labels get indexed.
- StatefulSets for ingesters: Loki's ingesters use StatefulSets with PVCs for the write-ahead log. This reintroduces the PVC management overhead Parseable avoids.
- Logs only: Loki stores logs. For metrics, you need Prometheus. For traces, you need Tempo. For dashboards, you need Grafana. That is four separate components to deploy and manage in your cluster.
- LogQL is not SQL: Engineers debugging production incidents must learn LogQL, a proprietary query language. It is powerful but adds a learning curve for teams not already in the Grafana ecosystem.
- No full-text search: You cannot efficiently search for arbitrary strings across all logs without specifying a label selector first. This slows down incident response when you do not know which namespace or pod is causing the issue.
3. Elasticsearch — Full-Text Search at Scale
Best for: Teams that need powerful full-text search across Kubernetes logs and are willing to manage a stateful cluster.
Elasticsearch (and its fork OpenSearch) provides the strongest full-text search capabilities of any tool on this list. For Kubernetes teams that rely heavily on ad-hoc text search during incident response, Elasticsearch remains a contender — but the operational cost in a K8s environment is significant.
K8s Deployment
Elasticsearch is typically deployed via the Elastic Cloud on Kubernetes (ECK) operator:
# Install the ECK operator
kubectl apply -f https://download.elastic.co/downloads/eck/2.14.0/crds.yaml
kubectl apply -f https://download.elastic.co/downloads/eck/2.14.0/operator.yaml
# Deploy an Elasticsearch cluster
kubectl apply -f elasticsearch-cluster.yamlLog collection requires Filebeat as a DaemonSet, or an OTel Collector configured with the Elasticsearch exporter.
K8s-Specific Strengths
- Best-in-class full-text search — grep-like ad-hoc queries across billions of log lines
- Mature operator (ECK) for Kubernetes lifecycle management
- Kibana provides rich visualization and dashboarding
- Extensive Kubernetes metadata enrichment via Filebeat autodiscover
K8s-Specific Limitations
- Heavy StatefulSet footprint: An Elasticsearch production cluster in Kubernetes needs dedicated StatefulSets for master nodes, data nodes, and coordinating nodes. Each data node requires fast SSD-backed PVCs — typically 100GB or more per node.
- JVM resource consumption: Elasticsearch runs on the JVM. The recommended heap size is 50% of available memory, with a minimum of 1-2GB per node. In a resource-constrained Kubernetes cluster, this overhead is substantial.
- Capacity planning burden: You must plan shard count, replica count, index lifecycle policies, and storage capacity ahead of time. Over-provision, and you waste cluster resources. Under-provision, and you get red cluster health during traffic spikes.
- Cost of retention: Because Elasticsearch requires block storage (SSDs), retaining logs for more than 7-30 days becomes expensive. Many teams are forced to delete older data, which defeats the purpose of observability during post-incident reviews.
- No native OTLP support: Elasticsearch does not natively accept OTLP. You need a translation layer — either Logstash, the ES exporter in OTel Collector, or a third-party plugin.
4. Datadog — Managed K8s Observability (SaaS)
Best for: Well-funded teams that want comprehensive Kubernetes observability without managing any in-cluster storage.
Datadog offers a fully managed SaaS observability platform with deep Kubernetes integration. The Datadog Agent runs as a DaemonSet and automatically discovers pods, services, and containers, collecting logs, metrics, and traces without manual configuration.
K8s Deployment
helm install datadog-agent datadog/datadog \
--set datadog.apiKey=YOUR_API_KEY \
--set datadog.logs.enabled=true \
--set datadog.logs.containerCollectAll=true \
--set datadog.apm.enabled=trueK8s-Specific Strengths
- Zero in-cluster storage — all data ships to Datadog's cloud
- Automatic Kubernetes metadata extraction with no configuration
- Live container view, pod-level resource monitoring, and cluster maps
- Autodiscovery labels for per-pod log processing rules
- Strong APM integration with distributed tracing correlated to logs
K8s-Specific Limitations
- Cost scales with cluster size: Datadog charges per host ($15-$23/month for infrastructure) plus per-GB for log ingestion ($0.10/GB) and indexing (~$1.70/GB). A 50-node cluster ingesting 200GB/day of logs can easily exceed $30,000/month.
- No self-hosting option: Your Kubernetes logs leave your cluster and reside on Datadog's infrastructure. For regulated industries, data residency requirements, or air-gapped environments, this is a non-starter.
- Vendor lock-in: Datadog's query language, alerting rules, and dashboards are all proprietary. Migration away from Datadog requires rebuilding everything from scratch.
- Agent resource overhead: The Datadog Agent is feature-rich but consumes more resources than lightweight collectors. Typical requests: 256Mi memory, 200m CPU per node — significant across a large cluster.
5. SigNoz — Open-Source OTel-Native Observability
Best for: Teams that want an open-source, OpenTelemetry-native observability platform and are comfortable managing ClickHouse in Kubernetes.
SigNoz provides unified logs, metrics, and traces with a ClickHouse backend. It is built around OpenTelemetry and offers native OTLP ingestion, making it a natural fit for teams standardizing on OTel.
K8s Deployment
helm install signoz signoz/signoz \
--namespace signoz \
--create-namespaceSigNoz deploys an OTel Collector DaemonSet for log collection and a ClickHouse cluster for storage.
K8s-Specific Strengths
- Full MELT observability — logs, metrics, and traces in one platform
- OpenTelemetry-native with no proprietary agents
- Good Kubernetes dashboards out of the box
- ClickHouse SQL for querying (familiar to analytics engineers)
- Open source under MIT license
K8s-Specific Limitations
- ClickHouse StatefulSets: SigNoz requires ClickHouse, which runs as a StatefulSet with PVCs. This means provisioning block storage, managing replication, and handling ClickHouse-specific operational tasks (merges, mutations, partition management).
- Higher resource baseline: A minimal SigNoz deployment (ClickHouse + query service + frontend + OTel Collector) consumes more cluster resources than S3-native alternatives. Expect 2-4GB memory and 1-2 CPU cores minimum for ClickHouse alone.
- ClickHouse expertise required: Operating ClickHouse in production requires knowledge of distributed systems, merge behavior, partition pruning, and capacity planning. This is a meaningful operational burden.
- Storage cost: ClickHouse uses local NVMe/SSD storage as its primary tier. While it supports S3 tiering, its hot storage remains disk-based — more expensive than pure S3-native architectures.
6. Fluent Bit — Lightweight K8s Log Collector
Best for: Teams that need a minimal-footprint log collection agent and already have a separate analytics backend.
Fluent Bit is a CNCF graduated project written in C, designed specifically for high-throughput, low-resource log collection. It is the most widely deployed log collector in Kubernetes environments — shipped by default with many managed Kubernetes offerings.
K8s Deployment
helm install fluent-bit fluent/fluent-bit \
--namespace logging \
--set config.outputs=|
[OUTPUT]
Name http
Match *
Host parseable.parseable.svc.cluster.local
Port 8000
URI /api/v1/ingest
Format json
Header X-P-Stream k8s-logs
Header Authorization Basic <BASE64_CREDENTIALS>K8s-Specific Strengths
- Extremely low resource footprint — runs in 10-20MB of memory per node
- Built-in Kubernetes metadata filter for automatic pod/namespace enrichment
- Supports hundreds of output plugins (S3, Elasticsearch, Loki, HTTP, Kafka)
- CNCF graduated — production-hardened and widely adopted
- Tail input plugin handles container log rotation gracefully
K8s-Specific Limitations
- Collector only, not an analytics platform: Fluent Bit collects and routes logs. It does not store, index, or query them. You need a separate backend — Parseable, Elasticsearch, Loki — to actually analyze your logs.
- Configuration complexity: Fluent Bit's configuration language is its own custom INI-like format. Complex routing, filtering, and transformation logic can become difficult to maintain across environments.
- Limited OTLP support: While Fluent Bit has added OpenTelemetry output and input plugins, they are not as mature as OTel Collector's native support. For teams standardizing on OpenTelemetry, the OTel Collector is a better fit. For a deeper comparison, see our article on OTel Collector vs Fluent Bit.
- No metrics or traces: Fluent Bit handles logs. For a complete observability pipeline, you need additional tools for metrics and traces.
7. Vector — High-Performance Log Pipeline
Best for: Platform engineering teams that want a Rust-based, programmable log pipeline with strong performance guarantees.
Vector by Datadog is a high-performance observability data pipeline built in Rust. It serves a similar role to Fluent Bit — collecting, transforming, and routing logs — but with a more expressive transformation language (VRL) and better performance under high throughput.
K8s Deployment
helm install vector vector/vector \
--namespace logging \
--set role=Agent \
--set customConfig.sinks.parseable.type=http \
--set customConfig.sinks.parseable.uri="http://parseable.parseable.svc:8000/api/v1/ingest"Vector runs as a DaemonSet (Agent role) or as an aggregator (Aggregator role) for multi-stage pipelines.
K8s-Specific Strengths
- Built in Rust — excellent throughput with low resource usage (comparable to Fluent Bit)
- VRL (Vector Remap Language) for expressive, type-safe transformations
- Built-in Kubernetes logs source with automatic metadata enrichment
- End-to-end acknowledgements prevent data loss during pipeline failures
- Native support for S3, Elasticsearch, Loki, HTTP, and dozens of other sinks
K8s-Specific Limitations
- Collector only: Like Fluent Bit, Vector collects and routes data — it does not store or query it. You still need a backend like Parseable or Elasticsearch.
- VRL learning curve: VRL is powerful but proprietary. Teams must learn another domain-specific language for transformations.
- Datadog ownership: Vector is maintained by Datadog. While open source (MPL 2.0), some teams are wary of relying on a project controlled by a commercial competitor to their chosen analytics backend.
- Newer ecosystem: Vector's community and plugin ecosystem is smaller than Fluent Bit's and significantly smaller than Fluentd's.
Choosing the Right Stack for Your K8s Cluster
The tools above fall into two categories: collectors (Fluent Bit, Vector, OTel Collector) and analytics backends (Parseable, Loki, Elasticsearch, Datadog, SigNoz). Most production Kubernetes environments need one of each.
Here is how to think about the choice:
If you want minimal operational overhead
OTel Collector DaemonSet + Parseable: The OTel Collector handles collection with native OTLP support. Parseable handles storage on S3 (no PVCs, no StatefulSets) and provides SQL querying plus full MELT observability. Two components, zero stateful storage in-cluster. This is covered in detail in our OpenTelemetry + Parseable stack guide.
If you are already in the Grafana ecosystem
Promtail/OTel Collector + Loki + Grafana: Keeps you in the Grafana ecosystem, but be prepared to manage Loki's StatefulSets, deal with label cardinality, and run separate tools for metrics (Prometheus) and traces (Tempo).
If you need managed SaaS and have the budget
Datadog Agent: One DaemonSet, everything ships to Datadog. Simple but expensive, with full vendor lock-in.
If you need full-text search above all else
Filebeat + Elasticsearch + Kibana: The ELK stack still provides the best full-text search, but at the cost of heavy StatefulSets, JVM overhead, and SSD-backed PVCs.
For a broader comparison of collection tools, see our guide on log aggregation tools.
Frequently Asked Questions
What is the best way to collect logs in Kubernetes?
The DaemonSet pattern is the standard and recommended approach. Deploy a log collector — ideally an OpenTelemetry Collector — as a DaemonSet so one instance runs on every node. Each instance reads container logs from /var/log/pods on its node, enriches them with Kubernetes metadata (namespace, pod name, container name), and ships them to your analytics backend. This covers all pods, requires no application changes, and handles pod ephemerality by capturing logs before pods terminate.
Do I need PersistentVolumeClaims for Kubernetes logging?
It depends on your backend. Elasticsearch and ClickHouse (used by SigNoz) require PVCs for their stateful storage. Loki requires PVCs for its ingester write-ahead logs. Parseable does not require any PVCs because it stores data directly on S3-compatible object storage. If you want to minimize stateful components in your Kubernetes cluster, an S3-native backend like Parseable eliminates PVC management entirely.
How do I handle log collection from ephemeral pods?
The DaemonSet pattern solves this. The log collector reads from node-level log files (/var/log/pods), not from the pod itself. Even after a pod is terminated, its log files persist on the node briefly (controlled by containerLogMaxSize and containerLogMaxFiles kubelet settings), giving the collector time to read and ship them. For applications with extremely short lifespans (seconds or less), consider supplementing with direct OTLP push from the application using an OpenTelemetry SDK.
Can I use the same tool for logs, metrics, and traces in Kubernetes?
Yes. Unified observability platforms like Parseable, Datadog, and SigNoz accept all three signal types. With Parseable, you configure a single OTel Collector DaemonSet to ship logs, metrics, and traces to one endpoint. This eliminates the need for separate backends (Prometheus for metrics, Jaeger for traces, Loki for logs) and gives you correlated observability across all signal types.
How much does Kubernetes log storage cost with S3 vs. block storage?
S3 standard storage costs approximately $0.023/GB/month. Block storage (EBS gp3, GCE PD, Azure Managed Disk) typically costs $0.08-$0.10/GB/month for SSD, and some Elasticsearch deployments require io2 volumes at $0.125/GB/month. For a cluster generating 100GB of logs per day with 30-day retention, S3 storage costs roughly $69/month. The same data on SSD-backed PVCs costs $240-$375/month — before accounting for replicas, which double or triple the storage requirement. Over a year, the S3-native approach saves thousands of dollars on storage alone.
How do I query Kubernetes logs by namespace or pod name?
In Parseable, Kubernetes metadata extracted by the OTel Collector becomes SQL-queryable columns. Filter by namespace with WHERE "k8s.namespace.name" = 'production', by pod with WHERE "k8s.pod.name" LIKE 'api-server%', or by container with WHERE "k8s.container.name" = 'nginx'. In Loki, you use label selectors: {namespace="production", pod=~"api-server.*"}. In Elasticsearch, you query via KQL: kubernetes.namespace: "production" AND kubernetes.pod.name: "api-server*".
Conclusion
Kubernetes logging is a fundamentally different problem from logging in traditional environments. The ephemerality of pods, the scale of multi-node clusters, and the need for rich metadata enrichment demand purpose-built tooling. Choosing the wrong stack means either overpaying for SaaS (Datadog), over-managing stateful infrastructure (Elasticsearch, ClickHouse), or under-serving your team's query needs (Loki's label-only indexing).
The architecture that best fits Kubernetes in 2026 is clear: a lightweight OTel Collector DaemonSet for collection, shipping to an S3-native backend that handles storage and querying without StatefulSets or PVCs. Parseable delivers exactly this — full MELT observability (logs, metrics, and traces), SQL querying, Helm chart deployment, and S3 storage that scales independently of your cluster. Your compute pods stay stateless. Your storage scales infinitely. Your team queries with SQL.
For teams already invested in Grafana, Loki integrates naturally. For teams with large budgets and no desire to manage infrastructure, Datadog works. For teams that need maximum full-text search power, Elasticsearch delivers. But for Kubernetes teams that want modern architecture, low cost, and unified observability without operational sprawl, Parseable is the strongest choice available.
Ready to simplify Kubernetes observability?
- Start with Parseable Cloud — starts at $0.37/GB, free tier available
- Self-hosted deployment — single binary, deploy in 2 minutes
- Read the docs — guides, API reference, and tutorials
- Join our Slack — community and engineering support


