Wise Hustlers — Digital Product & App Development Studio Logo
Get Consultation
By Wise Hustler Admin•10/28/2026•17 min read

OpenTelemetry Tail-Based Sampling at Scale: Two-Tier Collector Architecture & Observability FinOps Playbook

OpenTelemetry Tail-Based Sampling at Scale: Two-Tier Collector Architecture & Observability FinOps Playbook

# OpenTelemetry Tail-Based Sampling Architecture: Two-Tier Collector Topology & FinOps Playbook

Summary: An enterprise OpenTelemetry tail-based sampling architecture addresses tracing cost inflation by deferring sampling decisions until complete distributed trace graphs assemble. By separating telemetry routing from policy evaluation across a two-tier collector topology, operators route spans deterministically using the loadbalancingexporter keyed on trace ID. With stateful tail-sampling collectors backed by persistent Pebble disk storage, organizations preserve 100% of anomalies, errors, and p95 latency spikes while slashing Datadog or SaaS APM trace ingestion bills by over 80%.

---

The Observability FinOps Crisis: Tracing at Cloud Scale

Modern distributed systems rely on microservices, event streaming brokers, and cloud databases to process user requests. As architectures scale, instrumenting services with OpenTelemetry produces massive telemetry volume. In an architecture handling 25,000 requests per second across 40 microservices, a single incoming HTTP request often generates between 15 and 35 spans across edge proxies, authentication services, API gateways, database queries, cache lookups, and message queues.

At this volume, an infrastructure generates approximately 500,000 spans per second. Over a 30-day billing cycle, this amounts to roughly 1.3 billion spans daily, or 39 billion spans per month.

Commercial observability vendors structure their pricing directly around span ingestion volume. Datadog APM, for example, bills tracing through a dual-metered model: a flat monthly fee per host ($31 per host under standard enterprise commitments) alongside an ingestion charge of $1.70 per million spans ingested beyond the modest included allowance of 1 million spans per host.

Monthly Ingestion Calculations:
39,000,000,000 spans / 1,000,000 = 39,000 units
39,000 units * $1.70/million = $66,300 per month in raw trace ingestion fees

Adding network egress costs across cloud availability zones and high-throughput retention indexing pushes total observability spend past $85,000 per month for tracing alone.

Faced with mounting cloud invoices, engineering leadership often orders teams to restrict telemetry collection. The standard initial response is reducing collection at the application root through probabilistic head-based sampling. However, indiscriminately dropping 90% or 95% of traces introduces catastrophic visibility blind spots.

---

Head-Based vs. Tail-Based Sampling: The Engineering Dilemma

Choosing between head-based and tail-based sampling represents a fundamental trade-off between infrastructure statefulness and data fidelity.

Head-Based Sampling: Blind Probability at the Root

In head-based sampling, the sampling decision is made at the ingress point—the root span—before downstream work executes. The OpenTelemetry SDK or API Gateway inspects a configured sampling ratio (for example, 5%) and sets the W3C traceparent header flag to either 01 (sampled) or 00 (not sampled). Every downstream service propagates this flag contextually.

Incoming Request -> [API Gateway: Head Decision (5%)] 
                        |
      +-----------------+-----------------+
      | (Sampled: 5%)                     | (Dropped: 95%)
      v                                   v
[Auth Service] -> [Order Service]     [Silent Failure / 500 Error Discarded]
  • Advantage: Stateless and computationally cheap. Application runtimes make instant decisions. Intermediate collectors require zero memory buffers or cross-node synchronization.
  • Failure Mode: Head sampling cannot predict the future. A request that appears routine at the API gateway may trigger a cascading PostgreSQL connection pool exhaustion, a Redis cache stampede, an out-of-order Kafka partition processing failure, or an unhandled HTTP 500 status 15 microservices downstream. If that trace was not sampled at the head, all diagnostic evidence is permanently lost.

Tail-Based Sampling: Context-Aware Evaluation

Tail-based sampling defers the sampling decision until all spans for a distributed trace have finished executing. Telemetry collectors buffer incoming spans across an evaluation window (for example, 30 seconds). Once the trace completes or times out, an evaluation engine inspects the entire trace graph against deterministic business and operational policies:

