Horizontal Pod Autoscaler(HPA)

注意从kubernetes1.11开始Heapster被废弃不在使用,metrics-server 替代了heapster在这里插入图片描述

基于多项度量指标和自定义度量指标自动扩缩

利用 autoscaling/v2 API 版本,你可以在自动扩缩 php-apache 这个 Deployment 时使用其他度量指标。
首先,将 HorizontalPodAutoscaler 的 YAML 文件改为 autoscaling/v2 格式:

kubectl get hpa php-apache -o yaml > /tmp/hpa-v2.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  minReplicas: 1  			# 最小pod数量
  maxReplicas: 10 			# 最大pod数量
  scaleTargetRef:			# 指定要控制的php-apache信息
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:					# 需要注意的是targetCPUUtilizationPercentage 字段已经被名为 metrics 的数组所取代
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
status:
  observedGeneration: 1
  lastScaleTime: <some-time>
  currentReplicas: 1
  desiredReplicas: 1
  currentMetrics:
  - type: Resource			# 用于计算所需的Pod副本数量的指标列表
    resource:				# 应用资源指标,即当前被弹性伸缩的pod对象中容器的requests和limits中定义的指标
      name: cpu
      current:
        averageUtilization: 0
        averageValue: 0

需要注意的是,targetCPUUtilizationPercentage 字段已经被名为 metrics 的数组所取代。 CPU 利用率这个度量指标是一个 resource metric(资源度量指标)因为它表示容器上指定资源的百分比。 除 CPU 外你还可以指定其他资源度量指标。默认情况下,目前唯一支持的其他资源度量指标为内存。 只要 metrics.k8s.io API 存在,这些资源度量指标就是可用的,并且它们不会在不同的 Kubernetes 集群中改变名称。

你还可以指定资源度量指标使用绝对数值,而不是百分比,你需要将 target.type 从 Utilization 替换成 AverageValue,同时设置 target.averageValue 而非 target.averageUtilization 的值。

还有两种其他类型的度量指标,他们被认为是 custom metrics(自定义度量指标):
Pod 度量指标和 Object 度量指标。这些度量指标可能具有特定于集群的名称,并且需要更高级的集群监控设置。
▶ 第一种可选的度量指标类型是 “Pod 度量指标”。这些指标从某一方面描述了 Pod, 在不同 Pod 之间进行平均,并通过与一个目标值比对来确定副本的数量。 它们的工作方式与资源度量指标非常相像,只是它们仅 支持 target 类型为 AverageValue。

type: Pods
pods:						# 应用被弹性伸缩的pod对象的特定指标
  metric:					# 用于计算所需的Pod副本数量的指标列表
    name: packets-per-second
  target:
    type: AverageValue
    averageValue: 1k

▶ 第二种可选的度量指标类型是"对象(Object)度量指标"。这些度量指标用于描述 在相同名字空间中的别的对象,而非 Pods。 请注意这些度量指标不一定来自某对象,它们仅用于描述这些对象。 对象度量指标支持的target类型包括 Value 和 AverageValue。 如果是Value类型target值将直接与API返回的度量指标比较,而对于AverageValue类型,API返回的度量值将按照 Pod 数量拆分,然后再与target 值比较。 下面的 YAML 文件展示了一个表示 requests-per-second 的度量指标。

type: Object
object:
  metric:
    name: requests-per-second
  describedObject:
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    name: main-route
  target:
    type: Value
    value: 2k

如果你指定了多个上述类型的度量指标,HorizontalPodAutoscaler 将会依次考量各个指标。 HorizontalPodAutoscaler 将会计算每一个指标所提议的副本数量,然后最终选择一个最高值。

基于更特别的度量值来扩缩

许多度量流水线允许你通过 名称 或附加的 标签 来描述度量指标。对于所有非资源类型度量指标(Pod、Object 和后面将介绍的 External), 可以额外指定一个标签选择算符。例如如果你希望收集包含 verb 标签的 http_requests 度量指标,可以按如下所示设置度量指标块,使得扩缩操作<仅针对 GET 请求执行>:

type:
object:
  metric:
    name: http_requests
    selector: {
    
    matchLabels: {
    
    verb: GET}}

这个选择算符使用与 Kubernetes 标签选择算符相同的语法。 如果名称和标签选择算符匹配到多个系列,监测管道会决定如何将多个系列合并成单个值。选择算符是可以累加的,它不会选择目标以外的对象(类型为Pods的目标Pods 或者 类型为Object的目标对象)。

基于与 Kubernetes 对象无关的度量指标执行扩缩

