0

我想根据所有 AWS SQS 队列中未完成消息的总数使用 HPA 扩展我的工作 pod。由于没有这样的指标可用,我使用 lambda 函数创建了一个自定义指标。我正在使用 k8s-cloudwatch-adapter。 https://aws.amazon.com/blogs/compute/scaling-kubernetes-deployments-with-amazon-cloudwatch-metrics/

我已经测试了我的 lambda 函数。它返回正确的值,并且指标也被推送到 cloudwatch。我的 cloudwatch 适配器也能够注册外部指标。我使用以下命令对其进行了验证:

$ kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq.

只是由于某种原因,它返回空值而不是返回正确的值。cloudwatch 适配器权限没有问题。HPA 不会抛出任何错误。只是它在我的情况下应该返回“15”时显示为“0”。

我认为这是因为我在外部指标清单中提供了一些错误的查询。这就是我所有文件的样子。(不包括 cloudwatch 适配器清单文件)

拉姆达:

import boto3
def lambda_handler(event, context):
    client = boto3.client('sqs')

    listOfQueues = client.list_queues(
        QueueNamePrefix='test'
    )

    listOfQueues = listOfQueues["QueueUrls"]
    #print(listOfQueues)

    numberOfQueues= len(listOfQueues)
    print("Total number of queues: %s" %(numberOfQueues))

    totalOutstandingMessages=0

    for i in range(0, numberOfQueues):
        messages = client.get_queue_attributes(
            QueueUrl=listOfQueues[i],
            AttributeNames=[
                'ApproximateNumberOfMessages',
            ]
        )
        messages= messages["Attributes"]["ApproximateNumberOfMessages"]
        totalOutstandingMessages=totalOutstandingMessages+int(messages)
    print("Total number of Outsanding Messages: %s" %(totalOutstandingMessages))

    cloudwatch = boto3.client('cloudwatch')

    response = cloudwatch.put_metric_data(
        Namespace='CustomSQSMetrics',
        MetricData=[
            {
                'MetricName': 'OutstandingMessagesTest',
                'Dimensions': [
                    {
                        'Name': 'TotalOutStandingMessages',
                        'Value': 'OutStandingMessages'
                    },
                ],
                'Values': [
                    totalOutstandingMessages,
                ],
            },
        ]
    )
    print(response)

外部指标清单:

kind: ExternalMetric
metadata:
  name: outstanding-messages
spec:
  name: outstanding-messages
  resource:
    resource: "deployment"
  queries:
    - id: sqs_helloworld
      metricStat:
        metric:
          namespace: "CustomSQSMetrics"
          metricName: "OutstandingMessagesTest"
          dimensions:
            - name: TotalOutStandingMessages
              value: "OutStandingMessages"
        period: 300
        stat: Maximum
        unit: Count
      returnData: true

高压钠灯:

apiVersion: autoscaling/v2beta1
metadata:
  name: workers-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: workers
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: outstanding-messages
      targetValue: 12
4

1 回答 1

0

这得到了解决。这是因为只有当我手动部署/测试我的 lambda 时,指标数据才会被推送到 cloudwatch。因此,当外部指标试图获取该值时,在那个特定时刻,它接收到一个空值。我将 cron 作业添加到我的 lambda 中,以便它每分钟运行一次。每分钟发布哪些数据被推送到 cloudwatch,并且随时可以通过外部指标获取。完成此外部指标后,我们能够获取数据,并且 Hpa 能够扩展我的 pod。

于 2022-01-07T11:21:34.257 回答