×

作为开发人员,您可以使用水平 Pod 自动缩放器 (HPA) 指定 OpenShift Container Platform 如何根据从属于该复制控制器或部署配置的 Pod 收集的指标自动增加或减少复制控制器或部署配置的规模。您可以为任何部署、部署配置、副本集、复制控制器或有状态集创建 HPA。

有关基于自定义指标缩放 Pod 的信息,请参阅 根据自定义指标自动缩放 Pod

除非您需要其他对象提供的特定功能或行为,否则建议使用Deployment对象或ReplicaSet对象。有关这些对象的更多信息,请参阅 了解部署

了解水平 Pod 自动缩放器

您可以创建水平 Pod 自动缩放器来指定要运行的 Pod 的最小和最大数量,以及 Pod 应定位的 CPU 利用率或内存利用率。

创建水平 Pod 自动缩放器后,OpenShift Container Platform 开始查询 Pod 上的 CPU 和/或内存资源指标。当这些指标可用时,水平 Pod 自动缩放器计算当前指标利用率与所需指标利用率的比率,并相应地向上或向下缩放。查询和缩放以定期间隔发生,但在指标可用之前可能需要一到两分钟。

对于复制控制器,此缩放直接对应于复制控制器的副本。对于部署配置,缩放直接对应于部署配置的副本数。请注意,自动缩放仅适用于处于Complete阶段的最新部署。

OpenShift Container Platform 会自动考虑资源并在资源激增(例如启动期间)期间防止不必要的自动缩放。处于unready状态的 Pod 在向上缩放时具有0 CPU使用率,并且自动缩放器在向下缩放时会忽略这些 Pod。没有已知指标的 Pod 在向上缩放时具有0% CPU使用率,在向下缩放时具有100% CPU使用率。这允许在 HPA 决策期间获得更高的稳定性。要使用此功能,您必须配置就绪检查以确定新的 Pod 是否可以使用。

要使用水平 Pod 自动缩放器,您的集群管理员必须已正确配置集群指标。

支持的指标

水平 Pod 自动缩放器支持以下指标

表 1. 指标
指标 描述 API 版本

CPU 利用率

使用的 CPU 内核数。可用于计算 Pod 请求的 CPU 百分比。

autoscaling/v1autoscaling/v2

内存利用率

使用的内存量。可用于计算 Pod 请求的内存百分比。

autoscaling/v2

对于基于内存的自动缩放,内存使用量必须与副本数成比例地增加和减少。平均而言

  • 副本数的增加必须导致每个 Pod 的内存(工作集)使用量的整体减少。

  • 副本数的减少必须导致每个 Pod 的内存使用量的整体增加。

使用 OpenShift Container Platform Web 控制台检查应用程序的内存行为,并在使用基于内存的自动缩放之前确保您的应用程序满足这些要求。

以下示例显示了image-registry Deployment对象的自动缩放。初始部署需要 3 个 Pod。HPA 对象将最小值增加到 5。如果 Pod 上的 CPU 使用率达到 75%,则 Pod 将增加到 7。

$ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75
示例输出
horizontalpodautoscaler.autoscaling/image-registry autoscaled
image-registry Deployment对象的样本 HPA,minReplicas设置为 3
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: image-registry
  namespace: default
spec:
  maxReplicas: 7
  minReplicas: 3
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: image-registry
  targetCPUUtilizationPercentage: 75
status:
  currentReplicas: 5
  desiredReplicas: 0
  1. 查看部署的新状态

    $ oc get deployment image-registry

    部署中现在有 5 个 Pod

    示例输出
    NAME             REVISION   DESIRED   CURRENT   TRIGGERED BY
    image-registry   1          5         5         config

HPA 如何工作?

水平 Pod 自动缩放器 (HPA) 扩展了 Pod 自动缩放的概念。HPA 允许您创建和管理一组负载均衡节点。当超过给定的 CPU 或内存阈值时,HPA 会自动增加或减少 Pod 的数量。

workflow
图 1. HPA 的高级工作流程