1. Did any span record an HTTP status code >= 500 or an OpenTelemetry status of ERROR?

2. Did total trace duration exceed the p95 or p99 service level agreement (SLA) threshold (e.g., > 1,200 ms)?

3. Did the trace execute against a critical business path, such as an enterprise checkout or payment settlement?

4. If healthy and fast, does the trace fit into a tiny 1% background baseline for throughput metrics?

If any policy evaluates to true, the collector retains the entire trace graph—from the root API gateway span down to the leaf database query—and forwards it to the APM backend. If the trace is healthy and falls outside the baseline percentage, the collector discards it.

The challenge with tail-based sampling is architectural: traces execute across multiple physical nodes, causing spans from the same trace to arrive at different collector instances.

---

The Distributed Span Dispersion Problem & The Two-Tier Pattern

In Kubernetes environments, microservices run as pods distributed across dynamic node pools. When Service A (on Node 1) makes an RPC call to Service B (on Node 2), each service emits spans independently to its local telemetry pipeline.

If collectors run behind a standard Kubernetes ClusterIP Service or Layer 4 round-robin load balancer, spans sharing the exact same trace_id land on arbitrary collector replicas:

[Service A (Node 1)] --------> (K8s Service / Round-Robin) --------> [Collector Pod 1] (Has Span A)
                                                                \--> [Collector Pod 2] (Has Span B)
[Service B (Node 2)] --------> (K8s Service / Round-Robin) --------> [Collector Pod 3] (Has Span C)

In this fragmented state, Collector Pod 1 sees only the initial HTTP 200 gateway span and drops it. Collector Pod 3 sees an unhandled database exception on Span C, but lacks the root span context, HTTP route metadata, and ingress request parameters. The tail-sampling processor cannot evaluate the trace accurately because no single process possesses the complete trace tree.

The Two-Tier Architectural Solution

To resolve span dispersion, we deploy a two-tier OpenTelemetry tail-based sampling architecture:

+---------------------------------------------------------------------------------------+
| TIER 1: Agent / Router Layer (DaemonSet on every Kubernetes Node)                     |
| - Listens on localhost (OTLP gRPC: 4317 / HTTP: 4318)                                  |
| - Runs loadbalancingexporter with routing_key: "trace_id"                             |
| - Resolves Tier 2 collector endpoints via Headless Service DNS                         |
+---------------------------------------------------------------------------------------+
                                   |
         Deterministic Hash: Murmur3(TraceID) % N Pod Replicas
                                   |
         +-------------------------+-------------------------+
         v                                                   v
+-----------------------------------+     +-----------------------------------+
| TIER 2: Gateway Layer (Pod 0)     |     | TIER 2: Gateway Layer (Pod 1)     |
| - Receives Trace IDs: 0x00 - 0x7F |     | - Receives Trace IDs: 0x80 - 0xFF |
| - tailsamplingprocessor           |     | - tailsamplingprocessor           |
|   * Error Policy (100%)           |     |   * Error Policy (100%)           |
|   * Latency > p95 (100%)          |     |   * Latency > p95 (100%)          |
|   * Probabilistic (2%)            |     |   * Probabilistic (2%)            |
| - Disk-Backed Pebble Storage      |     | - Disk-Backed Pebble Storage      |
| - Exporters: Datadog / OTLP       |     | - Exporters: Datadog / OTLP       |
+-----------------------------------+     +-----------------------------------+

1. Tier 1 (Agent Layer): Deployed as a Kubernetes DaemonSet. Application pods send spans to localhost:4317 or node IP. Tier 1 collectors do not sample. Instead, they extract the 16-byte trace_id from every span and use a consistent hashing algorithm within the loadbalancingexporter to route all spans for that trace to the exact same Tier 2 collector replica.

2. Tier 2 (Gateway Layer): Deployed as a scalable StatefulSet or Deployment exposed via a headless Kubernetes service. Because all spans with identical trace IDs arrive at the same pod, the local tailsamplingprocessor reconstructs the full trace graph and makes authoritative sampling determinations.

When designing high-throughput distributed backends and event-driven data platforms, teams frequently engage Wise Hustlers custom software engineering to architect resilient observability pipelines that capture comprehensive diagnostics without creating runaway cloud infrastructure bills.

