默认扩容缩容行为

要使用自定义扩缩,不必指定所有字段。 只有需要自定义的字段才需要指定。 这些自定义值与默认值合并。 默认值与 HPA 算法中的现有行为匹配。

  1. behavior:
  2. scaleDown:
  3. stabilizationWindowSeconds: 300
  4. policies:
  5. - type: Percent
  6. value: 100
  7. periodSeconds: 15
  8. scaleUp:
  9. stabilizationWindowSeconds: 0
  10. policies:
  11. - type: Percent
  12. value: 100
  13. periodSeconds: 15
  14. - type: Pods
  15. value: 4
  16. periodSeconds: 15
  17. selectPolicy: Max

稳定窗口

默认下稳定窗口分为缩容稳定窗口和扩容稳定窗口。一般考虑可以快速的扩容,缩容量时候要稳定缩,防止由于指标下降过快减少实例。

缩容稳定窗口

当用于扩缩的指标持续抖动时,使用稳定窗口来限制副本数上下振动。 自动扩缩算法使用稳定窗口来考虑过去计算的期望状态,以防止扩缩。默认配置如下:

  1. scaleDown:
  2. stabilizationWindowSeconds: 300

当指标显示目标应该缩容时,自动扩缩算法查看之前计算的期望状态,并使用指定时间间隔内的最大值。 在上面的例子中,过去 5 分钟的所有期望状态都会被考虑。

扩容稳定窗口

扩容时候考虑指标上涨,可以快速增加实例,防止实例使用率过高崩溃,另外原因启动实例到实例通过健康检查得到流量还需要一段时间。默认值如下:

  1. scaleUp:
  2. stabilizationWindowSeconds: 0

一般只考虑当前指标状态。

默认缩容量策略

  1. scaleDown:
  2. stabilizationWindowSeconds: 300
  3. policies:
  4. - type: Percent
  5. value: 100
  6. periodSeconds: 15
  7. selectPolicy: Max

用于缩小稳定窗口的时间为 300 秒, 使用这300指标量最大值考虑缩容需要。只有一种缩容的策略,每15秒刷新缩容指标,允许 100% 删除当前运行的副本,这意味着扩缩目标可以缩小到允许的最小副本数。

注意: selectPolicy 如果在没有配置情况下,默认策略Max, 选择实数和百分比中大的一方

默认扩容策略

  1. scaleUp:
  2. stabilizationWindowSeconds: 0
  3. policies:
  4. - type: Percent
  5. value: 100
  6. periodSeconds: 15
  7. - type: Pods
  8. value: 4
  9. periodSeconds: 15
  10. selectPolicy: Max

对于扩容,没有稳定窗口。当指标显示目标应该扩容时,目标会立即扩容。 这里有两种策略,每 15 秒添加 4 个 Pod 或 100% 当前运行的副本数,直到 HPA 达到稳定状态。

调优扩容缩容策略

缩容策略

控制缩容速度

  1. behavior:
  2. scaleDown:
  3. policies:
  4. - type: Percent
  5. value: 10
  6. periodSeconds: 60
  7. - type: Pods
  8. value: 5
  9. periodSeconds: 60
  10. selectPolicy: Min

50 以下按照10%比例进行缩容,50个以上可以最多5个每分钟缩容。例如使用CPU使用率为50%为缩容策略。需要持续5分钟CPU使用率都低于50%才进行缩容,缩容时候如果实例在10个以内,每分钟一个进行缩容,直到指标稳定。

注意 如果在10个以内POD, 一次缩容最多为10%POD, 只有0~ 0.9值,会不影响缩容。答案否定。k8s向上取整到1.

缩容容忍度

例如配置CPU利用率50进行扩缩容,如果CPU使用率45 ~ 49 来回波动,会不导致实例来回增加减少呢。根据k8s--horizontal-pod-autoscaler-tolerance参数全局配置的容忍值,默认为 0.1。代表10%, 增加了实例以后如果CPU在45 ~ 49来回波动,导致不断来回增加和减少实例。

扩容策略

k8s默认扩容策略还是比较完善,暂时不进行修改

滚动更新

创建deployment对应HPA以后,以后更新deployment,例如如下操作

  1. $ kubectl apply -f deployment.yaml

需求确保deployment.yaml里面把spec.replicas字段删除,否则就好覆盖当前replicas数目,例如spec.replicas=1,导致当前有多个实例减少一个这个严重事故。