Warning: Still under development. Not meant for production deployment.
To enable KEDA Autoscaling of Knative Event Sources (and other components in the future) there is a separate controller implemented, ie. no hard dependency in Knative.
This contoller is watching for CustomResourcesDefinitions
resources in the cluster, if there is installed a new CRD which is supported by this controller a new dynamic controller watching these resources is created.
Currently there is support for Kafka Source and AWS SQS Source.
This controller requires k8s.io client version >= 0.18, therefore it is using custom fork of knative/pkg and knative/eventing.
It is needed to install KEDA v2, which is using different namespace for it's CRDs (keda.k8s.io
-> keda.sh
).
Currently there is development (Alpha) version of KEDA v2, to install it follow instructions on: https://github.com/kedacore/keda/tree/v2#how-can-i-try-keda-v2-alpha-version
Confirm there are 2 pods running in keda
namespace:
$ kubectl get pods -n keda
NAME READY STATUS RESTARTS AGE
keda-metrics-apiserver-7cf7765dc8-k9lnc 1/1 Running 0 5m2s
keda-operator-55658855fc-rc9rb 1/1 Running 0 5m3s
export KO_DOCKER_REPO=...
ko apply -f config/
Confirm there is 1 pod running in autoscaler-keda
namespace:
$ kubectl get pods -n autoscaler-keda
NAME READY STATUS RESTARTS AGE
controller-76fb8d6756-5f4vm 1/1 Running 0 21m
-
Set up Kafka Cluster, eg. use Strimzi operator
-
Install Knative Serving and Eventing
-
Install Knative Eventing Kafka Source
-
Create
KafkaSource
resource, with annotationautoscaling.knative.dev/class: keda.autoscaling.knative.dev
. There are other KEDA related annotations, see the example:
apiVersion: sources.knative.dev/v1alpha1
kind: KafkaSource
metadata:
name: kafka-source
namespace: default
annotations:
autoscaling.knative.dev/class: keda.autoscaling.knative.dev
autoscaling.knative.dev/minScale: "0"
autoscaling.knative.dev/maxScale: "5"
keda.autoscaling.knative.dev/pollingInterval: "3"
keda.autoscaling.knative.dev/cooldownPeriod: "10"
keda.autoscaling.knative.dev/kafkaLagThreshold: "2"
spec:
consumerGroup: knative-group
bootstrapServers:
- my-cluster-kafka-bootstrap.openshift-operators:9092
topics:
- test
sink:
ref:
apiVersion: serving.knative.dev/v1
kind: Service
name: event-display
- Check that
ScaledObject
was created for thisKafkaSource
:
$ kubectl get scaledobjects
oc get so
NAME SCALETARGETKIND SCALETARGETNAME TRIGGERS AUTHENTICATION READY ACTIVE AGE
so-f87369e5-c320-4f44-b23a-8c535a523e3a apps/v1.Deployment kafkasource-kafka-source-f87369e5-c320-4f44-b23a-8c535a523e3a kafka True False 6m5s