运行在 Kubernetes 上的应用程序可能需要基于与 Kubernetes 集群中的任何对象 没有明显关系的度量指标进行自动扩缩,例如那些描述与任何 Kubernetes 名字空间中的服务都无直接关联的度量指标。在 Kubernetes 1.10 及之后版本中,你可以使用外部度量指标(external metrics)。

使用外部度量指标时,需要了解你所使用的监控系统,相关的设置与使用自定义指标时类似。 外部度量指标使得你可以使用你的监控系统的任何指标来自动扩缩你的集群。 你需要在 metric 块中提供 name 和 selector,同时将类型由 Object 改为 External。 如果 metricSelector 匹配到多个度量指标,HorizontalPodAutoscaler 将会把它们加和。 外部度量指标同时支持 Value 和 AverageValue 类型,这与 Object 类型的度量指标相同。

扫描二维码关注公众号,回复: 14419689 查看本文章

例如,如果你的应用程序处理来自主机上消息队列的任务,为了让每30个任务有1个工作者实例,你可以将下面的内容添加到 HorizontalPodAutoscaler 的配置中。

- type: External
  external:				# 用于应用非附属于任何对象的全局指标
    metric:
      name: queue_messages_ready
      selector:
        matchLabels:
          queue: "worker_tasks"
    target:
      type: AverageValue
      averageValue: 30

如果可以还是推荐定制度量指标而不是外部度量指标,因为这便于让系统管理员加固定制度量指标 API。 而外部度量指标 API 可以允许访问所有的度量指标。 当暴露这些服务时,系统管理员需要仔细考虑这个问题。

Horizontal Pod Autoscaler 状态条件

使用 autoscaling/v2 格式的 HorizontalPodAutoscaler 时,你将可以看到 Kubernetes 为 HorizongtalPodAutoscaler 设置的状态条件(Status Conditions)。 这些状态条件可以显示当前 HorizontalPodAutoscaler 是否能够执行扩缩以及是否受到一定的限制。
status.conditions 字段展示了这些状态条件。 可以通过 kubectl describe hpa 命令查看当前影响 HorizontalPodAutoscaler 的各种状态条件信息:

# kubectl 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:
  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_requests
  ScalingLimited        False   DesiredWithinRange      the desired replica count is within the acceptable range
Events:

对于上面展示的这个 HorizontalPodAutoscaler,我们可以看出有若干状态条件处于健康状态。
AbleToScale 表明 HPA 是否可以获取和更新扩缩信息,以及是否存在阻止扩缩的各种回退条件。 ▷ ScalingActive 表明 HPA 是否被启用(即目标的副本数量不为零)以及是否能够完成扩缩计算。 当这一状态为 False 时,通常表明获取度量指标存在问题。
ScalingLimited 表明所需扩缩的值被 HorizontalPodAutoscaler 所定义的最大或者最小值所限制(即已经达到最大或者最小扩缩值)。这通常表明你可能需要调整 HorizontalPodAutoscaler 所定义的最大或者最小副本数量的限制了。

量纲

HorizontalPodAutoscaler 和 度量指标 API 中的所有的度量指标使用 Kubernetes 中称为 量纲(Quantity) 的特殊整数表示。 例如数量 10500m 用十进制表示为 10.5。 如果可能的话,度量指标 API 将返回没有后缀的整数,否则返回以千分单位的数量。 这意味着你可能会看到你的度量指标在 1 和 1500m (也就是在十进制记数法中的 1 和 1.5)之间波动。

量纲(Quantity)LINK
量纲是使用紧凑的全数字表示法来表示小数值或带有国际计量单位制SI的大数值的表示法。 小数用milli单位表示,而大数用kilo、mega 或 giga 单位表示。
例如,数字 1.5 表示为 1500m, 而数字 1000 表示为 1k,1000000 表示为 1M。 你还可以指定二进制表示法后缀;数字 2048 可以写成 2Ki。
公认的十进制(10 的幂数)单位是 m(milli)、k(kilo,有意小写)、 M(mega)、G(giga)、T(terra)、P(peta)、E(exa)。
公认的二进制(2 的幂数)单位是 Ki (kibi)、Mi (mebi)、Gi (gibi)、 Ti (tebi)、 Pi (pebi)、 Ei (exbi)。

其他

以命令式对象配置创建 Autoscaler

除了使用 kubectl autoscale 命令,也可以使用以下清单以声明方式创建 HorizontalPodAutoscaler:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

使用如下命令创建 autoscaler:

kubectl create -f ./

Young people are not afraid of long time, there is glory on that side.

猜你喜欢

转载自blog.csdn.net/qq_50573146/article/details/126062109
pod