作用
根据pod的资源利用情况进行动态的增加或减少pod副本数量
原理
通过metric-server监控pod资源使用情况,根据定义的资源限制去更新deployment中的spec.replicas
字段的值,进而更新pod数量
度量指标
- 资源度量指标(Resource)
- CPU
- 内存
- 自定义度量指标(custom metrics):仅支持
target
类型为AverageValue
- Pod 度量指标
- Object 度量指标
默认情况下,资源度量指标只有CPU和内存
创建方式
- 命令行
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
- 声明式
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
maxReplicas: 10
minReplicas: 1
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
# 13~19行可以缩减为下面一行
# targetCPUUtilizationPercentage: 50
Demo
创建工作负载
[root@master hpa]# cat php-apache.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: gcr.io/google_containers/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
命令行创建hpa资源
保持php-apache这个deployment下面的所有pod的平均cpu利用率为50%
pod数量最少为1,最多为10
[root@master hpa]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
增加负载
另外打开一个窗口
[root@master ~]# kubectl run -i --tty load-generator --rm --image=docker.io/busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
持续观察hpa状态
[root@master hpa]# kubectl get hpa php-apache --watch
API
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata: # 元数据信息
name: php-apache
namespace: default
spec: # 自动扩缩器行为的规约
scaleTargetRef: # 必需,指向要扩缩容的目标资源
apiVersion: apps/v1
kind: Deployment
name: php-apache
maxReplicas: 10 # 必需,扩容副本数的上限,不能小于 minReplicas
minReplicas: 1 # 必需,扩容副本数的下限,不能大于 maxReplicas
metrics: #
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
spec
scaleTargetRef
必需
指向要扩缩的目标资源,用于收集 Pod 的相关指标信息以及实际更改的副本数
scaleTargetRef.kind
必需
被引用对象的类别
scaleTargetRef.name
必需
引用对象的名称
scaleTargetRef.apiVersion
引用对象的 API 版本
maxReplicas
必需
扩容副本数的上限,不能小于 minReplicas
minReplicas
必需
扩容副本数的下限,不能大于 maxReplicas
behavior
配置目标在扩容(Up)和缩容(Down)两个方向的扩缩行为(分别用 scaleUp 和 scaleDown 字段)。 如果未设置,则会使用默认的 HPAScalingRules 进行扩缩容
HPAScalingRules 为一个方向配置扩缩行为。在根据 HPA 的指标计算 desiredReplicas 后应用这些规则。 可以通过指定扩缩策略来限制扩缩速度。可以通过指定稳定窗口来防止抖动, 因此不会立即设置副本数,而是选择稳定窗口中最安全的值
behavior.scaleDown
缩容策略。如果未设置,则默认值允许缩减到 minReplicas 数量的 Pod, 具有 300 秒的稳定窗口(使用最近 300 秒的最高推荐值)
behavior.scaleDown.policies
是可在扩缩容过程中使用的潜在扩缩策略的列表。必须至少指定一个策略,否则 HPAScalingRules 将被视为无效而丢弃
是一个单一的策略,必须在指定的过去时间间隔内保持为 true
- behavior.scaleDown.policies.type,必需
指定缩容策略
- behavior.scaleDown.policies.value,必需
包含策略允许的更改量。它必须大于零
- behavior.scaleDown.policies.periodSeconds
表示策略应该保持为 true 的时间窗口长度。 periodSeconds 必须大于零且小于或等于 1800(30 分钟)
behavior.scaleDown.selectPolicy
用于指定应该使用哪个策略,默认值:Max
取值:
Max
:选择影响 Pod 数量最大的策略Min
:选择影响 Pod 数量最小的策略Disabled
:禁用该方向的扩缩
behavior.scaleDown.stabilizationWindowSeconds
是在扩缩容时应考虑的之前建议的秒数(稳定窗口)。stabilizationWindowSeconds 必须大于或等于零且小于或等于 3600(一小时)
如果未设置,则使用默认值:
- 扩容:0(不设置稳定窗口)
- 缩容:300(即稳定窗口为 300 秒)
当用于扩缩的指标不断波动时,稳定窗口用于限制副本计数的波动。 自动扩缩算法使用此窗口来推断先前的期望状态并避免对工作负载规模进行不必要的更改
当指标显示目标应该缩容时,自动扩缩算法查看之前计算的期望状态,并使用指定时间间隔内的最大值
behavior.scaleUp
用于扩容策略,若未设置,则默认值为以下值中的较高者:
- 不使用稳定窗口
- 每 60 秒增加不超过 4 个 Pod
- 每 60 秒 Pod 数量翻倍
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 60
- type: Pods
value: 4
periodSeconds: 60
selectPolicy: Max
未设置时的默认值参数
metrics
包含用于计算预期副本数的规约
如果未设置,默认指标将设置为 80% 的平均 CPU 利用率
metrics.type
指标源的类别
取值:“ContainerResource”、“External”、“Object”、“Pods” 或 “Resource”
注意:“ContainerResource” 类别在特性门控 HPAContainerMetrics 启用时可用
metrics.ContainerResource
是指 Kubernetes 已知的资源指标(例如在请求和限制中指定的那些), 描述当前扩缩目标中每个 Pod 中的单个容器(例如 CPU 或内存)
metrics.External
metrics.Object
metrics.Pods
metrics.Resource
是指 Kubernetes 已知的资源指标(例如在请求和限制中指定的那些), 此结构描述当前扩缩目标中的每个 Pod(例如 CPU 或内存)
- metrics.resource.name,必需
相关资源名称
- metrics.resource.target,必需
指定给定指标的目标值
定义特定指标的目标值、平均值或平均利用率
- metrics.resource.target.type,必需
指标类别,取值:Utilization(平均利用率)
、Value(目标值)
、AverageValue(平均值)
- metrics.resource.target.averageUtilization
是跨所有相关 Pod 得出的资源指标均值的目标值, 表示为 Pod 资源请求值的百分比
- metrics.resource.target.averageValue
是跨所有 Pod 得出的指标均值的目标值(以数量形式给出)
- metrics.resource.target.averageValue
是指标的目标值(以数量形式给出)