写点什么

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

  • 2024-03-06
    广东
  • 本文字数:1870 字

    阅读完需:约 6 分钟

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

本文分享自华为云社区《【自定义指标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/v2kind: HorizontalPodAutoscalermetadata:  name: hpa-app07  namespace: defaultspec:  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 视图查看流量指标信息:



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



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

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
如何基于容器网络流量指标进行弹性伸缩_容器_华为云开发者联盟_InfoQ写作社区