Pod水平伸缩--HPA


作用

根据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

image.png
命令行创建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"

image.png
持续观察hpa状态

[root@master hpa]# kubectl get hpa php-apache --watch

image.png

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

是指标的目标值(以数量形式给出)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值