首页 > 其他分享 >实践解析HPA各关联组件扭转关系

实践解析HPA各关联组件扭转关系

时间:2023-12-20 10:00:55浏览次数:28  
标签:缩容 metrics 指标 API 组件 HPA 解析 type

本文分享自华为云社区《HPA各关联组件扭转关系以及建议》,作者:可以交个朋友。

一、背景

应用程序的使用存在波峰波谷现象,在应用流量处于低谷期间,可以释放因过多的Pod而浪费的硬件资源。在应用流量高峰期提供弹性足够的Pod处理流量。

二、HPA各个组件扭转关系

kubernetes使用者通过创建一个hpa资源(horizontalpodautoscaler)用于定义对某个负载比如deployment的弹性策略,策略中说明基于什么指标、指标的阈值以及弹性的最大值、最小值。hpa资源创建后,kube-controller-manager中的hpa-controller协程开始工作,大致工作步骤如下:

  • 调用kube-apiserver,获取HPA 资源关联负载的指标

  • 用负载当前的指标和HPA中规定的阈值比较,结合逻辑判断是增加、减少或者不修改负载的示例数

  • 根据步骤2的计算结果,调用kube-apiserver修改负载的示例数

需要理解的关键卡点问题是

  • 指标是从哪里来的?

  • kube-apiserver本身代码里面不提供指标的API,为啥调用kube-apiserver接口能获取到指标?

三、指标和指标的来源

指标均由业务API提供,一般业界指标标准URL为/metrics。kubernetes生态中,主要通过Metrics server和Prometheus获取指标:

  • metrics server:metrics-server作为集群组件,用于收集和聚合从每个kubelet中提取的资源指标。本质上只是做了数据的中转和聚合,通过调用kubelet的api接口获取数据。kubelet 作为用于管理容器资源的节点代理,可以使用 /metrics/resource 接口访问资源指标。

  • Prometheus:在某些场景下,prometheus采集的指标可能需要重命名或者重新计算,由Prometheus-adapter组件提供转换能力。

在kubernetes中指标分为core metric(核心指标)和custom metric(自定义指标):

  • Core metrics(核心指标):Metrics server通过调用各个节点kubelet 10250端口,由kubelet内部cAdvisor模块获取度量指标,对应指标实现由kubelet提供,使用者无法修改,然后返回给HPA。

  • Custom Metrics(自定义指标):通过Prometheus获取对应的业务指标,具体指标内容有业务自己实现。

四、通过API Aggregation拓展kubernetes API

API Aggregation 允许在不修改 Kubernetes 核心代码的同时扩展 Kubernetes API,即将第三方服务注册到 Kubernetes API 中,这样就可以通过 Kubernetes API 来访问外部服务。

如下图示例,通过APIService资源新增 /apis/metrics.k8s.io/v1beta1 和 /apis/custom.metrics.k8s.io/v1beta1。当kube-apiserver收到对应URL请求后,会将请求转发给APIService资源中spec.service指定的服务,URL为 /apis/metrics.k8s.io/v1beta1的请求转发给metrics-server服务处理,URL为/apis/custom.metrics.k8s.io/v1beta1的请求转发给custom-metrics-apiserver服务(本质上就是Prometheus-adapter,服务名称为custom-metrics-apiserver而已)。如此,便可以通过直接访问kube-apiserver端口,获取对应的指标数据。


# 比如获取核心指标
kubectl get --raw "/apis/metrics.k8s.io/v1beta1/namespaces/${yourNamespace}/pods"

# 获取自定义指标:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/${yourNamespace}/x"

如此,kube-controller-manager就可以通过调用kube-apiserver接口获取相关业务的指标了。

五、HPA实践建议

HorizontalPodAutoscaler 是 Kubernetes autoscaling API 组中的 API 资源。 当前的稳定版本可以在 autoscaling/v2 API 版本中找到,其中包括对基于内存和自定义指标执行扩缩的支持。 在使用 autoscaling/v1 时,autoscaling/v2 中引入的新字段作为注释保留。可配置的扩缩行为(behavior)在之前的 autoscaling/v2beta2 API 版本将此功能作为 beta 功能提供。1.23 kubernetes及以上可参考yaml:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  behavior:
    scaleDown:
      policies:
      - type: Pods
        value: 4
        periodSeconds: 60
      - type: Percent
        value: 10
        periodSeconds: 60

核心指标弹性,一般建议采用cpu指标进行弹性,memory因为不太敏感而且跟开发语言相关,大多数语言都有内存池以及内置GC机制导致进程内存监控不准确

快速扩容,主要防止流量瓶颈;缓慢缩容,主要防止另一个流量高峰。

快速扩容策略配置

behavior:           #通过behavior单独配置扩缩行为
  scaleUp:
    stabilizationWindowSeconds: 0  # 扩容没有稳定窗口,满足条件 立刻扩容
    policies:
    - type: Percent     #以下策略表示在15s内,最多扩容当前实例数的9倍
      value:  900
      periodSeconds: 15

快速扩容,缓慢缩容;业务在流量高峰期后,并发量骤降的场景中,如果使用默认的缩容策略,几分钟后Pod的数量也会随着骤降,此时如果又迎来流量高峰,扩容过程需要一段时间,这段时间内造成业务后端处理能力达到瓶颈,将导致部分请求失败。可以为HPA配置behavior缩容策略,快速缩容之后缓慢缩容。

