【自定义指标HPA】基于容器网络流量指标进行弹性伸缩

举报
可以交个朋友 发表于 2024/03/05 16:51:01 2024/03/05
【摘要】 业务程序非CPU、memeory敏感类业务,希望可以基于流量指标进行HPA弹性伸缩,但是大部分程序并没有集成Prometheus SDK相关代码进行插桩。此时可以通过cAdvisor提供的容器网络流量指标实现业务峰谷期间的弹性扩缩容

一、背景

业务程序非CPU、memeory敏感类业务,希望可以基于流量指标进行HPA弹性伸缩,但是大部分程序并没有集成Prometheus SDK相关代码进行插桩。此时可以通过cAdvisor提供的容器网络流量指标实现业务峰谷期间的弹性扩缩容。


二、方案介绍

cAdvisor负责节点上的容器和节点本身资源的统计,内置在kubelet中,并通过kubelet的/metrics/cadvisor 接口对外提供API。它可以采集容器网络累积接收数据总量容器网络累积传输数据总量,即网络流入和流出指标。

参考指标:

  • container_network_receive_bytes_total 容器接受的网络流量,单位是字节数
    image.png
  • container_network_transmit_bytes_total 容器传输的网络流量,单位是字节数
    image.png

上面两个指标都是counter计数器类型,对应的值只增不减。在配置自定义指标转换规则时需要做下速率换算,将总量换算成每秒接受多少字节数的流量指标。


三、实践操作

3.1 安装Prometheus相关插件

建议使用华为云CCE产品,插件市场集成了kube-prometheus-stack,同时该插件也已经对接了CCE集群节点实现了节点cadvisor的指标监控。
image.png
插件安装完成后,可以通过访问prometheus UI查看指标信息:
image.png


3.2 配置Prometheus-adapter指标转换规则

kubectl -n monitoring edit configmap user-adapter-config
image.png

 - seriesQuery: 'container_network_receive_bytes_total{namespace!="",pod!=""}'
   seriesFilters: []
   resources:
     overrides:
       namespace:
         resource: namespace
       pod:
         resource: pod
   name:
     matches: container_(.*)_total
     as: "pod_${1}_per_second"
   metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000

 - seriesQuery: 'container_network_transmit_bytes_total{namespace!="",pod!=""}'
   seriesFilters: []
   resources:
     overrides:
       namespace:
         resource: namespace
       pod:
         resource: pod
   name:
     matches: container_(.*)_total
     as: "pod_${1}_per_second"
   metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000

注意: 修改后需要重启monitoring命名空间下的custom-metrics-apiserver负载实例。
其中metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000 配置表示 最近3min内pod每秒接受的请求量,由于container_network_receive_bytes_totalcontainer_network_transmit_bytes_total 是counter类型的指标,指标数值会一直递增,所以需要将指标做下速率换算。 除以/1000 则表示以kb为单位,默认单位是字节数,查出来的值会很大,该处可以根据实际情况进行配置。
resources处配置则是将Prometheus中查询的指标和K8s集群中的资源进行匹配映射。
name处配置则是将Prometheus查询出来的指标,进行重命名处理,增强指标可读性。


3.3 验证自定义弹性指标是否可用

调用接口访问自定义指标:
kubectl get --raw="/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/pod_network_receive_bytes_per_second" |jq
可以看到对应的指标和其返回的值。
image.png
也可以在CCE控制台进行自定义指标的查看,发现该指标已经可用:
image.png


3.4 测试HPA弹性功能

主要是观测能否根据该指标,即容器每秒接受的网络流量指标进行动态阔缩容。

  1. 编写HPA yaml文件,创建HPA弹性伸缩策略

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: hpa-app07
      namespace: default
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: app07
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: pod_network_receive_bytes_per_second
          target:
            type: AverageValue
            averageValue: 10
    

  2. 然后通过执行命令 while true; do curl clusterIP:port;done 进行压测,创造访问流量。


  3. 观测HPA实时动态kubectl get hpa xxx -w
    image.png
    可以看到随着流量指标数值的攀升,pod实例逐步开始扩容。直到扩容到实例上限。
    image.png


  4. 停止压测观察HPA缩容变化,直到最后只剩下一个pod在运行。
    image.png


四、补充

  • 如何在CCE测查看负载实例的网络流量指标信息
    image.png

  • 负载级别网络流量指标展示:
    image.png

  • Pod实例级别网络流量指标展示:
    image.png

  • 也可前往云原生观测-监控中心-仪表盘-选择Pod视图查看流量指标信息:
    image.png
    对比上述配置的自定义指标计算方式求的值基本吻合
    image.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。