水平pod自动伸缩器(HPA)是Kubernetes自动伸缩API组中的一个API资源。自动伸缩器作为一个控制循环工作,默认同步周期为15秒。在此期间,控制器管理器会查询CPU和内存利用率(或两者),并将查询结果与HPA的YAML文件中定义的指标进行比较。控制器管理器从资源指标API获取每个pod的资源指标(例如CPU或内存),这些指标针对HPA目标的每个pod。

如果设置了利用率目标值,控制器会计算每个pod中容器的等效资源请求的利用率百分比。然后,控制器对所有目标pod的利用率取平均值,并生成一个比率,该比率用于缩放所需副本的数量。HPA配置为从metrics.k8s.io(由指标服务器提供)获取指标。由于指标评估的动态特性,在一组副本的伸缩过程中,副本数量可能会发生波动。

要实现HPA,所有目标pod都必须在其容器上设置资源请求。

关于请求和限制

调度器使用您为pod中的容器指定的资源请求来决定将pod放置在哪个节点上。kubelet强制执行您为容器指定的资源限制,以确保容器不允许使用超过指定限制的资源。kubelet还会专门为该容器预留该系统资源的请求量。

如何使用资源指标?

在pod规范中,必须指定资源请求,例如CPU和内存。HPA使用此规范来确定资源利用率,然后向上或向下缩放目标。

例如,HPA对象使用以下指标源

type: Resource
resource:
  name: cpu
  target:
    type: Utilization
    averageUtilization: 60

在此示例中,HPA将伸缩目标中pod的平均利用率保持在60%。利用率是当前资源使用量与pod请求资源之比。

最佳实践

所有pod都必须配置资源请求

HPA根据OpenShift Container Platform集群中pod的观察到的CPU或内存利用率值做出伸缩决策。利用率值计算为每个pod资源请求的百分比。缺少资源请求值会影响HPA的最佳性能。

配置冷却时间

在水平pod自动伸缩过程中,可能会发生快速伸缩事件,且没有时间间隔。配置冷却时间可防止频繁的副本波动。您可以通过配置stabilizationWindowSeconds字段来指定冷却时间。稳定窗口用于限制当用于伸缩的指标持续波动时副本数量的波动。自动伸缩算法使用此窗口来推断先前的期望状态,并避免对工作负载规模进行不必要的更改。

例如,为scaleDown字段指定稳定窗口

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300

在上面的示例中,考虑了过去5分钟内的所有期望状态。这近似于一个滚动最大值,并避免了伸缩算法频繁删除pod,仅仅是为了在片刻之后触发重新创建等效pod的情况。

伸缩策略

autoscaling/v2 API允许您向水平pod自动伸缩器添加*伸缩策略*。伸缩策略控制OpenShift Container Platform水平pod自动伸缩器(HPA)如何伸缩pod。伸缩策略允许您通过设置特定数量或特定百分比来限制HPA在指定时间段内向上或向下伸缩pod的速率。您还可以定义一个*稳定窗口*,如果指标在波动,则使用先前计算的期望状态来控制伸缩。您可以为相同的伸缩方向创建多个策略,并根据变化量确定使用哪个策略。您还可以通过定时迭代来限制伸缩。HPA在一个迭代期间伸缩pod,然后根据需要在进一步的迭代中执行伸缩。

带有伸缩策略的示例HPA对象
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
  behavior:
    scaleDown: (1)
      policies: (2)
      - type: Pods (3)
        value: 4 (4)
        periodSeconds: 60 (5)
      - type: Percent
        value: 10 (6)
        periodSeconds: 60
      selectPolicy: Min (7)
      stabilizationWindowSeconds: 300 (8)
    scaleUp: (9)
      policies:
      - type: Pods
        value: 5 (10)
        periodSeconds: 70
      - type: Percent
        value: 12 (11)
        periodSeconds: 80
      selectPolicy: Max
      stabilizationWindowSeconds: 0
