在确定处理给定队列长度所需的副本数量时,我们在弄清楚如何在 Azure 容器应用程序作业上配置自动缩放规则以使用“准确”计算方法与默认方法时遇到一些困难。 问题在于,我们的副本执行长时间运行的作业,并在容器旋转后立即将项目从队列中拉出。 (我们不会让队列中的项目处于锁定状态) 考虑到需要执行的任务量,每个正在运行的容器可能会运行 20 到 60 分钟。当缩放器再次评估队列长度时(例如 1 分钟内),队列可能已收到 2 个新项目,但由于已经有两个副本正在运行(处理 20 分钟前的 2 个先前项目),它实际上认为两个活动副本用于目前有 2 个项目位于队列中,但情况并非如此。 “准确”的计算方法应该是简单的 1 比 1。队列中的一项将启动 1 个副本,而无需假设正在运行的副本适用于队列中的现有项。
MS 文档
here指出我们应该能够充分利用任何 ScaledObject 基础 KEDA 缩放器。
以下是我们当前的缩放规则的示例,它查看队列长度并且仅按上述方式工作。
谢谢,
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: azure-servicebus-queue-scaler
namespace: default
spec:
scaleTargetRef:
kind: Deployment
name: myapp
pollingInterval: 30
cooldownPeriod: 300
minReplicaCount: 1
maxReplicaCount: 100
triggers:
- type: azure-servicebus
metadata:
namespace: "amarServiceBusNamespace"
queueName: "workflow_activity_output_queue"
messageCount: "1" # Trigger scale-out when there is at least 1 message
authenticationRef:
name: azure-servicebus-auth # Reference to the authentication secret
只需确保
messageCount
应设置为
1
以确保每条消息都会触发新的副本,并且您提供存储消息的 queueName。 创建触发认证
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: azure-servicebus-auth
namespace: default
spec:
secretTargetRef:
- parameter: connection
name: servicebus-secret
key: connectionString
但在此之前你需要创建一个
az servicebus namespace create --resource-group arkorg --name amarServiceBusNamespace --location eastus --sku Standard
还有一个队列
az servicebus queue create --resource-group arkorg --namespace-name amarServiceBusNamespace --name workflow_activity_output_queue
并部署您的 keda
helm install keda kedacore/keda --namespace keda --create-namespace
正如您已经在问题中分享的那样,容器应用程序扩展示例部分保持不变,即使用此
ScaledObject
进行扩展,并且连接字符串正确存储在指定的秘密中。
az servicebus namespace authorization-rule keys list --resource-group arkorg --namespace-name amarServiceBusNamespace --name RootManageSharedAccessKey --query primaryConnectionString --output tsv
kubectl create secret generic servicebus-secret --from-literal=connectionString="sb://amarservicebusnamespace.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=abcdefghijklmnop=" -n default
参考资料: