You need to enable JavaScript to run this app.
导航
创建指标伸缩
最近更新时间:2024.07.24 16:08:01首次发布时间:2022.03.04 23:10:38

HPA(Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)在 Kubernetes 集群中用于 Pod 水平自动伸缩,它基于 CPU 和内存利用率、对无状态负载和有状态负载的 Pod 数量进行自动扩缩容。

说明

HPA 不适用于无法缩放的对象,比如 DaemonSets。

使用限制

  • HPA 配置多种指标时,会分别基于每种指标计算,并取最大值作为最终结果。
  • 指标伸缩仅支持配置无状态负载(Deployment)和有状态负载(Statefulset)。

前提条件

已安装 metrics-server 组件,且组件工作正常。详情请参见 查看组件

通过控制台配置

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击需要配置的目标集群。
  4. 在集群管理页面的左侧导航栏中,选择 弹性伸缩 > 指标伸缩,单击 创建指标伸缩,配置指标伸缩。
    • 基本信息
      alt
      配置项说明
      名称根据系统提示,配置指标伸缩策略的名称。在同一个命名空间下,名称必须唯一。
      命名空间选择伸缩策略所属的命名空间。建议选择您自定义的命名空间或系统默认创建的 default 命名空间。命名空间相关介绍,请参见 命名空间概述
      标签对应 Kubernetes 中的 Label,用于指定该伸缩策略的标识属性。单击 添加标签,根据界面提示输入符合要求的
      注解对应 Kubernetes 中的 Annotation,用于为伸缩策略附加任意非标识的元数据,包括 标签 不允许的字符,方便客户端能够检索此元数据。单击 添加注解,根据界面提示输入符合要求的
    • 伸缩策略
      alt
      配置项说明
      伸缩对象配置需要伸缩的工作负载。在下拉菜单中选择工作负载的类型和具体的工作负载。

      监测指标

      配置伸缩的监测指标,系统基于此指标决定是否需要进行伸缩。伸缩指标支持:

      • CPU 利用率:按所有 Pod 实例 CPU 使用量 / 所有 Pod 实例 CPU 请求量的百分比,作为监测指标,当 CPU 利用率达到该值,则进行伸缩。
      • 内存利用率:按所有 Pod 实例内存使用量 / 所有 Pod 实例内存请求量的百分比,作为监测指标,当内存利用率达到该值,则进行伸缩。

      说明

      • 一个 HPA 伸缩规则里,不能同时设置两个相同种类的伸缩指标。
      • 目前最多支持添加两个监测指标。
      • 使用 GPU 和网络指标配置弹性伸缩的方法,请参见 使用 GPU 和网络指标实现弹性伸缩
      最小实例数配置伸缩时的最小实例数和最大实例数。策略触发时,工作负载实例将在此范围内伸缩。
      最大实例数
  • 伸缩规则
    alt
    配置项说明
    扩缩容策略配置工作负载的扩缩容行为,勾选 扩容策略缩容策略,分别配置扩容策略行为和缩容策略行为。

    静默时间

    扩容策略或缩容策略的静默时间,整数形式,单位为秒。
    以当前时间为基准,往前追溯静默时间,如果 HPA 预期副本数总是高于或低于当前副本数,则执行扩容或缩容。

    策略类型

    配置策略类型,包括:

    • 最大值:执行影响 Pod 数量最大的策略。
    • 最小值:执行影响 Pod 数量最小的策略。
    • 禁用:禁用该扩容策略或缩容策略。

    策略

    配置扩缩容的具体策略行为,包括:

    • 类型:配置扩缩容策略行为的类型。
      • 容器组:基于 Pod 数量执行扩缩容。
      • 百分比:基于 Pod 百分比执行扩缩容。
    • 阈值:配置扩缩容行为的阈值,与 类型 配合使用。例如:当 类型 配置为 容器组,阈值配置为 10 时,表示在 时间间隔 内扩容或缩容 10 个副本。
    • 时间间隔:配置扩缩容速率,整数形式,取值范围为 1~1800,单位为秒。
  1. 单击 确定,完成配置。

通过 kubectl 命令行配置

