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
应该查看 HorizontalPodAutoscaler 中的“type:”值。
对于自定义指标,它应该指明“类型:对象”,对于外部指标,它应该指明“类型:外部”为mentioned here
编辑。
据我所知,这里有 4 件事: - 度量值列表 - Stackdriver 指标资源管理器 - HorizontalPodAutoscaler - Python 脚本
由于您可以在 Metric Explorer 中查看该指标,这排除了 MetricValueList 和您的 Python 脚本的问题。
知道了这一点,问题很可能出在 HorizontalPodAutoscaler 或其周围。
这个命令没有返回任何项目的事实是一个问题
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 无法获取堆栈驱动程序指标的主要内容,如果未能解决你的问题,请参考以下文章