我想根据所有 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