Kubernetes HPA未能从Stackdriver检测到成功发布的自定义度量

Kubernetes HPA未能从Stackdriver检测到成功发布的自定义度量,kubernetes,google-kubernetes-engine,stackdriver,google-cloud-stackdriver,Kubernetes,Google Kubernetes Engine,Stackdriver,Google Cloud Stackdriver,我正在尝试使用HorizontalPodAutoscaler扩展Kubernetes部署,它通过Stackdriver侦听自定义指标 我有一个GKE集群,启用了Stackdriver适配器。 我可以将自定义度量类型发布到Stackdriver,下面是它在Stackdriver的度量资源管理器中的显示方式 这就是我如何定义我的HPA: apiVersion: autoscaling/v2beta1 kind: HorizontalPodAutoscaler metadata: name:

我正在尝试使用
HorizontalPodAutoscaler
扩展Kubernetes
部署,它通过Stackdriver侦听自定义指标

我有一个GKE集群,启用了Stackdriver适配器。 我可以将自定义度量类型发布到Stackdriver,下面是它在Stackdriver的度量资源管理器中的显示方式

这就是我如何定义我的
HPA

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: custom.googleapis.com|worker_pod_metrics|baz
      targetValue: 400
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-app-group-1-1
成功创建
示例hpa
后,执行
kubectl get hpa example hpa
,始终将
目标显示为
,并且从不从自定义度量中检测值

NAME          REFERENCE                       TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
example-hpa   Deployment/test-app-group-1-1   <unknown>/400   1         10        1          18m

我现在导出为
custom.googleapis.com/baz
,而不是
custom.googleapis.com/worker\u pod\u metrics/baz
。另外,现在我在yaml中为我的HPA显式指定
名称空间

因为您可以在Stackdriver GUI中看到您的自定义度量,我猜度量是否正确导出。基于我认为您错误地定义了HPA用于扩展部署的指标

请尝试使用此YAML:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metricName: baz
      targetAverageValue: 400
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-app-group-1-1
请记住:

HPA使用这些指标计算平均值,并将其与 目标平均值。在Stackdriver导出的应用程序中 例如,部署包含导出度量的POD。以下 清单文件描述了一个HorizontalPodAutoscaler对象,该对象可缩放 基于度量的目标平均值的部署

上介绍的故障排除步骤也很有用

旁注
由于以上HPA使用的是beta API
autoscaling/v2beta1
我在运行
kubectl description HPA[DEPLOYMENT\u NAME]
时出错。我运行了
kubectl description hpa[DEPLOYMENT\u NAME]--v=9
,并得到了JSON的响应。

将一些独特的标签放在指标上是一个很好的做法。现在,根据java客户机中标记的指标,只有
pod_id
看起来是唯一的,因为它是无状态的,所以无法使用

因此,我建议您尝试引入一个部署/度量范围的unqiue标识符

resourceLabels.put("<identifier>", "<could-be-deployment-name>");

默认情况下,HPA使用kubernetes中
度量服务器
的cpu。K8s不知道您使用的指标是什么。您需要像部署自定义适配器/度量服务器一样部署。检查我已经启用的引用(我使用的是遗留资源模型)。还有什么我弄错了吗?我也尝试过使用
type:Pods
而不是
type:External
,但是由于某种原因它不起作用。但是,我通过创建一个新项目、一个新服务帐户和一个新集群,并使用
type:Pods
,成功地实现了这一点。谢谢你的回答:)。我想,以前我的角色配置可能有错误。谢谢你的建议!
resourceLabels.put("<identifier>", "<could-be-deployment-name>");
kind: HorizontalPodAutoscaler
metadata:
  name: example-hpa
spec:
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: External
    external:
      metricName: custom.googleapis.com|worker_pod_metrics|baz
      metricSelector:
        matchLabels:
          # define labels to target
          metric.labels.identifier: <deployment-name>
      # scale +1 whenever it crosses multiples of mentioned value
      targetAverageValue: "400"
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: test-app-group-1-1
 kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/custom.googleapis.com|worker_pod_metrics|baz" | jq