Skip to main content
This guide explains how to configure KEDA (Kubernetes Event-driven Autoscaling) to automatically scale your Sawmills Collector based on real-time metrics. KEDA enables dynamic, event-driven scaling, ensuring your collector adapts to changing workloads efficiently.

Prerequisites

Before you begin, ensure you have:
  • The Sawmills Collector deployed and running in the sawmills namespace
  • KEDA installed in your Kubernetes cluster (KEDA installation guide)
  • (Optional) Prometheus deployed if you want to use Prometheus-based scaling

Enabling KEDA Autoscaling for Sawmills

KEDA can be enabled and configured via the Sawmills Collector Helm chart. The configuration is managed under the managedCharts.sawmills-collector.keda section in your values.yaml file.

Step 1: Enable KEDA in Helm Values

Add or update the following section in your values.yaml of the remote operator:
managedCharts:
  sawmills-collector:
    keda:
      enabled: true
      minReplicas: 1
      maxReplicas: 10
      pollingInterval: 30      # How often KEDA checks metrics (seconds)
      cooldownPeriod: 300      # Wait time after last scaling before scaling down (seconds)
      scaling:
        prometheus:
          enabled: false       # Set true to use Prometheus-based scaling
          metadata:
            serverAddress: http://prometheus:9090
            query: "histogram_quantile(0.95, sum(rate(http_server_duration_bucket[1m])) by (le))"
            threshold: "2000"
            activationThreshold: "1000"
        external:
          enabled: false       # Set true to use OTLP-based external scaler (the Sawmills based solution)
          metadata:
            scalerAddress: "sawmills-collector-keda-otel-scaler.sawmills.svc.cluster.local:4418"
            query: "histogram_quantile(0.95, sum(rate(http_server_duration_bucket[1m])) by (le))"
            targetValue: "2000"
        cpu:
          enabled: true
          targetUtilization: 80
        memory:
          enabled: true
          targetUtilization: 80
  • minReplicas/maxReplicas: Minimum and maximum number of collector pods.
  • pollingInterval: How often KEDA checks metrics for scaling decisions.
  • cooldownPeriod: How long to wait after scaling before scaling down.
  • scaling: Configure one or more scaling sources (Prometheus, external, CPU, memory).

Step 2: Apply the Configuration

After updating your values.yaml, upgrade your Sawmills Collector release:
helm upgrade --install sawmills-remote-operator \
  oci://public.ecr.aws/s7a5m1b4/sawmills-remote-operator-chart \
  --version <latest-version> \
  --namespace sawmills \
  --set apiKeyExistingSecret=sawmills-secret \
  --set operatorAddress=https://controller.ue1.prod.plat.sm-svc.com \
  --set collectorName="my-collector" \
  -f values.yaml

KEDA Scaling Options

You can configure KEDA to scale based on different metrics sources:

1. Prometheus-based Scaling

Enable scaling.prometheus.enabled: true and provide the Prometheus server address and PromQL query. Example:
scaling:
  prometheus:
    enabled: true
    metadata:
      serverAddress: http://prometheus:9090
      query: "sum(rate(otelcol_receiver_accepted_spans[1m]))"
      threshold: "1000"
      activationThreshold: "500"

2. External Scaler (OTLP) Scaling

Enable scaling.external.enabled: true to use the KEDA OTLP external scaler. Example:
scaling:
  external:
    enabled: true
    metadata:
      scalerAddress: "sawmills-collector-keda-otel-scaler.sawmills.svc.cluster.local:4418"
      query: "sum(rate(otelcol_receiver_accepted_spans[1m]))"
      targetValue: "1000"

3. CPU/Memory-based Scaling

Enable scaling.cpu.enabled and/or scaling.memory.enabled to scale based on resource utilization:
scaling:
  cpu:
    enabled: true
    targetUtilization: 80
  memory:
    enabled: true
    targetUtilization: 80

Example: Full KEDA Configuration

Here is a complete example for enabling KEDA with multiple scaling sources:
managedCharts:
  sawmills-collector:
    keda:
      enabled: true
      minReplicas: 2
      maxReplicas: 20
      pollingInterval: 30
      cooldownPeriod: 300
      scaling:
        prometheus:
          enabled: true
          metadata:
            serverAddress: http://prometheus:9090
            query: "sum(rate(otelcol_receiver_accepted_spans[1m]))"
            threshold: "2000"
            activationThreshold: "1000"
        external:
          enabled: false
          metadata: {}
        cpu:
          enabled: true
          targetUtilization: 75
        memory:
          enabled: false

KEDA Scaler Component for OpenTelemetry

The Sawmills Helm chart includes an optional KEDA scaler component for advanced OTLP-based scaling. To enable it, set:
managedCharts:
  sawmills-collector:
    kedaScaler:
      enabled: true
      # Additional configuration as needed
Refer to the Helm chart documentation for advanced configuration options.

Verifying KEDA Autoscaling

  1. Check KEDA ScaledObject
    kubectl get scaledobject -n sawmills
    # Should show a ScaledObject for your collector
    
  2. Check Collector Pod Scaling
    kubectl get pods -n sawmills -l app.kubernetes.io/name=sawmills-collector
    # Observe the number of pods scaling up/down based on load
    
  3. Check KEDA Operator Logs
    kubectl logs -n keda -l app=keda-operator
    # Look for scaling decisions and errors
    

Troubleshooting KEDA Autoscaling

  • ScaledObject Not Created: Ensure keda.enabled: true and Helm upgrade completed successfully.
  • Pods Not Scaling: Check metric queries, thresholds, and KEDA operator logs for errors.
  • Prometheus/External Metrics Not Detected: Verify Prometheus/external scaler endpoints are reachable and queries return expected results.
  • Resource-based Scaling Not Working: Ensure CPU/memory requests and limits are set on the collector pods.

Best Practices for KEDA with Sawmills

  • Start with conservative scaling thresholds and adjust based on observed workloads.
  • Use multiple scaling sources (e.g., CPU and Prometheus) for robust autoscaling.
  • Monitor KEDA and collector logs for scaling anomalies.
  • Test scaling behavior under simulated load before deploying to production.
  • For advanced scenarios, leverage the external scaler for custom OTLP metrics.

References

For further assistance with KEDA configuration for Sawmills, contact the Sawmills team or consult the Collector Customization Guide.