Exploring advanced scalers beyond ordinary queues: GitHub API, Azure Storage Queue, GCP Cloud Storage, external-push, and community scalers. Then combining KEDA with Argo Rollouts, Knative, and service mesh.

In episode 16 we saw KEDA working alongside Karpenter to scale nodes. Up to this point, our examples revolved around SQS and Redis — but KEDA has more than 70 scalers, and many work outside the classic queue pattern. This episode covers Advanced Scalers & Ecosystem: scalers that interact with external APIs, push events, and how KEDA pairs with Argo Rollouts, Knative, and service mesh. After this, your mental model of "what can scale what" will broaden drastically.
The GitHub scaler allows autoscaling based on GitHub activity — not a queue. A real example: scaling pipeline runners or labeling bots based on the remaining API rate limit or the number of unresolved issues. KEDA reads the GitHub API with a personal token:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: github-triage-bot
spec:
scaleTargetRef:
name: triage-bot
maxReplicaCount: 5
triggers:
- type: github
metadata:
owner: devnull
repository: devvnull.vercel.app
query: "is:issue is:open"
authenticationRef:
name: github-tokenThe metric KEDA calculates from the query above is the number of open issues. The triage bot scales up when issues pile up, then drops to zero when the triage queue is clean. Another popular case: a query based on the rate limit — the bot stops scaling as github.rate_limit.remaining approaches zero, preventing the API from being throttled.
In episode 8 we covered SQS. Two other cloud analogs use a similar scheme with their own credential providers.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: azure-worker
spec:
scaleTargetRef:
name: azure-worker
maxReplicaCount: 30
triggers:
- type: azure-queue
metadata:
queueName: jobs
queueLength: "10"
connectionFromEnv: AZURE_STORAGE_CONNECTION_STRINGAuthentication can use a connection string from env, or podIdentity with Azure workload identity.
The GCP Cloud Storage scaler works based on the number of objects in a particular bucket or folder:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: gcs-processor
spec:
scaleTargetRef:
name: gcs-processor
maxReplicaCount: 20
triggers:
- type: gcp-storage
metadata:
bucketName: ingest-bucket
prefix: "raw/"
count: "10"KEDA counts the objects in raw/; once it exceeds 10, the gcs-processor replicas increase. This is the typical data pipeline pattern: files land, workers process, files get deleted, replicas drop — compute costs only exist when there's data.
Some events can't be efficiently polled — like a message broker that needs to push, or an internal system with a proprietary API. KEDA provides two paths:
push gRPC call to KEDA — ideal for events that come rarely but must be fast, avoiding expensive polling. For internal systems, use a custom gRPC external scaler (covered in depth in episode 10).KEDA pairs naturally with Argo Rollouts for metric-aware canary and blue-green deployments. Argo Rollouts shifts traffic gradually to the new version; its analysis can consume KEDA metrics. This is the combination that makes deployment assessment quality-based — not just "pods ready".
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: checkout-service
spec:
strategy:
canary:
steps:
- setWeight: 25
- analysis:
templates:
- templateName: error-rate
selector:
matchLabels:
app: checkout-service
template:
metadata:
labels:
app: checkout-service
spec:
containers:
- name: checkout
image: ghcr.io/devnull/checkout:v2The analysis template uses Prometheus metrics that can come from a KEDA scaler:
apiVersion: argoproj.io/v1beta1
kind: AnalysisTemplate
metadata:
name: error-rate
spec:
metrics:
- name: error-rate
prometheus:
address: http://prometheus.monitoring:9090
query: sum(rate(http_requests_total{status="5xx"}[5m]))When the error rate crosses the threshold, the Rollout aborts the canary and returns traffic to the old version. KEDA autoscales pods; Argo Rollouts manages the release.
Tip
There are three often-confused layers: KEDA handles the number of replicas based on events, Argo Rollouts handles the application version with canary, and HPA behavior handles the scaling speed. All three can be installed on the same Deployment without conflict — as long as the scale target stays consistent.
Knative Serving has its own autoscaler that scales a Revision from zero based on concurrency and requests. KEDA and Knative can both scale-to-zero, but with different philosophies:
| Aspect | KEDA | Knative Serving |
|---|---|---|
| Trigger | External events (queue, lag, metrics) | HTTP traffic / concurrency |
| Scaling unit | Ordinary Deployment replicas | Knative Revision |
| Scale-to-zero | minReplicaCount: 0 | Default mode |
| Best for | Workers, batch, event-driven | Serverless HTTP API |
They're complementary: use Knative for request-driven APIs that need scale-from-zero with automatic traffic routing, and KEDA for workers triggered by backlog. Where Knative uses an activator to buffer requests during scale-to-zero, the KEDA HTTP Add-on uses an interceptor for the same role.
With a service mesh (Istio/Linkerd), KEDA still works at the Deployment layer — regardless of how traffic is routed. What you need to watch:
istio_requests_total) as a trigger — a replacement for the interceptor when all traffic goes through the mesh.repo scope. The GitHub scaler fails with 403 when the token has no read permission — test with curl -s https://api.github.com/rate_limit before creating the ScaledObject.prefix in GCP Storage. Without a prefix, KEDA counts every object in the bucket — unexpected sudden scale-up.This episode broadened the scaler horizon: GitHub for repo activity, Azure Storage Queue and GCP Cloud Storage for cloud data pipelines, external-push for events that can't be polled, and community scalers that need careful review. At the ecosystem layer, KEDA works alongside Argo Rollouts for metric-aware canary, Knative for HTTP scale-from-zero, and service mesh for concurrency control.
Points you should take away:
With so many scalers and integrations, when something fails in production you need to know how to investigate it. In the next episode, 18, we discuss Troubleshooting & Monitoring: diagnosing ScaledObjects with kubectl, reading operator logs, making use of keda_scaler_* metrics, and solving common issues like Unknown status, stale HPA updates, and webhook errors. See you in episode 18!