首页 > 其他分享 >如何基于容器网络流量指标进行弹性伸缩

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

时间:2024-03-06 11:12:48浏览次数:28  
标签:容器 伸缩 container network bytes 网络流量 指标 pod

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

一、背景

业务程序非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弹性功能

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

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

image.png

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

image.png

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

image.png

四、补充

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

 

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

 

标签:容器,伸缩,container,network,bytes,网络流量,指标,pod
From: https://www.cnblogs.com/huaweiyun/p/18056089

相关文章

  • Docker数据库容器(四)
    前言前面都以Nginx容器为例,介绍很Docker容器的运用。但是对于数据库的容器,在创建的时候却涉及到了Docker的环境变量设置,这个对于很多项目都是非常重要的。所以这里单独深入了解这类型的容器创建。一、创建这里以Mysql容器为例,用之前Nginx的创建方式来创建容器。~]#d......
  • Docker多容器和通信搭建(二)
    前言前面介绍了Docker容器的基础服务搭建,对于Docker容器来说一般都是多个容器项目运行在服务器上。所以这篇主要讲述多容器之间的交互,以及宿主与容器之间的交互问题。一、部署多容器接着以Nginx为例,部署多个Nginx容器进行测试。~]#dockerrun-d--namenginx-p80......
  • ConfigMap挂载与Subpath在Nginx容器中的应用
    本文分享自华为云社区《nginx.conf以configmap文件形式挂载到nginx容器中以及subpath使用场景》,作者:可以交个朋友。背景nginx.conf通过configmap文件形式挂载到容器内,可以更加方便的修改nginx.conf配置方案简介将配置文件nginx.conf以configmap文件的方式挂载到容器中。为了更......
  • Docker容器实战(00)-基础命令大全
    1容器生命周期管理1.1dockerstart启动一或多个已被停止的容器。#启动已被停止的容器myrunoobdockerstartmyrunoob1.2dockerstop停止一个运行中的容器dockerstopmyrunoob1.3dockerrestart重启容器dockerrestartmyrunoob1.4dockerrun创建一个新的容......
  • 并发容器精讲——面试杀手锏
    并发容器精讲——面试杀手锏目录并发容器精讲——面试杀手锏并发容器概览趣说集合类的历史——古老和过时的同步容器ConcurrentHashMap(重点、面试常考)为什么HashMap是线程不安全的?HashMap1.7结构HashMap1.8结构HashMap关于并发的特点JDK1.7ConcurrentHashMap实现和分析JDK1......
  • 17_两种IOC容器注入的类型
    两种IOC容器注入的类型基于接口的注入在基于接口的注入中,您使用接口来定义依赖项。这允许您在不更改代码的情况下轻松地切换依赖项的不同实现。代码示例:publicinterfaceIMyDependency{voidDoSomething();}publicclassMyClass{privatereadonlyIMyDependen......
  • 37vector容器与API
    vector容器与API#include<iostream>#include<vector>usingnamespacestd;/*vector容器:向量容器底层数据结构:动态开辟的数组,每次以原来空间2倍进行扩容vector<int>vec;增加:vec.push_back(20);末尾添加元素O(1)导致容器扩容vec.insert(it,20);it迭代器指向的位......
  • 40容器适配器
    容器适配器标准容器-容器适配器适配器底层没有自己的数据结构,它是另外一个容器的封装,它的方法全部由底层依赖的容器实现。容器适配器没有实现自己的迭代器。参考stack,deque依赖deque;priority_deque依赖vector前者的原因:vector的初始内存使用效率太低,需要多次resize;......
  • 41无序关联容器与有序关联容器
    无序关联容器与有序关联容器参考迭代器普通的正向迭代器iterator反向迭代器reverse_iterator常量迭代器:const_iterator是iterator的基类,返回一个常指针vector<int>vec;vector<int>::iteratorit=vec.begin();//可以通过*it修改vec的值vector<int>::reverse_iterator......
  • docker容器命令
      docker是基于linux内核的,必须需要linux系统才能运行起来。1.创建容器实例dockerrun[options]image[command][arg...] #启动交互式容器命令dockerrun-itubuntu/bin/bash  宿主机的端口:docker中的端口。 2.查看正在运行的容器dockerps【options】......