---

Tier 1 Implementation: DaemonSet Routing with loadbalancingexporter

The Tier 1 collector runs locally on each host node to minimize pod-to-collector latency and prevent cross-node network hops for initial span emission.

The core component is the loadbalancingexporter opentelemetry trace id configuration. It continuously monitors the IP addresses of Tier 2 collector pods via a Kubernetes headless service DNS record and routes spans using consistent hashing.

Tier 1 ConfigMap and DaemonSet YAML Manifests

apiVersion: v1
kind: ConfigMap
metadata:
  name: otel-collector-tier1-agent-config
  namespace: monitoring
data:
  relay.yaml: |
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
          http:
            endpoint: 0.0.0.0:4318

    processors:
      memory_limiter:
        check_interval: 1s
        limit_percentage: 75
        spike_limit_percentage: 20
      batch:
        send_batch_size: 8192
        timeout: 200ms
        send_batch_max_size: 10240

    exporters:
      loadbalancing:
        routing_key: "trace_id"
        protocol:
          otlp:
            tls:
              insecure: true
            timeout: 5s
        resolver:
          dns:
            hostname: otel-collector-tier2-headless.monitoring.svc.cluster.local
            port: 4317
            interval: 5s

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, batch]
          exporters: [loadbalancing]
      telemetry:
        logs:
          level: "info"
        metrics:
          address: 0.0.0.0:8888
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: otel-collector-tier1-agent
  namespace: monitoring
  labels:
    app.kubernetes.io/name: otel-collector-tier1
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: otel-collector-tier1
  template:
    metadata:
      labels:
        app.kubernetes.io/name: otel-collector-tier1
    spec:
      containers:
        - name: otel-collector
          image: otel/opentelemetry-collector-contrib:0.110.0
          args: ["--config=/conf/relay.yaml"]
          resources:
            requests:
              cpu: 200m
              memory: 256Mi
            limits:
              cpu: 1000m
              memory: 1Gi
          ports:
            - containerPort: 4317
              hostPort: 4317
              name: otlp-grpc
            - containerPort: 4318
              hostPort: 4318
              name: otlp-http
            - containerPort: 8888
              name: metrics
          volumeMounts:
            - name: config
              mountPath: /conf
      volumes:
        - name: config
          configMap:
            name: otel-collector-tier1-agent-config

---

Tier 2 Implementation: Stateful Gateway with tailsamplingprocessor

Tier 2 collectors act as stateful evaluation engines. They collect spans belonging to a trace, hold them in memory for a deterministic window, and evaluate sampling criteria.

Sizing the tailsamplingprocessor Configuration

Optimizing the opentelemetry collector tailsamplingprocessor config requires tuning three critical parameters:

  • decision_wait: The duration the processor waits after receiving the first span of a trace before evaluating sampling rules. Setting this to 30s provides sufficient headroom for asynchronous background jobs and slow multi-tier transactions to finish.
  • num_traces: The maximum number of active traces held in the internal tracking cache. In high-traffic clusters, size this between 50000 and 100000 to prevent early eviction.
  • expected_new_traces_per_sec: Configures internal hash map bucket sizing to eliminate dynamic memory re-allocations during traffic bursts.

Tier 2 Headless Service, ConfigMap, and Deployment Manifests

The following manifest configures:

1. A headless service (ClusterIP: None) required by the Tier 1 loadbalancingexporter DNS resolver.

2. A multi-rule tail-sampling policy targeting error status codes, latency thresholds (> 1,200 ms), and a 2% probabilistic baseline for healthy transactions.

3. Upstream export configured to reduce Datadog tracing costs by stripping superfluous spans.

apiVersion: v1
kind: Service
metadata:
  name: otel-collector-tier2-headless
  namespace: monitoring
  labels:
    app.kubernetes.io/name: otel-collector-tier2
spec:
  clusterIP: None
  selector:
    app.kubernetes.io/name: otel-collector-tier2
  ports:
    - port: 4317
      targetPort: 4317
      name: otlp-grpc
    - port: 4318
      targetPort: 4318
      name: otlp-http
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: otel-collector-tier2-gateway-config
  namespace: monitoring
