如何基于容器网络流量指标进行弹性伸缩

本文分享自华为云社区《【自定义指标HPA】基于容器网络流量指标进行弹性伸缩》,作者: 可以交个朋友。

一、背景

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

二、方案介绍

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

参考指标:

container_network_receive_bytes_total 容器接受的网络流量,单位是字节数

container_network_transmit_bytes_total 容器传输的网络流量,单位是字节数

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

三、实践操作

3.1 安装Prometheus相关插件

建议使用华为云CCE产品,插件市场集成了kube-prometheus-stack,同时该插件也已经对接了CCE集群节点实现了节点cadvisor的指标监控。

插件安装完成后,可以通过访问prometheus UI查看指标信息:

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

kubectl -n monitoring edit configmap user-adapter-config

复制代码
 - 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

可以看到对应的指标和其返回的值。

也可以在CCE控制台进行自定义指标的查看,发现该指标已经可用:

3.4 测试HPA弹性功能

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

编写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

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

观测HPA实时动态kubectl get hpa xxx -w


可以看到随着流量指标数值的攀升,pod实例逐步开始扩容。直到扩容到实例上限。

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

四、补充

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


负载级别网络流量指标展示:

Pod实例级别网络流量指标展示:

也可前往云原生观测-监控中心-仪表盘-选择Pod视图查看流量指标信息:

对比上述配置的自定义指标计算方式求的值基本吻合

点击关注,第一时间了解华为云新鲜技术~

相关推荐
奋斗的老史8 小时前
25年Docker镜像无法下载的四种对策
docker·容器·eureka
chillxiaohan8 小时前
Docker学习记录
学习·docker·容器
柯南二号9 小时前
【后端】Docker 常用命令详解
服务器·nginx·docker·容器
新鲜萝卜皮9 小时前
容器内运行的进程,在宿主机的top命令中可以显示吗?
容器
容器魔方11 小时前
Karmada v1.15 版本发布!多模板工作负载资源感知能力增强
云原生·容器·云计算
容器魔方13 小时前
全栈AI驱动!华为云云容器引擎CCE智能助手焕新升级
云原生·容器·云计算
13线15 小时前
Windows+Docker一键部署CozeStudio私有化,保姆级
docker·容器·开源
0wioiw015 小时前
Docker(②创造nginx容器)
docker·容器
菜鸟IT胡15 小时前
docker更新jar包,懒人执行脚本
运维·docker·容器
天道有情战天下16 小时前
ClickHouse使用Docker部署
clickhouse·docker·容器