...
1 指定伸缩策略的方向,scaleDownscaleUp。此示例创建用于缩减的策略。
2 定义伸缩策略。
3 确定策略是在每次迭代中按特定数量的pod还是按pod的百分比进行伸缩。默认值为pods
4 限制每次迭代期间的伸缩量,无论是pod的数量还是pod的百分比。按pod数量缩减没有默认值。
5 确定伸缩迭代的长度。默认值为15秒。
6 按百分比缩减的默认值为100%。
7 如果定义了多个策略,则确定首先使用哪个策略。指定Max以使用允许最大变化量的策略,指定Min以使用允许最小变化量的策略,或指定Disabled以防止HPA在该策略方向上进行伸缩。默认值为Max
8 确定HPA应该回顾期望状态的时间段。默认值为0
9 此示例创建用于扩容的策略。
10 按pod数量限制扩容量。按pod数量扩容的默认值为4%。
11 按pod百分比限制扩容量。按百分比扩容的默认值为100%。
缩减策略示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-resource-metrics-memory
  namespace: default
spec:
...
  minReplicas: 20
...
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Pods
        value: 4
        periodSeconds: 30
      - type: Percent
        value: 10
        periodSeconds: 60
      selectPolicy: Max
    scaleUp:
      selectPolicy: Disabled

在此示例中,当pod数量大于40时,将使用基于百分比的策略进行缩减,因为该策略导致更大的变化,这是selectPolicy所要求的。

如果有80个pod副本,在第一次迭代中,HPA会减少8个pod,这是80个pod的10%(基于type: Percentvalue: 10参数),持续一分钟(periodSeconds: 60)。对于下一次迭代,pod数量为72。HPA计算出剩余pod的10%是7.2,它将其四舍五入为8,并缩减8个pod。在每次后续迭代中,将根据剩余pod的数量重新计算要缩减的pod数量。当pod数量低于40时,将应用基于pod的策略,因为基于pod的数量大于基于百分比的数量。HPA一次减少4个pod(type: Podsvalue: 4),持续30秒(periodSeconds: 30),直到剩余20个副本(minReplicas)。

selectPolicy: Disabled参数阻止HPA扩容pod。如果需要,您可以通过调整副本集或部署集中的副本数量来手动扩容。

如果设置,您可以使用oc edit命令查看伸缩策略

$ oc edit hpa hpa-resource-metrics-memory
示例输出
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/behavior:\
'{"ScaleUp":{"StabilizationWindowSeconds":0,"SelectPolicy":"Max","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":15},{"Type":"Percent","Value":100,"PeriodSeconds":15}]},\
"ScaleDown":{"StabilizationWindowSeconds":300,"SelectPolicy":"Min","Policies":[{"Type":"Pods","Value":4,"PeriodSeconds":60},{"Type":"Percent","Value":10,"PeriodSeconds":60}]}}'
...

使用Web控制台创建水平pod自动伸缩器

在Web控制台中,您可以创建一个水平pod自动伸缩器(HPA),该伸缩器指定您要在DeploymentDeploymentConfig对象上运行的pod的最小和最大数量。您还可以定义pod应达到的CPU或内存使用量。

无法将HPA添加到作为Operator支持的服务、Knative服务或Helm chart一部分的部署。

步骤

在 Web 控制台中创建 HPA

  1. 在**拓扑**视图中,单击节点以显示侧面板。

  2. 从**操作**下拉列表中,选择**添加水平 Pod 自动缩放器**以打开**添加水平 Pod 自动缩放器**表单。

    Add HorizontalPodAutoscaler form
    图 2. 添加水平 Pod 自动缩放器
  3. 在**添加水平 Pod 自动缩放器**表单中,定义名称、最小和最大 Pod 限制、CPU 和内存使用率,然后单击**保存**。

    如果 CPU 和内存使用率的任何值缺失,则会显示警告。

在 Web 控制台中编辑 HPA

  1. 在**拓扑**视图中,单击节点以显示侧面板。

  2. 从**操作**下拉列表中,选择**编辑水平 Pod 自动缩放器**以打开**编辑水平 Pod 自动缩放器**表单。

  3. 在**编辑水平 Pod 自动缩放器**表单中,编辑最小和最大 Pod 限制以及 CPU 和内存使用率,然后单击**保存**。

在 Web 控制台中创建或编辑水平 Pod 自动缩放器时,您可以从**表单视图**切换到**YAML 视图**。