data:
  gateway.yaml: |
    receivers:
      otlp:
        protocols:
          grpc:
            endpoint: 0.0.0.0:4317
            max_concurrent_streams: 1024
          http:
            endpoint: 0.0.0.0:4318

    processors:
      memory_limiter:
        check_interval: 500ms
        limit_percentage: 80
        spike_limit_percentage: 20

      tail_sampling:
        decision_wait: 30s
        num_traces: 65000
        expected_new_traces_per_sec: 2500
        policies:
          # Policy 1: Retain 100% of all traces containing an OpenTelemetry or HTTP error
          - name: filter_errors
            type: status_code
            status_code:
              status_codes: [ERROR]

          # Policy 2: Retain 100% of traces exceeding p95 latency SLA (1200ms)
          - name: filter_high_latency
            type: latency
            latency:
              threshold_ms: 1200

          # Policy 3: Retain 100% of critical business domain transactions
          - name: filter_critical_routes
            type: string_attribute
            string_attribute:
              key: http.target
              values: ["/api/v1/checkout", "/api/v1/payments/charge"]
              enabled_regex_matching: false

          # Policy 4: Retain a 2% probabilistic baseline of normal, fast transactions
          - name: filter_probabilistic_baseline
            type: probabilistic
            probabilistic:
              sampling_percentage: 2.0

      batch:
        send_batch_size: 4096
        timeout: 500ms
        send_batch_max_size: 8192

    extensions:
      file_storage/pebble:
        directory: /var/lib/otelcol/storage
        timeout: 10s
        compaction:
          on_start: true
          directory: /var/lib/otelcol/storage/compaction
        max_txn_retries: 5

    exporters:
      # Direct Datadog APM exporter with disk-backed sending queue
      datadog:
        api:
          key: "${env:DD_API_KEY}"
          site: "datadoghq.com"
        traces:
          span_name_as_resource_name: true
        sending_queue:
          enabled: true
          storage: file_storage/pebble
          num_consumers: 8
          queue_size: 5000

    service:
      extensions: [file_storage/pebble]
      pipelines:
        traces:
          receivers: [otlp]
          processors: [memory_limiter, tail_sampling, batch]
          exporters: [datadog]
      telemetry:
        logs:
          level: "info"
        metrics:
          address: 0.0.0.0:8888
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: otel-collector-tier2-gateway
  namespace: monitoring
  labels:
    app.kubernetes.io/name: otel-collector-tier2
spec:
  serviceName: otel-collector-tier2-headless
  replicas: 4
  selector:
    matchLabels:
      app.kubernetes.io/name: otel-collector-tier2
  template:
    metadata:
      labels:
        app.kubernetes.io/name: otel-collector-tier2
    spec:
      terminationGracePeriodSeconds: 60
      containers:
        - name: otel-collector
          image: otel/opentelemetry-collector-contrib:0.110.0
          args: ["--config=/conf/gateway.yaml"]
          env:
            - name: DD_API_KEY
              valueFrom:
                secretKeyRef:
                  name: datadog-secret
                  key: api-key
          resources:
            requests:
              cpu: 1000m
              memory: 3Gi
            limits:
              cpu: 4000m
              memory: 6Gi
          ports:
            - containerPort: 4317
              name: otlp-grpc
            - containerPort: 4318
              name: otlp-http
            - containerPort: 8888
              name: metrics
          volumeMounts:
            - name: config
              mountPath: /conf
            - name: storage-volume
              mountPath: /var/lib/otelcol/storage
      volumes:
        - name: config
          configMap:
            name: otel-collector-tier2-gateway-config
  volumeClaimTemplates:
    - metadata:
        name: storage-volume
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 20Gi

---

Mitigating Collector Out-of-Memory (OOM) Failures with Pebble Storage

Tail-based sampling introduces memory pressure that stateless collector pipelines avoid. Holding tens of thousands of traces for 30 seconds requires substantial heap space. If an unexpected downstream network partition occurs between your cluster and the SaaS APM ingest endpoint, queued traces rapidly back up into collector RAM.

