Kubernetes HPA 与 Prometheus Node-Exporter 的指标

Posted

技术标签:

【中文标题】Kubernetes HPA 与 Prometheus Node-Exporter 的指标【英文标题】:Kubernetes HPA with metrics from Prometheus Node-Exporter 【发布时间】:2019-03-18 01:08:14 【问题描述】:

我有一个运行我的一些工作负载的 kubernetes v1.12.1 集群。我想设置 HPA,以便我可以根据来自 Prometheus Node-Exporter 的指标来扩展特定的 POD。

我的第一个问题是,是否可以对“POD”度量命名空间之外的度量执行 HPA?如果是这样,那么这就是我想要做的其余部分。我已经设置 Prometheus Node-Exporter 来收集机器/节点指标并将它们发送到 Prometheus。 Prometheus 通过 prometheus 适配器将这些发送到 Kubernetes。我想根据这些节点指标值之一执行 POD 自动缩放。

例如,如果:node_netstat_Udp_NoPorts >= '1',我会想扩展一个额外的 POD。另一个如果 node_sockstat_udp_mem >= '87380' 我还想横向扩展并对主机执行轻微的内核级别修改。

我遇到的问题是,我找不到任何关于如何为 POD 设置 HPA 的示例,其中自定义指标不属于“POD”指标命名空间。

正如您在下面我的 API get 命令中看到的那样,这些指标向我公开。

<pre>
ᐅ kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1|jq .|grep -i udp
  "name": "jobs.batch/node_netstat_Udp_InErrors",
  "name": "roles.rbac.authorization.k8s.io/node_netstat_Udp6_NoPorts",
  "name": 
"roles.rbac.authorization.k8s.io/node_netstat_UdpLite6_InErrors",
  "name": "jobs.batch/node_netstat_Udp_InDatagrams",
  "name": "jobs.batch/node_sockstat_UDP_mem_bytes",
  "name": "jobs.batch/node_sockstat_UDP_inuse",
  "name": 
"roles.rbac.authorization.k8s.io/node_netstat_Udp_InDatagrams",
  "name": "jobs.batch/node_sockstat_UDP_mem",
  "name": "jobs.batch/node_netstat_Udp_NoPorts",
  "name": "roles.rbac.authorization.k8s.io/node_sockstat_UDP_mem",
  "name": "roles.rbac.authorization.k8s.io/node_netstat_Udp_NoPorts",
  "name": "jobs.batch/node_netstat_Udp6_OutDatagrams",
  "name": "jobs.batch/node_netstat_Udp6_NoPorts",
  "name": "jobs.batch/node_netstat_UdpLite6_InErrors",
  "name": "roles.rbac.authorization.k8s.io/node_netstat_Udp6_InErrors",
  "name": 
"roles.rbac.authorization.k8s.io/node_netstat_Udp6_InDatagrams",
  "name": 
"roles.rbac.authorization.k8s.io/node_netstat_Udp6_OutDatagrams",
  "name": "roles.rbac.authorization.k8s.io/node_sockstat_UDP_inuse",
  "name": 
"roles.rbac.authorization.k8s.io/node_sockstat_UDP_mem_bytes",
  "name": "jobs.batch/node_netstat_Udp6_InDatagrams",
  "name": "jobs.batch/node_netstat_Udp_OutDatagrams",
  "name": 
"roles.rbac.authorization.k8s.io/node_netstat_UdpLite_InErrors",
  "name": "jobs.batch/node_netstat_UdpLite_InErrors",
  "name": 
"roles.rbac.authorization.k8s.io/node_sockstat_UDPLITE_inuse",
  "name": "jobs.batch/node_netstat_Udp6_InErrors",
  "name": 
"roles.rbac.authorization.k8s.io/node_netstat_Udp_OutDatagrams",
  "name": "jobs.batch/node_sockstat_UDPLITE_inuse",
  "name": "roles.rbac.authorization.k8s.io/node_netstat_Udp_InErrors"
</pre>

我只是不明白如何将其中一个添加到 HPA 描述符中:

apiVersion:自动缩放/v2beta2 种类:Horizo​​ntalPodAutoscaler 元数据: 名称:atl 命名空间:黑洞 规格: 规模目标参考: api版本:应用程序/v1 种类:部署 名称:真棒应用 minReplicas: 1 最大副本数:10 指标: - 类型:资源 资源:?????? 姓名: ??????????? 目标: ???????????

如果有人能帮助我指出正确的方向,那就太好了。

谢谢!

【问题讨论】:

如果您的指标来自节点导出器,为什么它们都与工作和角色相关联?您的 Prometheus Adapter 配置是什么(或者您使用的是哪个 Custom Metrics API 服务器)? 【参考方案1】:

文档有点粗略,但我相信你会使用这样的东西:

apiVersion: autoscaling/v2beta2                                                                                                   
kind: HorizontalPodAutoscaler                                                                                                     
metadata:                                                                                                                         
  name: atl                                                                                                                       
  namespace: blackhole                                                                                                             
spec:                                                                                                                             
  scaleTargetRef:                                                                                                                 
    apiVersion: apps/v1                                                                                                           
    kind: Deployment                                                                                                              
    name: awesome-app                                                                                                                   
  minReplicas: 1                                                                                                                  
  maxReplicas: 10                                                                                                                 
  metrics:
  - type: Object
    object:
      metric:
        name: node_sockstat_UDP_inuse
      describedObject:
        apiVersion: extensions/v1beta1
         kind: Job
        name: your-job-name
      target:
        kind: Value
        value: 20                                                                                                                     

根据docs type: Resource 默认情况下仅限于 CPU 和内存指标。

【讨论】:

谢谢,我会试试这个。非常感谢!

以上是关于Kubernetes HPA 与 Prometheus Node-Exporter 的指标的主要内容,如果未能解决你的问题,请参考以下文章

Docker&Kubernetes ❀ Kubernetes集群Pod控制器 - Horizontal Pod Autoscaler(HPA)

Kubernetes HPA 与 Prometheus Node-Exporter 的指标

HPA 缩减 kubernetes pod

Kubernetes 弹性伸缩全场景解析 - HPA 实践手册

Kubernetes HPA 动态弹性扩缩容

云原生之kubernetes实战kubernetes集群的HPA弹性伸缩