在 Web 控制台中删除 HPA

  1. 在**拓扑**视图中,单击节点以显示侧面板。

  2. 从**操作**下拉列表中,选择**删除水平 Pod 自动缩放器**。

  3. 在确认弹出窗口中,单击**删除**以删除 HPA。

使用 CLI 创建用于 CPU 利用率的水平 Pod 自动缩放器

使用 OpenShift Container Platform CLI,您可以创建一个水平 Pod 自动缩放器 (HPA) 来自动缩放现有的DeploymentDeploymentConfigReplicaSetReplicationControllerStatefulSet 对象。HPA 会缩放与该对象关联的 Pod,以维持您指定的 CPU 使用率。

除非您需要其他对象提供的特定功能或行为,否则建议使用Deployment 对象或ReplicaSet 对象。

HPA 会增加和减少最小和最大数量之间的副本数量,以维持所有 Pod 的指定 CPU 利用率。

当针对 CPU 利用率进行自动缩放时,您可以使用oc autoscale 命令并指定您希望在任何给定时间运行的 Pod 的最小和最大数量以及 Pod 应达到的平均 CPU 利用率。如果您未指定最小值,则 Pod 将从 OpenShift Container Platform 服务器获取默认值。

要针对特定 CPU 值进行自动缩放,请创建一个具有目标 CPU 和 Pod 限制的HorizontalPodAutoscaler 对象。

先决条件

要使用水平 Pod 自动缩放器,您的集群管理员必须已正确配置集群指标。您可以使用oc describe PodMetrics <pod-name> 命令来确定是否已配置指标。如果已配置指标,则输出将类似于以下内容,其中CpuMemory 显示在Usage 下。

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
示例输出
Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>
步骤

创建用于 CPU 利用率的水平 Pod 自动缩放器

  1. 执行以下操作之一

    • 要根据 CPU 利用率百分比进行缩放,请为现有对象创建一个HorizontalPodAutoscaler 对象

      $ oc autoscale <object_type>/<name> \(1)
        --min <number> \(2)
        --max <number> \(3)
        --cpu-percent=<percent> (4)
      1 指定要自动缩放的对象的类型和名称。该对象必须存在,并且必须是DeploymentDeploymentConfig/dcReplicaSet/rsReplicationController/rcStatefulSet
      2 可选:在缩减规模时指定最小副本数。
      3 在扩容时指定最大副本数。
      4 指定所有 Pod 上的目标平均 CPU 利用率,表示为请求 CPU 的百分比。如果未指定或为负数,则使用默认自动缩放策略。

      例如,以下命令显示了对image-registry Deployment 对象的自动缩放。初始部署需要 3 个 Pod。HPA 对象将最小值增加到 5。如果 Pod 上的 CPU 使用率达到 75%,则 Pod 将增加到 7。

      $ oc autoscale deployment/image-registry --min=5 --max=7 --cpu-percent=75
    • 要针对特定 CPU 值进行缩放,请为现有对象创建一个类似于以下内容的 YAML 文件

      1. 创建一个类似于以下内容的 YAML 文件

        apiVersion: autoscaling/v2 (1)
        kind: HorizontalPodAutoscaler
        metadata:
          name: cpu-autoscale (2)
          namespace: default
        spec:
          scaleTargetRef:
            apiVersion: apps/v1 (3)
            kind: Deployment (4)
            name: example (5)
          minReplicas: 1 (6)
          maxReplicas: 10 (7)
          metrics: (8)
          - type: Resource
            resource:
              name: cpu (9)
              target:
                type: AverageValue (10)
                averageValue: 500m (11)
        1 使用autoscaling/v2 API。
        2 为这个水平 Pod 自动缩放器对象指定一个名称。
        3 指定要缩放的对象的 API 版本
        • 对于DeploymentReplicaSetStatefulset 对象,使用apps/v1

        • 对于ReplicationController,使用v1

        • 对于DeploymentConfig,使用apps.openshift.io/v1

        4 指定对象的类型。该对象必须是DeploymentDeploymentConfig/dcReplicaSet/rsReplicationController/rcStatefulSet
        5 指定要缩放的对象的名称。该对象必须存在。
        6 在缩减规模时指定最小副本数。
        7 在扩容时指定最大副本数。
        8 metrics 参数用于内存利用率。
        9 为 CPU 利用率指定cpu
        10 设置为AverageValue
        11 使用目标 CPU 值设置为averageValue
      2. 创建水平 Pod 自动缩放器

        $ oc create -f <file-name>.yaml
  2. 验证是否已创建水平 Pod 自动缩放器

    $ oc get hpa cpu-autoscale
    示例输出
    NAME            REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    cpu-autoscale   Deployment/example   173m/500m       1         10        1          20m

