Skip to content

Multi-cluster scaling with DistributedScaledObject (ConfigMap trigger)

This guide shows how to scale one workload across multiple member clusters using DistributedScaledObject (DSO) with a kubernetes-resource trigger reading a ConfigMap value.

  • Kedify Agent is installed in your KEDA cluster.
  • Multi-cluster member clusters are already registered in kedify-agent-multicluster-kubeconfigs.
  • DistributedScaledObject controller is enabled in Kedify Agent.
  • kubectl installed and access to:
    • KEDA cluster context
    • each member cluster context

Enable DSO controller if needed:

Terminal window
kubectl -n keda set env deploy/kedify-agent DSO_ENABLED="true"
  • KEDA cluster runs Kedify Agent and the DistributedScaledObject resource.
  • Member clusters run identical Deployment workloads.
  • Trigger source is a ConfigMap in the KEDA cluster.

When ConfigMap key metric-value is higher than target value 5, DSO increases desired replicas and distributes them across member clusters by weights.

Step 1: Deploy the same workload to member clusters

Section titled “Step 1: Deploy the same workload to member clusters”

Apply this manifest to each member cluster in the same namespace (default in this example):

apiVersion: apps/v1
kind: Deployment
metadata:
name: dso-demo-app
namespace: default
spec:
replicas: 0
selector:
matchLabels:
app: dso-demo-app
template:
metadata:
labels:
app: dso-demo-app
spec:
containers:
- name: app
image: nginx:1.27
ports:
- containerPort: 80

Example apply commands:

Terminal window
kubectl --context member-1 apply -f dso-demo-app.yaml
kubectl --context member-2 apply -f dso-demo-app.yaml

Step 2: Create trigger ConfigMap in the KEDA cluster

Section titled “Step 2: Create trigger ConfigMap in the KEDA cluster”

Create ConfigMap in the KEDA cluster (same namespace where you will create DSO):

apiVersion: v1
kind: ConfigMap
metadata:
name: dso-mock-metric
namespace: default
data:
metric-value: "0"
Terminal window
kubectl --context keda-cluster apply -f dso-mock-metric.yaml

Apply this DistributedScaledObject in the KEDA cluster:

apiVersion: keda.kedify.io/v1alpha1
kind: DistributedScaledObject
metadata:
name: dso-demo
namespace: default
spec:
memberClusters:
- name: member-1
weight: 4
- name: member-2
weight: 6
scaledObjectSpec:
scaleTargetRef:
kind: Deployment
name: dso-demo-app
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: kubernetes-resource
metadata:
resourceKind: ConfigMap
resourceName: dso-mock-metric
key: metric-value
targetValue: "5"
Terminal window
kubectl --context keda-cluster apply -f distributedscaledobject.yaml

Increase the metric value above the target:

Terminal window
kubectl --context keda-cluster -n default patch configmap dso-mock-metric \
--type merge \
-p '{"data":{"metric-value":"20"}}'

Set it back below target to scale down:

Terminal window
kubectl --context keda-cluster -n default patch configmap dso-mock-metric \
--type merge \
-p '{"data":{"metric-value":"0"}}'

Check DSO status in KEDA cluster:

Terminal window
kubectl --context keda-cluster -n default get distributedscaledobject dso-demo -o yaml

Check replicas in each member cluster:

Terminal window
kubectl --context member-1 -n default get deploy dso-demo-app
kubectl --context member-2 -n default get deploy dso-demo-app

You should observe replica distribution following weights (member-1:4, member-2:6) within rounding limits.

  • DSO does not scale:
    • Verify DSO_ENABLED="true" on kedify-agent.
    • Verify member cluster names in spec.memberClusters exactly match registered member names.
    • Verify Deployment name and namespace are identical across member clusters.
  • Trigger not firing:
    • Verify ConfigMap exists in the same namespace as DSO.
    • Verify metric-value is numeric and above targetValue.
  • Member cluster stays at 0 replicas:
    • Check DSO status field memberClusterStatuses for connectivity or auth issues.