Camel K Integration Scaling
Manual Scaling
An Integration can be scaled using the kubectl scale
command, e.g.:
$ kubectl scale it <integration_name> --replicas <number_of_replicas>
This can also be achieved by editing the Integration resource directly, e.g.:
$ kubectl patch it <integration_name> -p '{"spec":{"replicas":<number_of_replicas>}}'
The Integration also reports its number of replicas in the .status.replicas
field, e.g.:
$ kubectl get it <integration_name> -o jsonpath='{.status.replicas}'
Autoscaling with Knative
An Integration that deploys as a Knative Service can automatically scale based on incoming traffic, including scaling to zero.
The incoming traffic measures either as:
-
The number of simultaneous requests, that are processed by each replica at any given time;
-
Or the number of requests that are processed per second, per replica.
That implies the Integration must expose a container port, that receives incoming requests, and complies with the Knative runtime contract. This is the case when the Integration either:
-
Exposes an HTTP endpoint, using the Camel HTTP component or the REST DSL, e.g.:
rest('/') .produces("text/plain") .get() .route() .transform().constant("Response");
-
Or consumes Knative events, from a Broker or a Channel, using the Knative component, e.g.:
from("knative:channel/events") .convertBodyTo(String.class) .to("log:info")
The Knative Autoscaler can be configured using the Knative Service trait, e.g., to set the scaling upper bound (the maximum number of replicas):
$ kamel run -t knative-service.max-scale=10
More information can be found in the Knative Autoscaling documentation.
When manually scaling an Integration, that deploys as a Knative Service, both scale bounds, i.e., |
Autoscaling with HPA
An Integration can automatically scale based on its CPU utilization and custom metrics using horizontal pod autoscaling (HPA).
For example, executing the following command creates an autoscaler for the Integration, with target CPU utilization set to 80%, and the number of replicas between 2 and 5:
$ kubectl autoscale it <integration_name> --min=2 --max=5 --cpu-percent=80
Integration metrics can also be exported for horizontal pod autoscaling (HPA), using the custom metrics Prometheus adapter, so that the Integration can scale automatically based on its own metrics.
If you have an OpenShift cluster, you can follow Exposing custom application metrics for autoscaling to set it up.
Assuming you have the Prometheus adapter up and running, you can create a HorizontalPodAutoscaler
resource based on a particular Integration metric, e.g.:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: camel-k-autoscaler
spec:
scaleTargetRef:
apiVersion: camel.apache.org/v1
kind: Integration
name: example
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: application_camel_context_exchanges_inflight_count
target:
type: AverageValue
averageValue: 1k
the HPA can work when the Integration replica field needs to be specified. You need to scale the Integration via kubectl scale it my-it --replicas 1 or edit the .spec.replicas field of your Integration to 1. This is due to a Kubernetes behavior which does not allow an empty value on the resource to scale. |
More information can be found in Horizontal Pod Autoscaler from the Kubernetes documentation.
HPA can also be used with Knative, by installing the HPA autoscaling Serving extension. |