使用 CLI 创建用于内存利用率的水平 Pod 自动缩放器对象

使用 OpenShift Container Platform CLI,您可以创建一个水平 Pod 自动缩放器 (HPA) 来自动缩放现有的DeploymentDeploymentConfigReplicaSetReplicationControllerStatefulSet 对象。HPA 会缩放与该对象关联的 Pod,以维持您指定的平均内存利用率,无论是直接值还是请求内存的百分比。

除非您需要其他对象提供的特定功能或行为,否则建议使用Deployment 对象或ReplicaSet 对象。

HPA 会增加和减少最小和最大数量之间的副本数量,以维持所有 Pod 的指定内存利用率。

对于内存利用率,您可以指定 Pod 的最小和最大数量以及 Pod 应达到的平均内存利用率。如果您未指定最小值,则 Pod 将从 OpenShift Container Platform 服务器获取默认值。

先决条件

要使用水平 Pod 自动缩放器,您的集群管理员必须已正确配置集群指标。您可以使用oc describe PodMetrics <pod-name> 命令来确定是否已配置指标。如果已配置指标,则输出将类似于以下内容,其中CpuMemory 显示在Usage 下。

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-129-223.compute.internal -n openshift-kube-scheduler
示例输出
Name:         openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Cpu:     0
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2020-02-14T22:21:14Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-129-223.compute.internal
Timestamp:             2020-02-14T22:21:14Z
Window:                5m0s
Events:                <none>
步骤

