容器水平伸缩 HPA

容器水平伸缩(Horizontal Pod Autoscaler,简称 HPA)是 Kubernetes 中实现 Pod 水平自动伸缩的功能。对于 Kubernetes 中的 Pod 而言,HPA 可以实现很多自动化功能,比如当 Pod 中工作负载上升时,会基于设定的扩容规则,动态调整副本数,从而保证业务系统稳定运行;当 Pod 中工作负载下降时,会基于设定的缩容规则,动态调整副本数,从而提高资源利用率。

HPA 基本原理

HPA 是用来控制 Pod 水平伸缩的控制器,基于设定的扩缩容规则,实时采集监控指标数据,根据用户设定的指标阈值计算副本数,进而调整目标资源的副本数量,完成扩缩容操作。

HPA 工作流程如下:

1

通过控制台创建 HPA

LHC 支持在控制台界面上快速创建支持 HPA 的应用服务,您可以轻松通过单元化应用服务控制台在创建应用服务时进行创建。

操作步骤

  1. 登录控制台,在左侧导航栏单击 发布运维 > 应用服务

  2. 在应用服务列表页,单击 创建应用服务

  3. 创建应用服务 页面,完成基本信息、Pod 模板配置后,单击 下一步

  4. 弹性配置 页面,完成以下配置后,单击 下一步

    • 副本伸缩策略配置:选择 弹性扩缩容

    • 固定副本数:勾选部署单元并修改为期望副本数。

    • 最小副本数:弹性扩缩容时 Pod 的最小副本数。默认值为 1。

    • 最大副本数:弹性扩缩容时 Pod 的最大副本数。默认值为 10。

    • 规则:当前伸缩规则基于的指标类型。单击 + 添加配置,配置以下选项:

      • 规则类型:当前伸缩规则基于的规则类型。目前支持 CPUMemoryQPS响应时间

      • 目标类型:当前伸缩规则基于的指标类型所期望达到的值的类型,目前支持 使用率 平均资源使用。

      • 使用率/平均值:输入使用率/平均值。

      • 单位:无需输入,根据所选的规则类型自动匹配。

    • 高级配置:默认关闭。如果开启1,需要为扩缩容规则配置幅度、间隔时间、冷却时间。

      • 幅度:可以通过设置按百分比或指定个数来调整扩缩容的速率,单位为百分比或个数。

      • 间隔时间:上次扩缩容操作与本次扩缩容操作之间的时间间隔,单位为秒。

      • 冷却时间:冷却扩缩容操作的时间,即完成一次扩缩容操作之后不再次触发扩缩容操作的时间窗口,单位为秒。

        说明

        一个扩缩容活动执行完成后,在设定的冷却时间内不执行其他扩缩容活动。

  5. (可选)完成访问配置部署和调度配置后,单击 提交

通过 kubectl 命令创建

您还可以通过编排模板来手动创建 HPA,并将其绑定到要伸缩的 Deployment 对象上,通过 kubectl 命令实现容器自动伸缩配置。

下面针对一个 Nginx 应用进行举例。

  1. 创建并复制以下内容到 nginx.yml 中。Deployment 的编排模板如下。

    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx  
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9 # replace it with your exactly <image_name:tags>
            ports:
            - containerPort: 80
            resources:
              requests:                         ##必须设置,否则 HPA 无法运行。
                cpu: 500m
    说明

    需要为 Pod 设置 request 资源,如果不设置,HPA 不会运行。

  2. 执行以下命令,创建 Nginx 应用。

    kubectl create -f nginx.yml
  3. 创建 HPA。通过 scaleTargetRef 设置当前 HPA 绑定的对象。在本例中,绑定对象是名为 nginx 的 Deployment。

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx-hpa
      namespace: default
    spec:
      scaleTargetRef:                             ##绑定名为 nginx 的 Deployment。
        apiVersion: apps/v1
        kind: Deployment
        name: nginx
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          targetAverageUtilization: 50
  4. 执行 kubectl describe hpaname 会发现有类似以下信息的警告信息。

    Warning  FailedGetResourceMetric       2m (x6 over 4m)  horizontal-pod-autoscaler  missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5897-mqzs7
    Warning  FailedComputeMetricsReplicas  2m (x6 over 4m)  horizontal-pod-autoscaler  failed to get cpu utilization: missing request for cpu on container nginx in pod default/nginx-deployment-basic-75675f5创建好HPA后,再次执行kubectl describe hpa
  5. 创建好 HPA 后,再次执行 kubectl describe hpaname 命令。如果看到以下信息,则表示 HPA 已正常运行。

    Normal SuccessfulRescale 39s horizontal-pod-autoscaler New size: 1; reason: All metrics below target

    此时,当 Nginx 的 Pod 的利用率超过本例中设置的 50% 利用率时,则会进行水平扩容,低于 50% 时会进行缩容。