hpa自动扩容

官方文档

  1. https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

HPA是什么

Kubernetes有一个HPA(Horizontal Pod Autoscaler)的资源,可以实现基于CPU使用率的Pod自动伸缩的功能。

(1)HPA基于Master Node上的kube-controller-manager服务启动参数horizontal-pod-autoscaler-sync-period定义的时长(默认为30秒),周期性的检测Pod的CPU使用率。

如果需要设置horizontal-pod-autoscaler-sync-period可以在Master Node上的/etc/default/kube-controller-manager中修改。

(2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

(3)metrics-server 也需要部署到集群中, 它可以通过 resource metrics API 对外提供度量数据。

Horizontal Pod Autoscaler 演练

Horizontal Pod Autoscaler 可以根据 CPU 利用率自动扩缩 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量 (也可以基于其他应用程序提供的度量指标,目前这一功能处于 beta 版本)。

本文将引领你了解如何为 php-apache 服务器配置和使用 Horizontal Pod Autoscaler。 与 Horizontal Pod Autoscaler 相关的更多信息请参阅 Horizontal Pod Autoscaler 用户指南

参数

  1. minReplicas 最小pod实例数
  2. maxReplicas 最大pod实例数
  3. metrics 用于计算所需的Pod副本数量的指标列表
  4. resource 核心指标,包含cpu和内存两种(被弹性伸缩的pod对象中容器的requestslimits中定义的指标。)
  5. object k8s内置对象的特定指标(需自己实现适配器)
  6. pods 应用被弹性伸缩的pod对象的特定指标(例如,每个pod每秒处理的事务数)(需自己实现适配器)
  7. external k8s内置对象的自定义指标(需自己实现适配器)

案例:监控cpu,内存,每秒数据包自动扩容

  1. apiVersion: autoscaling/v2beta1 #(支持cpu,memory,及自定义)
  2. kind: HorizontalPodAutoscaler
  3. metadata:
  4. name: bikesvc
  5. namespace: sg-bs
  6. spec:
  7. minReplicas: 1
  8. maxReplicas: 10
  9. scaleTargetRef:
  10. apiVersion: apps/v1
  11. kind: Deployment
  12. name: bikesvc
  13. metrics:
  14. - type: Resource
  15. resource:
  16. name: memory # 内存占用率(百分比)
  17. targetAverageUtilization: 80
  18. - type: Resource
  19. resource:
  20. name: cpu # cpu占用率(百分比)
  21. targetAverageUtilization: 80
  22. # - type: Pods
  23. # pods:
  24. # metricName: packets-per-second # (每秒数据包)
  25. # targetAverageValue: 1
  26. - type: Object
  27. object:
  28. metricName: packets-per-second # (每秒数据包)
  29. target:
  30. kind: Deployment
  31. name: bikesvc
  32. targetValue: 1000

度量指标

pod清单案例-pod定义cup内存指标

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: test
  5. spec:
  6. selector:
  7. matchLabels:
  8. app: nginx
  9. template:
  10. metadata:
  11. labels:
  12. app: nginx
  13. spec:
  14. nodeName: sg-15
  15. containers:
  16. - name: nginx
  17. image: nginx
  18. resources:
  19. requests:
  20. cpu: 125m # 向集群申请cpu
  21. memory: 1024Mi # 向集群申请内存

cpu度量指标

  1. - type: Resource
  2. resource:
  3. name: cpu # cpu占用率(百分比)
  4. targetAverageUtilization: 80

memory内存度量指标

  1. - type: Resource
  2. resource:
  3. name: memory # 内存占用率(百分比)
  4. targetAverageUtilization: 80

pod度量指标

  1. 第一种可选的度量指标类型是 Pod 度量指标。这些指标从某一方面描述了 Pod 在不同 Pod 之间进行平均,并通过与一个目标值比对来确定副本的数量。 它们的工作方式与资源度量指标非常相像,只是它们仅支持 target 类型为 AverageValue
  2. - type: Pods
  3. pods:
  4. metricName: packets-per-second # (每秒数据包)
  5. targetAverageValue: 1000

Object度量指标

  1. 第二种可选的度量指标类型是对象(Object)度量指标。这些度量指标用于描述 在相同名字空间中的别的对象,而非 Pods 请注意这些度量指标不一定来自某对象,它们仅用于描述这些对象。 对象度量指标支持的 target 类型包括 Value AverageValue 如果是 Value 类型,target 值将直接与 API 返回的度量指标比较, 而对于 AverageValue 类型,API 返回的度量值将按照 Pod 数量拆分, 然后再与 target 值比较。 下面的 YAML 文件展示了一个表示 requests-per-second 的度量指标。
  2. - type: Object
  3. object:
  4. metricName: packets-per-second # (每秒数据包)
  5. target:
  6. kind: Deployment
  7. name: bikesvc
  8. targetValue: 1000

基于更特别的度量值来扩缩

​ 许多度量流水线允许你通过名称或附加的 标签 来描述度量指标。 对于所有非资源类型度量指标(Pod、Object 和后面将介绍的 External), 可以额外指定一个标签选择算符。例如,如果你希望收集包含 verb 标签的 http_requests 度量指标,可以按如下所示设置度量指标块,使得扩缩操作仅针对 GET 请求执行:

  1. type: Object
  2. object:
  3. metric:
  4. name: `http_requests` # http请求
  5. selector: `verb=GET` # 标签筛选

查看hpa状态详情

  1. > kubectl describe hpa -n sg-bs
  2. Name: bikesvc
  3. Namespace: sg-bs
  4. Labels: <none>
  5. Annotations: CreationTimestamp: Fri, 03 Dec 2021 03:35:20 +0000
  6. Reference: Deployment/bikesvc
  7. Metrics: ( current / target )
  8. resource memory on pods (as a percentage of request): 31% (42299392) / 80%
  9. "packets-per-second" on Deployment/bikesvc (target value): <unknown> / 1
  10. resource cpu on pods (as a percentage of request): 34% (87m) / 80%
  11. Min replicas: 1
  12. Max replicas: 10
  13. Deployment pods: 1 current / 1 desired
  14. Conditions:
  15. Type Status Reason Message
  16. ---- ------ ------ -------
  17. AbleToScale True ReadyForNewScale recommended size matches current size
  18. ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from memory resource utilization (percentage of request)
  19. ScalingLimited False DesiredWithinRange the desired count is within the acceptable range
  20. Events:
  21. Type Reason Age From Message
  22. ---- ------ ---- ---- -------
  23. Warning FailedGetObjectMetric 106s (x80 over 21m) horizontal-pod-autoscaler unable to get metric packets-per-second: Deployment on sg-bs bikesvc/unable to fetch metrics from custom metrics API: no custom metrics API (custom.metrics.k8s.io) registered
  1. 对于上面展示的这个 HorizontalPodAutoscaler,我们可以看出有若干状态条件处于健康状态。 首先,AbleToScale 表明 HPA 是否可以获取和更新扩缩信息,以及是否存在阻止扩缩的各种回退条件。 其次,ScalingActive 表明 HPA 是否被启用(即目标的副本数量不为零) 以及是否能够完成扩缩计算。 当这一状态为 False 时,通常表明获取度量指标存在问题。 最后一个条件 ScalingLimitted 表明所需扩缩的值被 HorizontalPodAutoscaler 所定义的最大或者最小值所限制(即已经达到最大或者最小扩缩值)。 这通常表明你可能需要调整 HorizontalPodAutoscaler 所定义的最大或者最小副本数量的限制了。

k8s-hpa自动横向扩容的更多相关文章

  1. k8s HPA自动收缩

    HPA自动收缩 autoscale 自动调整一个 Deployment, ReplicaSet, 或者 ReplicationController 的副本数量 #创建一个replicaset测试 [r ...

  2. Elasticsearch 横向扩容以及容错机制

    写在前面的话:读书破万卷,编码如有神-------------------------------------------------------------------- 参考内容: <Ela ...

  3. Elasticsearch由浅入深(二)ES基础分布式架构、横向扩容、容错机制

    Elasticsearch的基础分布式架构 Elasticsearch对复杂分布式机制的透明隐藏特性 Elasticsearch是一套分布式系统,分布式是为了应对大数据量. Elasticsearch ...

  4. [转帖]在 k8s 中自动为域名配置 https

    在 k8s 中自动为域名配置 https https://juejin.im/post/5db8d94be51d4529f73e2833 随着 web 的发展,https 对于现代网站来说是必不可少的 ...

  5. 1.利用consul实现k8s服务自动发现

    标题 : 1.利用consul实现k8s服务自动发现 目录 : 微服务架构设计 序号 : 1 ] } } ] } } ​ - consul自身支持ACL,但目前,Helm图表不支持其中一些功能,需要额 ...

  6. K8S(17)二进制的1.15版本部署hpa自动伸缩

    K8S(17)二进制部署的K8S(1.15)部署hpa功能 目录 K8S(17)二进制部署的K8S(1.15)部署hpa功能 零.参考文件: 一.生成metrics-proxy证书 二.修改apise ...

  7. minikube metrics-server HPA 自动扩缩容错误

    minikube metrics-server pod 错误 启动 minikube addons enable metrics-server 之后查看 metrics-server pod 会有如下 ...

  8. 虚拟机(Visual Machine)的云平台的自动伸缩扩容(auto-scaling)技术

    云计算平台中允许客户依据应用的负载进行云计算资源的弹性动态伸缩(理想的情况是实现一个用多少付费多少的模型,最大限度地降低用户的运营成本) 在进行讨论之前,先对几个名词进行定义 1)客户:使用云服务的人 ...

  9. Kubernetes自动横向伸缩集群节点以及介绍PDB资源

    在kubernetes中,有HPA在需要的时候创建更多的pod实例.但万一所有的节点都满了,放不下更多pod了,怎么办?显然这个问题并不局限于Autoscaler创建新pod实例的场景.即便是手动创建 ...