Standard in-memory queues cause the Linux kernel OOM killer (exit code 137) to terminate collector pods. When a Tier 2 collector crashes, its in-flight trace hash ring breaks, causing Tier 1 agents to re-route spans mid-stream and losing diagnostic visibility during critical incident windows.

Configuring the Pebble Disk-Backed Storage Extension

To eliminate memory-induced crashes, configure the file_storage extension backed by Pebble. Pebble is a high-performance, disk-backed LSM (Log-Structured Merge-tree) key-value engine developed by CockroachDB and integrated directly into OpenTelemetry Collector Contrib.

extensions:
  file_storage/pebble:
    directory: /var/lib/otelcol/storage
    timeout: 10s
    compaction:
      on_start: true
      directory: /var/lib/otelcol/storage/compaction
    max_txn_retries: 5

exporters:
  datadog:
    api:
      key: "${env:DD_API_KEY}"
    sending_queue:
      enabled: true
      storage: file_storage/pebble
      num_consumers: 16
      queue_size: 10000

By connecting the sending_queue to file_storage/pebble, the collector spills queued telemetry batches directly onto NVMe-backed PersistentVolumes when downstream network pressure rises. This guarantees that:

1. Heap Memory Remains Bounded: The memory_limiter processor prevents the JVM or Go runtime from consuming unbounded pod memory, maintaining predictable RSS utilization below configured limits.

2. Zero In-Flight Data Loss: If the collector pod undergoes a graceful restart or node migration, Pebble WAL (Write-Ahead Log) segments on the persistent volume are re-read upon startup, draining buffered traces without dropping production diagnostic data.

---

FinOps Impact: Benchmarking 80%+ Cost Reduction

To reduce Datadog tracing cost OpenTelemetry tail-based sampling filters out benign transactions at the infrastructure boundary before telemetry ever reaches commercial ingestion endpoints. Deploying a two-tier tail-sampling architecture fundamentally transforms tracing economics. Instead of paying ingestion fees for repetitive, healthy 200 OK operations (e.g., polling health checks, high-frequency static asset fetches, cache hits), you only ingest anomalous and high-value traces.

Below is an empirical cost and data retention comparison for an organization generating 500,000 spans per second (1.3 billion spans/day) across 100 Kubernetes nodes:

Metric / ParameterBaseline (100% Full Ingest)10% Head Probabilistic SamplingTwo-Tier Tail-Based Sampling
Daily Ingested Spans1,300,000,000130,000,000156,000,000
Monthly Ingested Spans39,000,000,0003,900,000,0004,680,000,000
SaaS APM Ingestion Bill ($1.70/1M)$66,300 / mo$6,630 / mo$7,956 / mo
SaaS Host Base Fee (100 Nodes)$3,100 / mo$3,100 / mo$3,100 / mo
Kubernetes Collector Compute Overhead$0 / mo$240 / mo (Stateless)$1,180 / mo (Tier 1 + 2)
Egress Network Transfer Costs$3,510 / mo$351 / mo$421 / mo
Total Monthly Observability Cost$72,910 / mo$10,321 / mo$12,657 / mo
Net Monthly Cost Reduction0% (Baseline)85.8%82.6%
HTTP 5xx & System Error Capture Rate100%10% (90% Discarded)100% (Complete Retention)
p95+ Latency SLA Anomaly Capture Rate100%10% (90% Discarded)100% (Complete Retention)
Root-Cause Diagnostic UsabilityHigh (Cost Prohibitive)Unusable for Edge CasesMaximum Operational Value

Analyzing the FinOps Payback Period

While head-based 10% sampling appears slightly cheaper on paper ($10,321 vs $12,657), it discards 90% of production errors, timeout spikes, and unhandled panics. During a major customer outage or performance regression, engineers are left without actionable traces, driving up Mean Time to Resolution (MTTR) and customer churn.

The two-tier tail-based sampling architecture delivers an 82.6% net cost reduction (saving $60,253 per month or $723,036 annually) while retaining 100% of errors and performance regressions. The internal Kubernetes infrastructure overhead ($1,180/month for CPU, memory, and NVMe persistent volumes) pays for itself within the first 16 hours of each monthly billing cycle.

---

Production Operational Runbook & Collector Telemetry