behavior:                # 通过该字段单独配置扩缩行为
  scaleDown:
    policies:
    - type: Pods        #表示每600s删除一个pod
      value: 1
      periodSeconds: 600
  scaleUp:
    policies:
    - type: Percent        #表示在15s之内,扩容当前实例数的9倍
      value: 900
      periodSeconds: 15

禁止自动缩容。对于扩容后需要禁止自动缩容的关键业务应用,需要人工干预或者其他方式进行缩容,可以使用如下策略禁止缩容

behavior:                  #通过该字段单独配置扩缩行为
  scaleDown:
    selectPolicy: Disabled    #selectPolicy 的值 Disabled 会关闭对给定方向的缩容,使用该策略,将会阻止缩容

延长缩容时间窗。缩容的稳定窗口默认是5分钟,如果需要延长时间窗口以避免一些流量毛刺,可以配置以下策略

behavior:      #通过该字段可单独配置扩缩行为
  scaleDown:
    stabilizationWindowSeconds: 600   #等待600s后 在开始缩容
    policies:
    - type: Pods
      value: 5    # 每次只缩容5个Pod

HorizontalPodAutoscaler API 也支持容器指标源,这时 HPA 可以跟踪记录一组 Pod 中各个容器的资源用量,进而触发扩缩目标对象的操作。 特性状态: Kubernetes v1.27 [beta]

如果你有一个 Web 应用和一个执行日志操作的边车容器,你可以基于 Web 应 用的资源用量来执行扩缩,忽略边车容器的存在及其资源用量。

type: ContainerResource
containerResource:
  name: cpu
  container: application
  target:
    type: Utilization
    averageUtilization: 60

HPA 控制器会对目标对象执行扩缩操作以确保所有 Pod 中 application 容器的平均 CPU 用量为 60%。

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

标签:缩容,metrics,指标,API,组件,HPA,解析,type
From: https://www.cnblogs.com/huaweiyun/p/17915839.html

相关文章

  • C++ Qt开发:QItemDelegate 自定义代理组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QStyledItemDelegate自定义代理组件的常用方法及灵活运用。在Qt中,QStyledItemDelegate类是用于......
  • Python 使用getopt解析命令行参数
    ​ 1、getopt模块此模块可协助脚本解析sys.argv中的命令行参数。它支持与Unixgetopt()函数相同的惯例(包括形式如'-'与'--'的参数的特殊含义)。也能通过可选的第三个参数来使用与GNU软件所支持形式相类似的长选项。1)getopt.getopt(args,shortopts,longopts=[])......
  • day17 基于Prometheus的HPA自动伸缩 -Prometheus黑盒监控-自定义资源接入监控系统 (7.
    一、基于Prometheus的HPA自动伸缩1、背景Kubernetes集群规模大、动态变化快,而且容器化应用部署和服务治理机制的普及,传统的基础设施监控方式已经无法满足Kubernetes集群的监控需求。需要使用专门针对Kubernetes集群设计的监控工具来监控集群的状态和服务质量。Prometheus则......
  • SSO单点登录源码解析
    单点登录:用户在单点登录成功后,会访问某一平台模块,1. 向客户端发送一个请求(免密登录接口),请求客户端接口会携带一个ticket,类似于:http//:ip:port:xxx?ticket=xxxx1. 这个请求会被客户端配置的EKPSSOCLIENT的过滤器拦截,读取配置文件sso-config.properties,获取过滤器链(CASURLFilter、Us......
  • 三道初三数学模拟几何综合题的解题思路解析
     ......
  • element ui中同级button调用upload组件
    代码<el-uploadref="schoolLogo"class="avatar-uploader"action="https://jsonplaceholder.typicode.com/posts/":show-file-list="false":on-success="handleAvatarSuccess":before-u......
  • 深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
    Python中的面向对象编程涉及许多特殊方法,其中__new__和__init__是两个关键的方法。它们分别负责对象的创建和对象的初始化,在对象的生命周期中扮演着不同而又互补的角色。让我们深入探讨这两个方法,了解它们的作用、区别以及如何在实际开发中应用。1. __new__方法当谈到Pyth......
  • Python中使用del删除列表元素的原理解析
    Python是一种功能强大的编程语言,提供了许多方便的操作列表的方法。其中,使用del关键字可以删除列表中的某个元素。本文将解析Python中使用del删除列表元素的原理,帮助您理解其工作原理和使用方法。1.列表是可变对象:在Python中,列表是一种可变对象,即可以在原地修改的对象。与不可变对象......
  • 羚通视频智能分析平台:车辆检测算法的深度解析
    随着科技的不断发展,视频监控技术已经深入到我们生活的各个角落。在这个背景下,羚通视频智能分析平台应运而生,它通过先进的车辆检测算法,为我们的生活带来了极大的便利。本文将详细介绍羚通视频智能分析平台的车辆检测算法。一、羚通视频智能分析平台简介羚通视频智能分析平......
  • Owasp Top10 漏洞解析 之注入
    一、注入漏洞是什么?注入漏洞,即将不受信任的数据作为命令或查询的一部分发送到解析器时,会产生诸如SQL注入NoSQL注入、OS注入和LDAP注入的注入缺陷。攻击者的恶意数据可以诱使解析器在没有适当授权的情况下执行非预期命今或访问数据。几乎任何数据源都能成为注入载体,包括环境变量......