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

打印 上一主题 下一主题

主题 547|帖子 547|积分 1641

本文分享自华为云社区《【自定义指标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
  1. - seriesQuery: 'container_network_receive_bytes_total{namespace!="",pod!=""}'
  2.    seriesFilters: []
  3.    resources:
  4.      overrides:
  5.        namespace:
  6.          resource: namespace
  7.        pod:
  8.          resource: pod
  9.    name:
  10.      matches: container_(.*)_total
  11.      as: "pod_${1}_per_second"
  12.    metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000
  13. - seriesQuery: 'container_network_transmit_bytes_total{namespace!="",pod!=""}'
  14.    seriesFilters: []
  15.    resources:
  16.      overrides:
  17.        namespace:
  18.          resource: namespace
  19.        pod:
  20.          resource: pod
  21.    name:
  22.      matches: container_(.*)_total
  23.      as: "pod_${1}_per_second"
  24.    metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000
复制代码
注意: 修改后必要重启monitoring定名空间下的custom-metrics-apiserver负载实例。
其中metricsQuery: sum(rate({}[3m])) by ()/1000 设置表示 近来3min内pod每秒接受的哀求量,由于container_network_receive_bytes_total和container_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弹性伸缩计谋
  1. apiVersion: autoscaling/v2
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4.   name: hpa-app07
  5.   namespace: default
  6. spec:
  7.   scaleTargetRef:
  8.     apiVersion: apps/v1
  9.     kind: Deployment
  10.     name: app07
  11.   minReplicas: 1
  12.   maxReplicas: 10
  13.   metrics:
  14.   - type: Pods
  15.     pods:
  16.       metric:
  17.         name: pod_network_receive_bytes_per_second
  18.       target:
  19.         type: AverageValue
  20.         averageValue: 10
复制代码
然后通过实行命令 while true; do curl clusterIP:port;done 进行压测,创造访问流量。
观测HPA实时动态kubectl get hpa xxx -w

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

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

四、补充

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

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

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

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

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

 
点击关注,第一时间相识华为云新鲜技能~
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表