GKE K8 HPA 无法获取堆栈驱动程序指标

Posted

技术标签:

【中文标题】GKE K8 HPA 无法获取堆栈驱动程序指标【英文标题】:GKE K8 HPA is unable to get stackdriver metric 【发布时间】:2020-04-27 02:01:29 【问题描述】:

我们有一个 k8 gke 集群,我们希望通过我们的应用程序逻辑向堆栈驱动程序公开的自定义指标来扩展我们的 pod

我能够推送指标并能够在指标资源管理器中查看 图片

我们可以在 k8 自定义指标列表中看到指标 kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | python -m json.tool | grep -a10 num_drivers_per_pod


            "kind": "MetricValueList",
            "name": "*/custom.googleapis.com|num_drivers_per_pod",
            "namespaced": true,
            "singularName": "",
            "verbs": [
                "get"
            ]
        

我们已成功安装 stackdriver 适配器并与 heapster 一起运行

但是当我们部署给定的 HPA 清单时

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-sd-num-drivers
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: test-ws-api-server
  minReplicas: 1
  maxReplicas: 5
  metrics:
    - type: Pods
      pods:
        metricName: "num_drivers_per_pod"
        targetAverageValue: 2

k8 集群无法通过以下消息获取指标

Name:               custom-metric-sd-num-drivers
Namespace:          default
Labels:             <none>
Annotations:        autoscaling.alpha.kubernetes.io/conditions:
                      ["type":"AbleToScale","status":"True","lastTransitionTime":"2020-01-07T14:26:25Z","reason":"SucceededGetScale","message":"the HPA control...
                    autoscaling.alpha.kubernetes.io/current-metrics:
                      ["type":"External","external":"metricName":"custom.googleapis.com|num_drivers_per_pod","currentValue":"0","currentAverageValue":"1"]
                    autoscaling.alpha.kubernetes.io/metrics: ["type":"Pods","pods":"metricName":"num_drivers_per_pod","targetAverageValue":"2"]
                    kubectl.kubernetes.io/last-applied-configuration:
                      "apiVersion":"autoscaling/v2beta1","kind":"HorizontalPodAutoscaler","metadata":"annotations":,"name":"custom-metric-sd-num-drivers","n...
CreationTimestamp:  Tue, 07 Jan 2020 19:56:10 +0530
Reference:          Deployment/test-ws-api-server
Min replicas:       1
Max replicas:       5
Deployment pods:    1 current / 1 desired
Events:
  Type     Reason               Age                   From                       Message
  ----     ------               ----                  ----                       -------
  Warning  FailedGetPodsMetric  47s (x6237 over 27h)  horizontal-pod-autoscaler  unable to get metric num_drivers_per_pod: no metrics returned from custom metrics API

以下是推送指标的代码

def put_k8_pod_metric(metric_name,value,metric_type="k8s_pod"):
    try:
        client = monitoring_v3.MetricServiceClient()
        series = monitoring_v3.types.TimeSeries()
        series.metric.type = f'custom.googleapis.com/metric_name'
        series.resource.type = metric_type
        series.resource.labels['project_id'] = os.getenv("PROJECT_NAME")
        series.resource.labels['location'] = os.getenv("POD_LOCATION","asia-south1")
        series.resource.labels['cluster_name'] = os.getenv("CLUSTER_NAME","data-k8cluster")
        series.resource.labels['namespace_name'] = "default"
        series.resource.labels['pod_name'] = os.getenv("MY_POD_NAME","wrong_pod")
        point = series.points.add()
        point.value.double_value = value
        now = time.time()
        point.interval.end_time.seconds = int(now)
        point.interval.end_time.nanos = int(
            (now - point.interval.end_time.seconds) * 10**9)
        project_name = client.project_path(os.getenv('PROJECT_NAME'))
        client.create_time_series(project_name, [series],timeout=2)
        logger.info(f"successfully send the metric metric_name with value value")
    except Exception as e:
        traceback.print_exc()
        logger.info(f"failed to send the metric metric_name with value value")

你们能否指点一下在哪里寻找以及可能导致问题的原因

嘿刚刚解决了与部署 apiversion 冲突以及移回 gke_container 资源类型的问题。我已经在 python 中发布了一个简单的 repo 来实现相同的gke-hpa-custom-metric-python

【问题讨论】:

您是否能够使用 wget 从服务端点(在您的情况下是自定义指标 Stackdriver 适配器)手动检索指标?你的问题看起来类似于这个one 你是说这个吗--> kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/num_drivers_per_pod" "kind":"MetricValueList","apiVersion":"custom.metrics.k8s.io/v1beta1","metadata":"selfLink":"/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/%2A/num_drivers_per_pod","items":[] 我可以得到指标,但是里面没有项目(豆荚) 【参考方案1】:

我发现this post 描述了与您类似的问题。

可能存在与“external.metrics”和“custom.metrics”相关的混淆。

这里类型设置为“外部”,但名称表示“自定义”:

["type":"External","external":"metricName":"custom.googleapis.com

应该查看 Horizo​​ntalPodAutoscaler 中的“type:”值。

对于自定义指标,它应该指明“类型:对象”,对于外部指标,它应该指明“类型:外部”为mentioned here

编辑。

据我所知,这里有 4 件事: - 度量值列表 - Stackdriver 指标资源管理器 - Horizo​​ntalPodAutoscaler - Python 脚本

由于您可以在 Metric Explorer 中查看该指标,这排除了 MetricValueList 和您的 Python 脚本的问题。

知道了这一点,问题很可能出在 Horizo​​ntalPodAutoscaler 或其周围。

这个命令没有返回任何项目的事实是一个问题

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/num_drivers_per_pod"

【讨论】:

我关注 cloud.google.com/kubernetes-engine/docs/tutorials/… ,它说应该使用类型 pod,我尝试运行相同的教程,它能够获取 HPA 指标,不同之处在于我的指标生产者在 python 中,发布的 python 有什么问题,我可以在 metric explorer 中看到指标

以上是关于GKE K8 HPA 无法获取堆栈驱动程序指标的主要内容,如果未能解决你的问题,请参考以下文章

K8S HPA - 无法从外部指标 API 获取指标

k8s Metrics Server 获取资源指标与 hpa 部署

GKE 上的 HPA 将部署扩展到 0

Hpa 没有获取现有的自定义指标?

如何在 GKE 控制台中查看 HPA 自动缩放定义

1.4.7 HPA 横向自动扩容 4.8 statefulset