创建用于内存利用率的水平 Pod 自动缩放器

  1. 为以下各项之一创建一个 YAML 文件

    • 要针对特定内存值进行缩放,请为现有对象创建一个类似于以下内容的HorizontalPodAutoscaler 对象

      apiVersion: autoscaling/v2 (1)
      kind: HorizontalPodAutoscaler
      metadata:
        name: hpa-resource-metrics-memory (2)
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 (3)
          kind: Deployment (4)
          name: example (5)
        minReplicas: 1 (6)
        maxReplicas: 10 (7)
        metrics: (8)
        - type: Resource
          resource:
            name: memory (9)
            target:
              type: AverageValue (10)
              averageValue: 500Mi (11)
        behavior: (12)
          scaleDown:
            stabilizationWindowSeconds: 300
            policies:
            - type: Pods
              value: 4
              periodSeconds: 60
            - type: Percent
              value: 10
              periodSeconds: 60
            selectPolicy: Max
      1 使用autoscaling/v2 API。
      2 为这个水平 Pod 自动缩放器对象指定一个名称。
      3 指定要缩放的对象的 API 版本
      • 对于DeploymentReplicaSetStatefulset 对象,使用apps/v1

      • 对于ReplicationController,使用v1

      • 对于DeploymentConfig,使用apps.openshift.io/v1

      4 指定对象的类型。该对象必须是DeploymentDeploymentConfigReplicaSetReplicationControllerStatefulSet
      5 指定要缩放的对象的名称。该对象必须存在。
      6 在缩减规模时指定最小副本数。
      7 在扩容时指定最大副本数。
      8 metrics 参数用于内存利用率。
      9 为内存利用率指定memory
      10 将类型设置为AverageValue
      11 指定averageValue 和特定内存值。
      12 可选:指定缩放策略以控制向上或向下缩放的速度。
    • 要按百分比进行缩放,请为现有对象创建一个类似于以下内容的HorizontalPodAutoscaler 对象

      apiVersion: autoscaling/v2 (1)
      kind: HorizontalPodAutoscaler
      metadata:
        name: memory-autoscale (2)
        namespace: default
      spec:
        scaleTargetRef:
          apiVersion: apps/v1 (3)
          kind: Deployment (4)
          name: example (5)
        minReplicas: 1 (6)
        maxReplicas: 10 (7)
        metrics: (8)
        - type: Resource
          resource:
            name: memory (9)
            target:
              type: Utilization (10)
              averageUtilization: 50 (11)
        behavior: (12)
          scaleUp:
            stabilizationWindowSeconds: 180
            policies:
            - type: Pods
              value: 6
              periodSeconds: 120
            - type: Percent
              value: 10
              periodSeconds: 120
            selectPolicy: Max
      1 使用autoscaling/v2 API。
      2 为这个水平 Pod 自动缩放器对象指定一个名称。
      3 指定要缩放的对象的 API 版本
      • 对于 ReplicationController,使用v1

      • 对于 DeploymentConfig,使用apps.openshift.io/v1

      • 对于 Deployment、ReplicaSet、StatefulSet 对象,使用apps/v1

      4 指定对象的类型。该对象必须是DeploymentDeploymentConfigReplicaSetReplicationControllerStatefulSet
      5 指定要缩放的对象的名称。该对象必须存在。
      6 在缩减规模时指定最小副本数。
      7 在扩容时指定最大副本数。
      8 metrics 参数用于内存利用率。
      9 为内存利用率指定memory
      10 设置为Utilization
      11 指定averageUtilization以及所有 Pod 的目标平均内存利用率,表示为请求内存的百分比。目标 Pod 必须配置内存请求。
      12 可选:指定缩放策略以控制向上或向下缩放的速度。
  2. 创建水平 Pod 自动缩放器

    $ oc create -f <file-name>.yaml

    例如

    $ oc create -f hpa.yaml
    示例输出
    horizontalpodautoscaler.autoscaling/hpa-resource-metrics-memory created
  3. 验证是否已创建水平 Pod 自动缩放器

    $ oc get hpa hpa-resource-metrics-memory
    示例输出
    NAME                          REFERENCE            TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    hpa-resource-metrics-memory   Deployment/example   2441216/500Mi   1         10        1          20m
    $ oc describe hpa hpa-resource-metrics-memory
    示例输出
    Name:                        hpa-resource-metrics-memory
    Namespace:                   default
    Labels:                      <none>
    Annotations:                 <none>
    CreationTimestamp:           Wed, 04 Mar 2020 16:31:37 +0530
    Reference:                   Deployment/example
    Metrics:                     ( current / target )
      resource memory on pods:   2441216 / 500Mi
    Min replicas:                1
    Max replicas:                10
    ReplicationController pods:  1 current / 1 desired
    Conditions:
      Type            Status  Reason              Message
      ----            ------  ------              -------
      AbleToScale     True    ReadyForNewScale    recommended size matches current size
      ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
      ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
    Events:
      Type     Reason                   Age                 From                       Message
      ----     ------                   ----                ----                       -------
      Normal   SuccessfulRescale        6m34s               horizontal-pod-autoscaler  New size: 1; reason: All metrics below target

使用 CLI 了解水平 Pod 自动伸缩器状态条件

您可以使用设置的状态条件来确定水平 Pod 自动伸缩器 (HPA) 是否能够进行伸缩,以及它当前是否以任何方式受到限制。

HPA 状态条件可在自动伸缩 API 的v2版本中使用。

