To get started with Keda Azure Service Bus, you'll need to create a namespace in the Azure portal. This is where you'll define the settings for your Service Bus.
Keda is a Kubernetes-based open-source project that allows you to scale serverless functions and tasks. It integrates with Azure Service Bus to manage message queues.
First, create a Service Bus namespace in the Azure portal. This will give you a unique URL for your Service Bus instance.
Keda uses Azure Service Bus as a message broker to manage the scaling of serverless functions and tasks.
Getting Started
KEDA (Kubernetes-based Event-Driven Autoscaling) is a lightweight and highly scalable event-driven autoscaler for Azure Service Bus.
First, you need to create an Azure Service Bus namespace. This can be done through the Azure portal or using the Azure CLI.
KEDA requires a namespace to be created before it can be used. This is because KEDA uses the Azure Service Bus namespace to manage and scale your applications.
To get started with KEDA, you'll need to install the KEDA CLI. This can be done by running a simple command in your terminal.
Once installed, you can start creating your first Azure Service Bus trigger. This will allow you to scale your applications based on the number of messages in your Azure Service Bus queue.
Remember to configure your Azure Service Bus namespace to use KEDA. This involves setting up the necessary permissions and configurations.
With KEDA up and running, you can start scaling your applications in real-time. This means your applications will automatically scale up or down based on the number of messages in your Azure Service Bus queue.
Configuration
The configuration of KEDA with Azure Service Bus is relatively straightforward. You can configure KEDA to scale your Azure Service Bus triggers based on the number of messages in the queue.
To get started, you need to create a KEDA scaling configuration. This can be done by specifying the maximum number of concurrent executions and the minimum number of executions.
The scaling configuration is then tied to the Azure Service Bus trigger, allowing KEDA to scale the trigger based on the number of messages in the queue. This ensures that your application only processes a certain number of messages at a time, preventing overload and improving performance.
Prerequisites
To configure Azure Functions, you'll need to set up the right tools and software. You'll need to have Visual Studio Code installed on your computer.
You'll also need the Azure Tools Extension for VS Code, which will give you access to Azure-specific features and tools. This extension will help you develop, debug, and deploy Azure Functions.
Another important tool is the Azure Functions Core Tools, which will allow you to run and test your Azure Functions locally. You can install this tool using npm or yarn.
In addition to these tools, you'll need to have Docker Desktop installed on your Windows or Mac computer. This will give you a container runtime that you can use to build and deploy Azure Functions.
You'll also need Kubernetes set up on your computer, either using minikube or Docker Desktop. This will give you a way to deploy and manage your Azure Functions at scale.
KEDA (Kubernetes Event-Driven Autoscaling) is another tool you'll need to have installed. This will allow you to scale your Azure Functions based on the number of events they receive.
Finally, you'll need to have an Azure Subscription and an Azure Service Bus set up under that subscription. This will give you the necessary resources to deploy and manage your Azure Functions.
Trigger Specification
Trigger Specification is a crucial part of Azure Service Bus Queue or Topic scaling, and it's essential to understand the parameters involved.
The azure-servicebus trigger specification describes the trigger for Azure Service Bus Queue or Topic, and it's not in charge of managing entities. This means if the queue, topic, or subscription doesn't exist, it won't create them automatically.
You need to specify the messageCount, which is the amount of active messages in your Azure Service Bus queue or topic to scale on.
The parameter list includes several optional parameters, such as activationMessageCount, queueName, topicName, subscriptionName, namespace, connectionFromEnv, useRegex, operation, and cloud.
Here's a summary of the parameter list:
- messageCount - Amount of active messages in your Azure Service Bus queue or topic to scale on.
- activationMessageCount - Target value for activating the scaler (Default: 0, Optional)
- queueName - Name of the Azure Service Bus queue to scale on (Optional)
- topicName - Name of the Azure Service Bus topic to scale on (Optional)
- subscriptionName - Name of the Azure Service Bus queue to scale on (Optional*, Required when topicName is specified)
- namespace - Name of the Azure Service Bus namespace that contains your queue or topic (Optional*, Required when pod identity is used)
- connectionFromEnv - Name of the environment variable your deployment uses to get the connection string of the Azure Service Bus namespace (Optional)
- useRegex - Provides indication whether or not a regex is used in the queueName or subscriptionName parameters (Values: true, false, Default: false, Optional)
- operation - Defines how to compute the number of messages when useRegex is set to true (Values: sum, max, or avg, Default: sum, Optional)
- cloud - Name of the cloud environment that the service bus belongs to (valid values: AzurePublicCloud, AzureUSGovernmentCloud, AzureChinaCloud, AzureGermanCloud, Private; default: AzurePublicCloud)
If you set the cloud to Private, you need to specify the endpointSuffix parameter, which is required. Otherwise, it's automatically generated based on the cloud environment.
Deployment
Deployment is a crucial step in integrating KEDA with Azure Service Bus. You can deploy KEDA runtime in your Kubernetes clusters using Helm charts, Operator Hub, or YAML declarations.
To deploy KEDA, you'll need a Kubernetes cluster version 1.24 or higher. This is a requirement, so make sure your cluster meets this version before proceeding.
You can choose from three deployment methods: Helm charts, Operator Hub, or YAML declarations. Each method has its own advantages, but Helm charts are a popular choice due to their ease of use.
Here are the three deployment methods listed:
- Helm charts
- Operator Hub
- YAML declarations
Once you've chosen a deployment method, you'll need to configure your deployment files. In the example, the author used a folder called "manifests" to store their deployment files. This folder contained two files: deployment.yml and scaledobject.yml.
The deployment.yml file is used to configure the pod on AKS, while the scaledobject.yml file is used to configure KEDA to scale the application based on Azure Service Bus events.
Testing
Testing is a crucial step in ensuring your Keda Azure Service Bus setup is working as expected. You can test your function locally by sending 100 events to your ServiceBus queue, which your function running locally will consume.
To test the docker image, you'll need to pass values for certain variables, which can be taken from the `localsettings.json` file. Simply run the docker command, check the container ID using `docker ps`, and review the logs with `docker logs`.
You can verify that your function is working correctly by using the Service Bus Explorer to post a message, which should be read by the function running within the docker container.
Testing It Locally
Testing it locally is a great way to ensure your Azure function is working as expected. This script will send 100 events to your ServiceBus queue and your function running locally will consume all these events.
To test it locally, you'll want to run the script and verify that your function is processing the events correctly. By testing it locally, you can catch any issues before deploying your function to the cloud.
You can test your function locally by running the script and checking the logs to see if your function is processing the events as expected. This will help you identify any issues with your function's logic or configuration.
Top Comments (1)
Deploying durable functions to Keda can be a bit tricky, but one approach is to use the Keda trigger to scale your functions.
You can have activity functions in different pods so they can scale individually, which is a great way to optimize performance and efficiency.
It's worth noting that this approach requires careful configuration and monitoring to ensure that the functions are scaling correctly.
Troubleshooting and Scaling
Troubleshooting with KEDA and Azure Service Bus can be a challenge, but there are ways to mitigate errors. Throttling by Azure Service Bus is a common cause of errors, resulting in invalid queue runtime properties with no CountDetails element.
To fix this, you can try scaling the Azure Service Bus namespace to a higher SKU, or use premium, to increase its capacity. Alternatively, you can increase the polling interval of the ScaledObject/ScaledJob, or use caching of metrics to reduce the load on the Service Bus.
Here are some potential solutions to consider:
- Scaling the Azure Service Bus namespace to a higher SKU, or use premium
- Increase the polling interval of the ScaledObject/ScaledJob
- Use caching of metrics
Troubleshooting
Troubleshooting is an essential part of scaling your applications, and KEDA logs can often provide valuable insights into what's going wrong. If you're seeing errors similar to "invalid queue runtime properties: no CountDetails element", it's usually a sign that Azure Service Bus is being throttled.
This can happen for a few reasons, but the good news is that there are some easy fixes. One option is to scale up your Azure Service Bus namespace to a higher SKU, or even use the premium version.
Increasing the polling interval of the ScaledObject or ScaledJob can also help alleviate the issue. This can be done by tweaking the settings of your scaled objects.
Another potential solution is to use caching of metrics. This can help reduce the load on Azure Service Bus and prevent throttling from occurring in the first place.
Here are some potential mitigations to consider:
Auto Scaling
Auto Scaling is a feature that allows your application to automatically adjust its resources based on the workload. This is achieved through the use of KEDA, which uses a Scaled Object to autoscale pods.
KEDA works by polling a metrics server at a specified interval, which in this case is every 30 seconds. This interval can be adjusted by modifying the pollingInterval property in the ScaledObject.
The cooldownPeriod property is also important, as it determines how long to wait before scaling down the pods completely to 0. This default value is 300 seconds.
The queuelength property is used by KEDA to trigger scaling, and its default value is 5.
Here are the key components of a ScaledObject used for auto scaling:
- scaleTargetRef: This indicates the deployment that needs to be auto scaled up/down
- triggers: This specifies the type of trigger used to scale the deployment, in this case, it is azure-servicebus
- pollingInterval: This is the interval used by KEDA to poll the metrics server
- cooldownPeriod: This is the time to wait before scaling down the pods completely to 0
- queuelength: This is the property used by KEDA to trigger the scaling
By adjusting these properties, you can fine-tune your auto scaling strategy to meet the needs of your application.
Sources
- https://keda.sh/docs/2.16/scalers/azure-service-bus/
- https://thekrishna.medium.com/what-is-keda-49a184848522
- https://dzone.com/articles/autoscale-azure-pipeline-agents-with-keda
- https://dev.to/arthuravila26/azure-functions-running-on-kubernetes-using-keda-2pi5
- https://swaminathanvetri.in/2020/03/16/autoscaling-azure-functions-with-service-bus-triggers-using-keda/
Featured Images: pexels.com