当前位置:网站首页>Horizontal Pod Autoscaler(HPA)
Horizontal Pod Autoscaler(HPA)
2022-07-30 15:48:00 【星光落入哥哥眼里】
注意从kubernetes1.11开始Heapster被废弃不在使用,metrics-server 替代了heapster
基于多项度量指标和自定义度量指标自动扩缩
利用 autoscaling/v2 API 版本,你可以在自动扩缩 php-apache 这个 Deployment 时使用其他度量指标。
首先,将 HorizontalPodAutoscaler 的 YAML 文件改为 autoscaling/v2 格式:
kubectl get hpa php-apache -o yaml > /tmp/hpa-v2.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
minReplicas: 1 # 最小pod数量
maxReplicas: 10 # 最大pod数量
scaleTargetRef: # 指定要控制的php-apache信息
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics: # 需要注意的是targetCPUUtilizationPercentage 字段已经被名为 metrics 的数组所取代
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
status:
observedGeneration: 1
lastScaleTime: <some-time>
currentReplicas: 1
desiredReplicas: 1
currentMetrics:
- type: Resource # 用于计算所需的Pod副本数量的指标列表
resource: # 应用资源指标,即当前被弹性伸缩的pod对象中容器的requests和limits中定义的指标
name: cpu
current:
averageUtilization: 0
averageValue: 0
需要注意的是,targetCPUUtilizationPercentage
字段已经被名为 metrics
的数组所取代。 CPU 利用率这个度量指标是一个 resource metric(资源度量指标)因为它表示容器上指定资源的百分比。 除 CPU 外你还可以指定其他资源度量指标。默认情况下,目前唯一支持的其他资源度量指标为内存。 只要 metrics.k8s.io API 存在,这些资源度量指标就是可用的,并且它们不会在不同的 Kubernetes 集群中改变名称。
你还可以指定资源度量指标使用
绝对数值
,而不是百分比,你需要将 target.type 从 Utilization 替换成 AverageValue,同时设置 target.averageValue 而非 target.averageUtilization 的值。
还有两种其他类型的度量指标,他们被认为是 custom metrics(自定义度量指标):
即 Pod 度量指标和 Object 度量指标。这些度量指标可能具有特定于集群的名称,并且需要更高级的集群监控设置。
第一种可选的度量指标类型是 “Pod 度量指标”。这些指标从某一方面描述了 Pod, 在不同 Pod 之间进行平均,并通过与一个目标值比对来确定副本的数量。 它们的工作方式与资源度量指标非常相像,只是它们仅 支持 target 类型为 AverageValue。
type: Pods
pods: # 应用被弹性伸缩的pod对象的特定指标
metric: # 用于计算所需的Pod副本数量的指标列表
name: packets-per-second
target:
type: AverageValue
averageValue: 1k
第二种可选的度量指标类型是"对象(Object)度量指标"。这些度量指标用于描述 在相同名字空间中的别的对象,而非 Pods。 请注意这些度量指标不一定来自某对象,它们仅用于描述这些对象。 对象度量指标支持的target类型包括 Value 和 AverageValue
。 如果是Value类型target值将直接与API返回的度量指标比较,而对于AverageValue类型,API返回的度量值将按照 Pod 数量拆分,然后再与target 值比较。 下面的 YAML 文件展示了一个表示 requests-per-second 的度量指标。
type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-route
target:
type: Value
value: 2k
如果你指定了多个上述类型的度量指标,HorizontalPodAutoscaler 将会依次考量各个指标。 HorizontalPodAutoscaler 将会计算每一个指标所提议的副本数量,然后最终选择一个最高值。
基于更特别的度量值来扩缩
许多度量流水线允许你通过 名称
或附加的 标签
来描述度量指标。对于所有非资源类型度量指标(Pod、Object 和后面将介绍的 External), 可以额外指定一个标签选择算符。例如如果你希望收集包含 verb 标签的 http_requests 度量指标,可以按如下所示设置度量指标块,使得扩缩操作<仅针对 GET 请求执行>:
type:
object:
metric:
name: http_requests
selector: {
matchLabels: {
verb: GET}}
这个选择算符使用与 Kubernetes 标签选择算符相同的语法。 如果名称和标签选择算符匹配到多个系列,监测管道会决定如何将多个系列合并成单个值。选择算符是可以累加的,它不会选择目标以外的对象(类型为Pods的目标Pods 或者 类型为Object的目标对象)。
基于与 Kubernetes 对象无关的度量指标执行扩缩
运行在 Kubernetes 上的应用程序可能需要基于与 Kubernetes 集群中的任何对象
没有明显关系的度量指标进行自动扩缩,例如那些描述与任何 Kubernetes 名字空间中的服务都无直接关联的度量指标。在 Kubernetes 1.10 及之后版本中,你可以使用外部度量指标(external metrics)。
使用外部度量指标时,需要了解你所使用的监控系统,相关的设置与使用自定义指标时类似。 外部度量指标使得你可以使用你的监控系统的任何指标来自动扩缩你的集群。 你需要在 metric 块中提供 name 和 selector
,同时将类型由 Object 改为 External
。 如果 metricSelector 匹配到多个度量指标,HorizontalPodAutoscaler 将会把它们加和。 外部度量指标同时支持 Value 和 AverageValue 类型,这与 Object 类型的度量指标相同。
例如,如果你的应用程序处理来自主机上消息队列的任务,为了让每30个任务有1个工作者实例,你可以将下面的内容添加到 HorizontalPodAutoscaler 的配置中。
- type: External
external: # 用于应用非附属于任何对象的全局指标
metric:
name: queue_messages_ready
selector:
matchLabels:
queue: "worker_tasks"
target:
type: AverageValue
averageValue: 30
如果可以还是推荐定制度量指标而不是外部度量指标,因为这便于让系统管理员加固定制度量指标 API。 而外部度量指标 API 可以允许访问所有的度量指标。 当暴露这些服务时,系统管理员需要仔细考虑这个问题。
Horizontal Pod Autoscaler 状态条件
使用 autoscaling/v2 格式的 HorizontalPodAutoscaler 时,你将可以看到 Kubernetes 为 HorizongtalPodAutoscaler 设置的状态条件(Status Conditions)。 这些状态条件可以显示当前 HorizontalPodAutoscaler 是否能够执行扩缩以及是否受到一定的限制。status.conditions
字段展示了这些状态条件。 可以通过 kubectl describe hpa 命令查看当前影响 HorizontalPodAutoscaler 的各种状态条件信息:
# kubectl describe hpa cm-test
Name: cm-test
Namespace: prom
Labels: <none>
Annotations: <none>
CreationTimestamp: Fri, 16 Jun 2017 18:09:22 +0000
Reference: ReplicationController/cm-test
Metrics: ( current / target )
"http_requests" on pods: 66m / 500m
Min replicas: 1
Max replicas: 4
ReplicationController pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from pods metric http_requests
ScalingLimited False DesiredWithinRange the desired replica count is within the acceptable range
Events:
对于上面展示的这个 HorizontalPodAutoscaler,我们可以看出有若干状态条件处于健康状态。
▷ AbleToScale
表明 HPA 是否可以获取和更新扩缩信息,以及是否存在阻止扩缩的各种回退条件。 ▷ ScalingActive
表明 HPA 是否被启用(即目标的副本数量不为零)以及是否能够完成扩缩计算。 当这一状态为 False 时,通常表明获取度量指标存在问题。
▷ ScalingLimited
表明所需扩缩的值被 HorizontalPodAutoscaler 所定义的最大或者最小值所限制(即已经达到最大或者最小扩缩值)。这通常表明你可能需要调整 HorizontalPodAutoscaler 所定义的最大或者最小副本数量的限制了。
量纲
HorizontalPodAutoscaler 和 度量指标 API 中的所有的度量指标使用 Kubernetes 中称为 量纲(Quantity) 的特殊整数表示。 例如数量 10500m 用十进制表示为 10.5
。 如果可能的话,度量指标 API 将返回没有后缀的整数,否则返回以千分单位的数量。 这意味着你可能会看到你的度量指标在 1 和 1500m (也就是在十进制记数法中的 1 和 1.5)之间波动。
量纲(Quantity)LINK
量纲是使用紧凑的全数字表示法来表示小数值或带有国际计量单位制SI的大数值的表示法。 小数用milli单位表示,而大数用kilo、mega 或 giga 单位表示。
例如,数字 1.5 表示为 1500m, 而数字 1000 表示为 1k,1000000 表示为 1M。 你还可以指定二进制表示法后缀;数字 2048 可以写成 2Ki。
公认的十进制(10 的幂数)单位是 m(milli)、k(kilo,有意小写)、 M(mega)、G(giga)、T(terra)、P(peta)、E(exa)。
公认的二进制(2 的幂数)单位是 Ki (kibi)、Mi (mebi)、Gi (gibi)、 Ti (tebi)、 Pi (pebi)、 Ei (exbi)。
其他
以命令式对象配置创建 Autoscaler
除了使用 kubectl autoscale 命令,也可以使用以下清单以声明方式创建 HorizontalPodAutoscaler:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
使用如下命令创建 autoscaler:
kubectl create -f ./
Young people are not afraid of long time, there is glory on that side.
边栏推荐
- How to use Redis for distributed applications in Golang
- tiup list
- 【HMS core】【FAQ】push kit、分析服务、视频编辑服务典型问题合集3
- rhce笔记2
- Changing SELECT...FROM to FROM...SELECT doesn't 'fix' SQL
- 【HMS core】【FAQ】push kit、AR Engine、广告服务、扫描服务典型问题合集2
- 大厂高管借钱炒股,亏到破产卖房。。。
- [NCTF2019]Fake XML cookbook-1|XXE漏洞|XXE信息介绍
- When the vite multi-page application refreshes the page, it will not be in the current route and will return to the root route
- 开源WebGIS架构
猜你喜欢
Goland 开启文件保存自动进行格式化
解析字符串拼接的两种情况
How to remove first character from php string
481-82 (105, 24, 82, 34, 153),
大厂高管借钱炒股,亏到破产卖房。。。
[HMS core] [FAQ] Collection of typical problems of push kit, AR Engine, advertising service, scanning service 2
php字符串如何去除第一个字符
xxl-job源码解析(技术分享)
新人学习小熊派网络应用开发
FME realizes the method of converting CAD with attribute to SHP data
随机推荐
When the vite multi-page application refreshes the page, it will not be in the current route and will return to the root route
详解最实用的几种dll注入方式
Why is there no data reported when the application is connected to Huawei Analytics in the application debugging mode?
【HMS core】【Media】【视频编辑服务】 在线素材无法展示,一直Loading状态或是网络异常
23. 请你谈谈关于IO同步、异步、阻塞、非阻塞的区别
xxl-job源码解析(技术分享)
大厂高管借钱炒股,亏到破产卖房。。。
Manage components using TiUP commands
应用接入华为分析在应用调试模式下为何没有数据上报?
如何在分面中添加数学表达式标签?
Data Analysis Tools - DDL operations & DML operations in HQL
[flutter] What is MaterialApp and Material design
二、判断 & 循环
Promise Notes (1)
LeetCode-283-移动零
[HMS core] [FAQ] A collection of typical questions about push kit, analysis services, and video editing services 3
【SOC】经典输出hello world
涨姿势了!原来这才是多线程正确实现方式
新人学习小熊派网络应用开发
PCIE下载的驱动安装