Operating a distributed two-tier collector pipeline requires monitoring the health of the collectors themselves. OpenTelemetry collectors expose native Prometheus metrics on port 8888.

Core Health Metrics & Alerting Thresholds

Configure your Prometheus alerting rules to monitor the following metrics across Tier 1 and Tier 2 deployments:

  # Alert: Tier 2 Memory Buffer Exhaustion
  - alert: OTelCollectorMemorySpike
    expr: otelcol_process_memory_rss{app_kubernetes_io_name="otel-collector-tier2"} > 5368709120
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "Tier 2 Collector RSS approaching 5Gi limit"

  # Alert: Dropped Spans in Tail Sampling Processor
  - alert: OTelTailSamplingDroppedSpaces
    expr: rate(otelcol_processor_tail_sampling_early_decision_wait_evicted[5m]) > 0
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Trace cache full; traces evicted before decision_wait expired. Increase num_traces."

  # Alert: Tier 1 Load Balancing Exporter Failures
  - alert: OTelLoadBalancerBackendFailures
    expr: rate(otelcol_loadbalancer_backend_latency_count{status="error"}[5m]) > 5
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "Tier 1 agent unable to route spans to Tier 2 collector endpoints."

Key Collector Operational Commands

To inspect the status of your Tier 2 collector trace buffer and check storage volume utilization in Kubernetes:

  # 1. Verify headless service DNS resolution from a Tier 1 agent pod
  kubectl exec -it daemonset/otel-collector-tier1-agent -n monitoring -- \
    nslookup otel-collector-tier2-headless.monitoring.svc.cluster.local

  # 2. Check Pebble storage disk utilization on Tier 2 collector pods
  kubectl exec -it statefulset/otel-collector-tier2-gateway -n monitoring -c otel-collector -- \
    df -h /var/lib/otelcol/storage

  # 3. Inspect real-time sampling decisions via collector Prometheus metrics
  kubectl exec -it statefulset/otel-collector-tier2-gateway -n monitoring -c otel-collector -- \
    curl -s http://localhost:8888/metrics | grep otelcol_processor_tail_sampling_count_traces_sampled

---

Frequently Asked Questions

What happens when spans arrive after the decision_wait window has expired?

If a microservice emits a late-arriving span after the configured decision_wait window (e.g., after 30 seconds), the tailsamplingprocessor handles it according to its internal cache state. If the trace evaluation has already concluded and the trace was discarded, the late-arriving span is dropped. If the trace was selected for sampling, the late span is forwarded upstream. If the trace has been evicted from memory entirely, the late span is treated as a new trace segment. For high-latency batch systems, tune decision_wait to 45s or 60s and increase num_traces proportionally.

How do horizontal pod autoscaling (HPA) events affect trace routing consistency?

When the Tier 2 StatefulSet scales up or down, the consistent hashing ring maintained by Tier 1 loadbalancingexporter instances adjusts. During the brief rebalancing transition (typically 5 to 10 seconds while DNS propagates), a small percentage of traces may have early spans routed to Pod A and later spans routed to Pod B. To minimize disruption, configure conservative HPA scaling velocity (e.g., scaleDown.stabilizationWindowSeconds: 300) and configure interval: 5s in the Tier 1 DNS resolver.

Can head-based and tail-based sampling be combined effectively?

Yes. In ultra-high-throughput architectures (> 5,000,000 spans/sec), running hybrid sampling provides additional cost optimization. You can apply coarse head-based sampling (e.g., sampling 50% at the edge) for high-frequency, non-critical endpoints such as CDN cache checks, while directing core application traffic to the two-tier tail-sampling pipeline. This reduces network ingress bandwidth while guaranteeing full fidelity for business transactions.

Does persistent Pebble file storage introduce SSD wear or I/O bottlenecks in Kubernetes?

Under standard operating conditions, Pebble writes are sequential (WAL) and memory-compacted. Spans are held primarily in RAM and only spill to the Pebble disk queue when downstream export sinks experience latency or backpressure. To ensure optimal performance on Kubernetes, back the PersistentVolume with NVMe-based storage classes (such as AWS gp3 with provisioned IOPS or Google Cloud pd-ssd) and configure an emptyDir or persistent mount with at least 3,000 IOPS.

---

Sources

Related articles