基础配置

  1. 创建工作负载。本示例以创建无状态负载(Deployment)为例。
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo-workload  # 工作负载名称
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo-workload
      template:
        metadata:
          labels:
            app: demo-workload
        spec:
          containers:
          - name: workload
            image: cr-cn-beijing.volces.com/tw/nginx:1.0 # 容器镜像的地址和版本,请配置为您自己的镜像地址
            resources:
              requests:  # 指定容器的 CPU 和内存请求
                cpu: "500m" 
                memory: "1024Mi"
              limits:
                cpu: "1" 
                memory: "2Gi"
    
  2. 创建与工作负载关联的 HPA,指定按照 CPU 或内存使用率进行弹性伸缩。
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: workload-hpa  # 指标伸缩名称
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: demo-workload # 指定指标伸缩的工作负载对象
      minReplicas: 1 # 配置 HPA 的最小实例数
      maxReplicas: 10 # 配置 HPA 的最大实例数
      metrics:
      - type: Resource
        resource:
          name: cpu # 监测指标,目前仅支持 memory 和 cpu,且每一种监测指标只支持 1 个配置
          target:
            type: Utilization
            averageUtilization: 80 # 监测指标阈值,整数形式,单位为 %,例如 80 代表 80%
      - type: Resource
        resource:
          name: memory # 监测指标,目前仅支持 memory 和 cpu,且每一种监测指标只支持 1 个配置
          target:
            type: Utilization
            averageUtilization: 80 # 监测指标阈值,整数形式,单位为 %,例如 80 代表 80%
    
  3. 查看弹性伸缩结果。
    • 当 Pod CPU 使用率增加后会触发扩容,此时可通过如下命令查看 HPA 信息。
      kubectl get hpa   
      
      预期返回结果如下,Deployment 的副本数扩容到 2:
      NAME           REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      workload-hpa   Deployment/example-workload   23/20      1         10        2          62s   
      
    • 当 Pod CPU 使用率下降到指定值以下会触发缩容,此时可通过如下命令查看 HPA 信息。
      kubectl get hpa   
      
      预期返回结果如下,Deployment 的副本数缩容到 1:
      NAME           REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
      workload-hpa   Deployment/example-workload   0/20      1         10        1          15m
      

配置扩缩容行为

在 v1.24 及以上版本的集群中,autoscaling/v2 API 允许使用behavior字段配置 HPA 的扩缩容行为,同时,可以使用scaleUpscaleDown字段分别配置扩容和缩容行为。

说明

更多详细说明,请参见 社区文档

扩缩容策略

支持在behavior字段中指定一个或多个扩缩容策略。当指定多个策略时,默认允许最大更改量的策略是默认选择的策略。以下以缩容策略为例:

behavior:
  scaleDown: # 缩容策略
    policies:    
    - type: Pods # 策略类型,Pods 代表容器组,即基于 Pod 数量执行扩缩容
      value: 4 # 阈值,此处代表缩容 4 个副本
      periodSeconds: 60 # 时间间隔,整数形式,取值范围为 1~1800,单位为秒
    - type: Percent # 策略类型,Percent 代表百分比,即基于 Pod 百分比执行扩缩容
      value: 10 # 阈值,此处代表缩容当前副本数量的 10%  
      periodSeconds: 60 # 时间间隔,整数形式,取值范围为 1~1800,单位为秒

说明

  • 默认情况下,系统会允许最大更改量的策略。因此,只有 Pod 副本数大于 40 时, 第二个策略才会被采用。如果副本数为 40 或者更少,则应用第一个策略。
  • 支持使用selectPolicy字段来更改策略选择。 当配置为Min时,系统将选择副本数变化最小的策略。如果将该值设置为Disabled,则将完全禁用该扩缩容策略。

禁止 Pod 扩容或缩容

使用 HPA 时,如果您只期望进行 Pod 扩容或缩容,可以在配置扩缩容策略时,使用selectPolicy字段来实现。

  • 默认值:均不禁止。

  • 禁用扩容:配置selectPolicy的值为Disabled时,禁用指定方向的扩容。例如:以下策略将会阻止 Pod 扩容。

    behavior:
      scaleUp:
        selectPolicy: Disabled
    
  • 禁用缩容:配置selectPolicy的值为Disabled时,禁用指定方向的缩容。例如:以下策略将会阻止 Pod 缩容。

    behavior:
      scaleDown:
        selectPolicy: Disabled
    

配置静默时间

为防止因短期的指标波动导致 Pod 过度频繁或不必要的扩缩容。您可以为扩缩容行为配置静默时间,系统完成扩缩容后,在静默时间内,不会再次执行扩缩容策略,避免工作负载副本数频繁变更造成系统震荡。

例如在以下示例中,当指标显示目标应该缩容时,自动扩缩算法会将过去 5 分钟的所有期望状态考虑在内,使用窗口期内的最大值。

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300