HPA 返回以下状态条件:

  • AbleToScale条件指示 HPA 是否能够获取和更新指标,以及任何与回退相关的条件是否会阻止伸缩。

    • True条件表示允许伸缩。

    • False条件表示由于指定的原因不允许伸缩。

  • ScalingActive条件指示 HPA 是否已启用(例如,目标的副本数量不为零)并且能够计算所需的指标。

    • True条件表示指标工作正常。

    • False条件通常表示获取指标时出现问题。

  • ScalingLimited条件指示所需伸缩规模已达到水平 Pod 自动伸缩器的最大值或最小值上限。

    • True条件表示您需要提高或降低最小或最大副本数才能进行伸缩。

    • False条件表示允许请求的伸缩。

      $ oc describe hpa cm-test
      示例输出
      Name:                           cm-test
      Namespace:                      prom
      Labels:                         <none>
      Annotations:                    <none>
      CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
      Reference:                      ReplicationController/cm-test
      Metrics:                        ( current / target )
        "http_requests" on pods:      66m / 500m
      Min replicas:                   1
      Max replicas:                   4
      ReplicationController pods:     1 current / 1 desired
      Conditions: (1)
        Type              Status    Reason              Message
        ----              ------    ------              -------
        AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
        ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
        ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range
      Events:
      1 水平 Pod 自动伸缩器状态消息。

以下是一个无法伸缩的 Pod 示例

示例输出
Conditions:
  Type         Status  Reason          Message
  ----         ------  ------          -------
  AbleToScale  False   FailedGetScale  the HPA controller was unable to get the target's current scale: no matches for kind "ReplicationController" in group "apps"
Events:
  Type     Reason          Age               From                       Message
  ----     ------          ----              ----                       -------
  Warning  FailedGetScale  6s (x3 over 36s)  horizontal-pod-autoscaler  no matches for kind "ReplicationController" in group "apps"

以下是一个无法获取所需指标进行伸缩的 Pod 示例

示例输出
Conditions:
  Type                  Status    Reason                    Message
  ----                  ------    ------                    -------
  AbleToScale           True     SucceededGetScale          the HPA controller was able to get the target's current scale
  ScalingActive         False    FailedGetResourceMetric    the HPA was unable to compute the replica count: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API

以下是一个请求的自动伸缩小于所需最小值的 Pod 示例

示例输出
Conditions:
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

使用 CLI 查看水平 Pod 自动伸缩器状态条件

您可以查看水平 Pod 自动伸缩器 (HPA) 在 Pod 上设置的状态条件。

HPA 状态条件可在自动伸缩 API 的v2版本中使用。

先决条件

要使用水平 Pod 自动缩放器,您的集群管理员必须已正确配置集群指标。您可以使用oc describe PodMetrics <pod-name> 命令来确定是否已配置指标。如果已配置指标,则输出将类似于以下内容,其中CpuMemory 显示在Usage 下。

$ oc describe PodMetrics openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
示例输出
Name:         openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Namespace:    openshift-kube-scheduler
Labels:       <none>
Annotations:  <none>
API Version:  metrics.k8s.io/v1beta1
Containers:
  Name:  wait-for-host-port
  Usage:
    Memory:  0
  Name:      scheduler
  Usage:
    Cpu:     8m
    Memory:  45440Ki
Kind:        PodMetrics
Metadata:
  Creation Timestamp:  2019-05-23T18:47:56Z
  Self Link:           /apis/metrics.k8s.io/v1beta1/namespaces/openshift-kube-scheduler/pods/openshift-kube-scheduler-ip-10-0-135-131.ec2.internal
Timestamp:             2019-05-23T18:47:56Z
Window:                1m0s
Events:                <none>
步骤

要查看 Pod 上的状态条件,请使用以下命令以及 Pod 的名称:

$ oc describe hpa <pod-name>

例如

$ oc describe hpa cm-test

这些条件显示在输出的Conditions字段中。

示例输出
Name:                           cm-test
Namespace:                      prom
Labels:                         <none>
Annotations:                    <none>
CreationTimestamp:              Fri, 16 Jun 2017 18:09:22 +0000
Reference:                      ReplicationController/cm-test
Metrics:                        ( current / target )
  "http_requests" on pods:      66m / 500m
Min replicas:                   1
Max replicas:                   4
ReplicationController pods:     1 current / 1 desired
Conditions: (1)
  Type              Status    Reason              Message
  ----              ------    ------              -------
  AbleToScale       True      ReadyForNewScale    the last scale time was sufficiently old as to warrant a new scale
  ScalingActive     True      ValidMetricFound    the HPA was able to successfully calculate a replica count from pods metric http_request
  ScalingLimited    False     DesiredWithinRange  the desired replica count is within the acceptable range

其他资源