是否可以从configmap中为Horizo​​ntalPodAutoscaler设置外部度量的名称? GKE

时间:2020-07-11 15:20:20

标签: kubernetes google-kubernetes-engine google-cloud-pubsub

我正在修改一个使用Horizo​​ntalPodAutoscaler(HPA)自动缩放的部署。此部署是管道的一部分,在管道中,工作人员从pubsub订阅中读取消息,进行一些工作并发布到下一个主题。现在,我使用configmap来定义部署的管道(configmap包含输入订阅和输出主题)。 HPA根据输入订阅上的消息数自动缩放。我希望能够从configmap中提取HPA的订阅名称?有办法吗?

HPA示例:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: my-deployment-hpa
  namespace: default
  labels:
    name: my-deployment-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - external:
        metricName: pubsub.googleapis.com|subscription|num_undelivered_messages
        metricSelector:
          matchLabels:
            resource.labels.subscription_id: "$INPUT_SUBSCRIPTION"
        targetAverageValue: "2"
      type: External
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-deployment

理想情况下,当前$INPUT_SUBSCRIPTION的HPA中的值可以来自配置映射。

1 个答案:

答案 0 :(得分:0)

将此答案作为社区Wiki发布,以获得更好的可见性,并在评论中提供了答案。

回答帖子中的问题:

如果可能,我希望能够从configmap中提取HPA的订阅名称?有办法吗?

正如用户@Abdennour TOUMI指出的那样,无法用HPA设置ConfigMap使用的度量标准:

不幸的是,您不能..但是可以使用prometheus-adapter + HPA。检查此Tuto:itnext.io/...


关于手动解决方法,您可以使用脚本从configMap中提取所需的指标名称,并使用模板替换并应用新的HPA

>

使用configMap,例如:

apiVersion: v1
kind: ConfigMap
metadata:
  name: example
data:
  metric_name: "new_awesome_metric" # <-
  not_needed: "only for example" 

以及以下脚本:

#!/bin/bash

# variables
hpa_file_name="hpa.yaml"
configmap_name="example"
string_to_replace="PLACEHOLDER"

# extract the metric name used in a configmap
new_metric=$(kubectl get configmap $configmap_name -o json | jq '.data.metric_name')

# use the template to replace the $string_to_replace with your $new_metric and apply it
sed "s/$string_to_replace/$new_metric/g" $hpa_file_name | kubectl apply -f -

此脚本将需要带有模板的hpa.yaml才能将其用作资源(问题中的示例可以与更改一起使用:

  • resource.labels.subscription_id: PLACEHOLDER

有关更多参考,此HPA定义可以基于本指南:

Cloud.google.com: Kubernetes Engine: Tutorials: Autoscaling-metrics: PubSub