带有外部度量的Kubernetes hpa.我的外部度量没有返回正确的值



我想根据所有AWS SQS队列中未处理消息的总数,使用HPA扩展我的worker pod。由于没有这样的度量,我使用lambda函数创建了一个自定义度量。我正在使用k8s cloudwatch适配器。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.

只是出于某种原因,它返回null值,而不是返回正确的值。cloudwatch适配器权限没有问题。HPA不会抛出任何错误。只是它显示的价值是";0";当它应该返回"0"时;15〃;就我而言。

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

Lambda:

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

HPA:

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

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

最新更新