O componente ack-keda permite o dimensionamento automático de pods orientado por eventos ao monitorar fontes de métricas externas, como filas de mensagens. Quando as mensagens se acumulam em uma fila do RabbitMQ, o KEDA aciona um scale-out em segundos. Quando a fila esvazia, os pods reduzem de escala automaticamente.
Este tópico mostra como dimensionar um Deployment com base na métrica de comprimento da fila do ApsaraMQ for RabbitMQ.
Como funciona
O KEDA conecta sua instância do ApsaraMQ for RabbitMQ ao Horizontal Pod Autoscaler (HPA) do Kubernetes por meio da seguinte cadeia de recursos:
Um Secret armazena a string de conexão do RabbitMQ.
Um TriggerAuthentication referencia o Secret para que o KEDA possa se autenticar no RabbitMQ.
Um ScaledObject define qual Deployment dimensionar, qual fila monitorar e o limiar que aciona o dimensionamento.
O KEDA consulta periodicamente o comprimento da fila e envia a métrica ao HPA para ajustar a contagem de réplicas.
Pré-requisitos
Antes de começar, certifique-se de ter:
O componente ack-keda implantado no seu cluster. Para mais informações, consulte Event-driven scaling
Uma instância do ApsaraMQ for RabbitMQ e os recursos relacionados criados. Para mais informações, consulte crie recursos
O
kubectlconectado ao seu cluster. Para mais informações, consulte Connect to a cluster using kubectlinstale um ambiente de execução Go
Etapa 1: Implantar uma carga de trabalho de exemplo
Agora, crie um Deployment que sirva como alvo de dimensionamento. Em um cenário de produção, substitua a imagem do contêiner pela sua aplicação consumidora real do RabbitMQ.
Acesse o console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, selecione seu cluster. No menu à esquerda, clique em .
-
Na página Deployments, clique em Create from YAML. defina Sample Template como Custom, cole o YAML a seguir e clique em Create.
apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: default labels: app: sample-app spec: replicas: 2 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: consumer image: consumer # Replace with your actual RabbitMQ consumer image. resources: limits: cpu: "500m"
Etapa 2: configure o KEDA para dimensionar com base no comprimento da fila do RabbitMQ
Esta etapa conecta o KEDA à sua instância do ApsaraMQ for RabbitMQ e define as regras de dimensionamento.
Coletar detalhes de conexão do RabbitMQ
Acesse o console do ApsaraMQ for RabbitMQ. No painel de navegação à esquerda, clique em Instances.
-
Clique no nome da sua instância. Na página Instance Details, clique em aba Endpoint Information e anote um endpoint.
AvisoUm endpoint público expõe sua instância ao acesso externo. Este tutorial usa um endpoint público apenas para fins de demonstração. Se o seu cluster ACK e a instância do RabbitMQ estiverem na mesma vpc, use o endpoint interno da vpc.
-
Ainda no menu lateral, clique em Users and Permissions. Anote o Username e a Password.
Se não houver nenhum usuário, consulte Users and Permissions para criar um.
No painel lateral, clique em Vhosts. Anote o valor de Vhost (por exemplo,
amq-test).
Criar um Secret e um TriggerAuthentication
-
Crie uma string de conexão codificada em Base64 com o seguinte comando. Substitua os placeholders pelos valores que você anotou.
Placeholder
Descrição
Exemplo
<rabbitmq-username>Nome de usuário do console do RabbitMQ
Mjpt****<rabbitmq-password>Senha do console do RabbitMQ
QT****<endpoint>Endpoint público ou interno
amqp-cn-****.amqp-0.net.mq.amqp.aliyuncs.com<vhost>Nome do host virtual
amq-testecho -n "amqp://<rabbitmq-username>:<rabbitmq-password>@<endpoint>:5672/<vhost>" | base64 -
Salve o YAML a seguir como
secret.yaml. Substitua o valor dehostpela string Base64 da etapa anterior.apiVersion: v1 kind: Secret metadata: name: keda-rabbitmq-secret data: host: YW1x****** # Your Base64-encoded connection string. -
Salve o código YAML abaixo no arquivo
trigger-auth.yaml. Este TriggerAuthentication informa ao KEDA como se autenticar no RabbitMQ ao referenciar o Secret.apiVersion: keda.sh/v1alpha1 kind: TriggerAuthentication metadata: name: keda-trigger-auth-rabbitmq-conn namespace: default spec: secretTargetRef: - parameter: host name: keda-rabbitmq-secret key: host -
Aplique ambos os arquivos:
kubectl apply -f secret.yaml kubectl apply -f trigger-auth.yaml
Criar um ScaledObject
Um ScaledObject vincula um Deployment a um gatilho do KEDA. A configuração a seguir dimensiona o Deployment sample-app com base no comprimento da fila queue-test.
-
Salve o seguinte YAML como
scaledobject.yaml:Parâmetro
Descrição
scaleTargetRef.nameO Deployment alvo do dimensionamento. defina como a aplicação criada na Etapa 1.
maxReplicaCountNúmero máximo de réplicas.
minReplicaCountNúmero mínimo de réplicas.
protocolProtocolo de conexão com o RabbitMQ. Valores válidos:
auto,http,amqp.queueNameA fila do RabbitMQ monitorada.
modeA métrica usada para o dimensionamento. defina como
QueueLengthpara dimensionar com base no número de mensagens na fila.valueO limiar que aciona um scale-out.
metricNameO nome da métrica personalizada enviada ao HPA. Geralmente defina como o nome da fila.
apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: rabbitmq-scaledobject namespace: default spec: scaleTargetRef: name: sample-app maxReplicaCount: 10 minReplicaCount: 1 triggers: - type: rabbitmq metadata: protocol: amqp queueName: queue-test mode: QueueLength value: "20" metricName: queue-test authenticationRef: name: keda-trigger-auth-rabbitmq-conn -
Aplique o ScaledObject:
kubectl apply -f scaledobject.yaml
verifique a configuração
-
verifique o status do ScaledObject. Saída esperada:
kubectl get ScaledObjectNAME SCALETARGETKIND SCALETARGETNAME MIN MAX TRIGGERS AUTHENTICATION READY ACTIVE FALLBACK AGE rabbitmq-scaledobject apps/v1.Deployment sample-app 1 10 rabbitmq keda-trigger-auth-rabbitmq-conn True False False 17s -
verifique o status do HPA. Saída esperada:
TARGETS: 0/20 (avg)mostra o comprimento atual da fila (0) comparado ao limiar (20).kubectl get hpaNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-rabbitmq-scaledobject Deployment/sample-app 0/20 (avg) 1 10 2 2m35s
Etapa 3: Testar o comportamento de dimensionamento
Produza e consuma mensagens para observar o scale-out e o scale-in na prática. Os programas Go a seguir se conectam diretamente ao ApsaraMQ for RabbitMQ.
Produzir mensagens para acionar o scale-out
-
Crie um arquivo chamado
producer.gocom o código a seguir. Substitua<username>,<password>,<endpoint>e<vhost>pelos valores que você anotou anteriormente. O formato da URL éamqp://username:password@endpoint:5672/vhost.package main import ( "fmt" "log" "time" "github.com/streadway/amqp" ) const ( queueName = "queue-test" // Must match the queueName in your ScaledObject. numMsgs = 10000 pauseTime = 10 * time.Millisecond url = "amqp://<username>:<password>@<endpoint>:5672/<vhost>" ) func main() { conn, err := amqp.Dial(url) failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() q, err := ch.QueueDeclare( queueName, true, false, false, false, nil, ) failOnError(err, "Failed to declare a queue") go produce(ch, q) select {} } // produce publishes messages to the queue. func produce(ch *amqp.Channel, q amqp.Queue) { for i := 0; i < numMsgs; i++ { msg := fmt.Sprintf("Message %d", i) err := ch.Publish( "", q.Name, false, false, amqp.Publishing{ ContentType: "text/plain", Body: []byte(msg), }, ) failOnError(err, "Failed to publish a message") log.Printf("Published message: %s", msg) time.Sleep(pauseTime) } } func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) } } -
Inicialize o módulo Go e baixe as dependências:
go mod init producer go mod tidy -
execute o producer:
go run producer.go -
Em um terminal separado, acompanhe o scale-out do HPA. Saída esperada: A contagem de réplicas aumenta até o máximo (10) conforme as mensagens se acumulam na fila.
kubectl get hpaNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-rabbitmq-scaledobject Deployment/sample-app 443000m/20 (avg) 1 10 10 9m15s
Consumir mensagens para observar o scale-in
-
Interrompa o programa producer. Crie o arquivo
consumer.gocom o código a seguir. Substitua a constanteurlpela sua string de conexão do RabbitMQ.package main import ( "fmt" "log" "github.com/streadway/amqp" ) const ( queueName = "queue-test" url = "amqp://<username>:<password>@<endpoint>:5672/<vhost>" ) func main() { conn, err := amqp.Dial(url) failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() _, err = ch.QueueDeclare( queueName, true, // durable false, // exclusive false, // no-wait false, // auto-delete nil, ) failOnError(err, "Failed to declare a queue") msgs, err := ch.Consume( queueName, "", // consumer tag true, // auto-ack false, // exclusive false, // no-local false, // no-wait nil, ) failOnError(err, "Failed to register a consumer") go func() { for msg := range msgs { log.Printf("Received: %s", msg.Body) fmt.Printf("Processed: %s\n", msg.Body) } }() select {} } func failOnError(err error, msg string) { if err != nil { log.Fatalf("%s: %s", msg, err) } } -
execute o consumer:
go run consumer.go -
Monitore o HPA em tempo real. Saída esperada: Após o consumer esvaziar a fila, a métrica alvo cai para 0. Depois de um período sem consumo de dados, o KEDA reduz a escala do Deployment de volta para a contagem mínima de réplicas (1).
kubectl get hpa -wNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE keda-hpa-rabbitmq-scaledobject Deployment/sample-app 443000m/20 (avg) 1 10 10 9m15s keda-hpa-rabbitmq-scaledobject Deployment/sample-app 235000m/20 (avg) 1 10 10 9m51s keda-hpa-rabbitmq-scaledobject Deployment/sample-app 0/20 (avg) 1 10 10 10m keda-hpa-rabbitmq-scaledobject Deployment/sample-app 0/20 (avg) 1 10 1 15m
Limpeza
exclua os recursos criados neste tutorial, execute os comandos a seguir:
kubectl delete -f scaledobject.yaml
kubectl delete -f trigger-auth.yaml
kubectl delete -f secret.yaml
kubectl delete deployment sample-app
Referências
KEDA based on RocketMQ metrics -- Configure o HPA com base nas métricas de acúmulo de mensagens do ApsaraMQ for RocketMQ.