随机推荐

  1. 六. Go并发编程--WaitGroup

    一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术. WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束.比如某个go ...

  2. Abp Vnext Vue3 的版本实现

    基于ABP Vnext的二次开发,前端 vue3.0,Typescript,Ant Design Vue ,Vben Admin 的后台管理框架. 技术点 Net Core5.0 ABP Vnext ...

  3. sudo 命令详解

    在linux系统中,由于root的权限过大,一般情况都不使用它.只有在一些特殊情况下才采用登录root执行管理任务,一般情况下临时使用root权限多采用su和sudo命令. 一.su和sudo命令对比 ...

  4. js之变量与数据类型

    变量 声明 一个变量被重新复赋值后,它原有的值就会被覆盖,变量值将以最后一次赋的值为准. var age = 18; age = 81; // 最后的结果就是81因为18 被覆盖掉了 同时声明多个变量 ...

  5. Redis这15个“雷坑”,别问我咋知道的……

    来源:https://dbaplus.cn/news-158-3836-1.html

  6. virtualenv笔记

    virtualenv venv --python=python2.7 mkvirtualenv venv --python=python linux中使用virtualenvwrapper 安装 pi ...

  7. MarkdownPad2 注册码

    邮箱: Soar360@live.com 授权秘钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6b ...

  8. c++学习笔记(九)

    引用(reference) 概念 引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字. 一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量. 用法 变量名称是变量附属在内存 ...

  9. Effective C++ 总结笔记(四)

    五.实现 26.尽可能延后变量定义式的出现时间 尽可能延后变量定义式的出现,甚至应该尝试延后这份定义直到能够给他初值实参为止,这样不仅能避免构造和析构非必要对象,避免无意义的default行为,也可增 ...

  10. Python 爬取 猫眼

    1. import requests import re import pymongo MONGO_URL='localhost'#建立连接 MONGO_DB='Maoyan'#创建数据库 clien ...