k8s-hpa自动横向扩容

hpa自动扩容

官方文档

https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

HPA是什么

Kubernetes有一个HPA(Horizontal Pod Autoscaler)的资源,可以实现基于CPU使用率的Pod自动伸缩的功能。

(1)HPA基于Master Node上的kube-controller-manager服务启动参数horizontal-pod-autoscaler-sync-period定义的时长(默认为30秒),周期性的检测Pod的CPU使用率。

如果需要设置horizontal-pod-autoscaler-sync-period可以在Master Node上的/etc/default/kube-controller-manager中修改。

(2)HPA 与之前的 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。通过追踪分析 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要针对性地调整目标Pod的副本数,这是HPA的实现原理。

(3)metrics-server 也需要部署到集群中, 它可以通过 resource metrics API 对外提供度量数据。

Horizontal Pod Autoscaler 演练

Horizontal Pod Autoscaler 可以根据 CPU 利用率自动扩缩 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量 (也可以基于其他应用程序提供的度量指标,目前这一功能处于 beta 版本)。

本文将引领你了解如何为 php-apache 服务器配置和使用 Horizontal Pod Autoscaler。 与 Horizontal Pod Autoscaler 相关的更多信息请参阅 Horizontal Pod Autoscaler 用户指南

参数

minReplicas: 最小pod实例数

maxReplicas: 最大pod实例数

metrics: 用于计算所需的Pod副本数量的指标列表

resource: 核心指标,包含cpu和内存两种(被弹性伸缩的pod对象中容器的requests和limits中定义的指标。)

object: k8s内置对象的特定指标(需自己实现适配器)

pods: 应用被弹性伸缩的pod对象的特定指标(例如,每个pod每秒处理的事务数)(需自己实现适配器)

external: 非k8s内置对象的自定义指标(需自己实现适配器)

案例:监控cpu,内存,每秒数据包自动扩容

apiVersion: autoscaling/v2beta1 #(支持cpu,memory,及自定义)
kind: HorizontalPodAutoscaler
metadata:
  name: bikesvc
  namespace: sg-bs
spec:
  minReplicas: 1
  maxReplicas: 10
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: bikesvc
  metrics:
    - type: Resource
      resource:
        name: memory  # 内存占用率(百分比)
        targetAverageUtilization: 80
    - type: Resource
      resource:
        name: cpu   # cpu占用率(百分比)
        targetAverageUtilization: 80
#    - type: Pods
#      pods:
#        metricName: packets-per-second # (每秒数据包)
#        targetAverageValue: 1
    - type: Object
      object:
        metricName: packets-per-second # (每秒数据包)
        target:
          kind: Deployment
          name: bikesvc
        targetValue: 1000

度量指标

pod清单案例-pod定义cup内存指标

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      nodeName: sg-15
      containers:
        - name: nginx
          image: nginx
          resources:
            requests:
              cpu: 125m  # 向集群申请cpu
              memory: 1024Mi # 向集群申请内存

cpu度量指标

    - type: Resource
      resource:
        name: cpu   # cpu占用率(百分比)
        targetAverageUtilization: 80

memory内存度量指标

		- type: Resource
      resource:
        name: memory  # 内存占用率(百分比)
        targetAverageUtilization: 80

pod度量指标

	第一种可选的度量指标类型是 Pod 度量指标。这些指标从某一方面描述了 Pod, 在不同 Pod 之间进行平均,并通过与一个目标值比对来确定副本的数量。 它们的工作方式与资源度量指标非常相像,只是它们仅支持 target 类型为 AverageValue。
		
		- type: Pods
      pods:
        metricName: packets-per-second # (每秒数据包)
        targetAverageValue: 1000

Object度量指标

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

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

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

type: Object
object:
  metric:
    name: `http_requests` # http请求
    selector: `verb=GET`  # 标签筛选

查看hpa状态详情

> kubectl describe hpa -n sg-bs
Name:                                                         bikesvc
Namespace:                                                    sg-bs
Labels:                                                       <none>
Annotations:                                                  CreationTimestamp:  Fri, 03 Dec 2021 03:35:20 +0000
Reference:                                                    Deployment/bikesvc
Metrics:                                                      ( current / target )
  resource memory on pods  (as a percentage of request):      31% (42299392) / 80%
  "packets-per-second" on Deployment/bikesvc (target value):  <unknown> / 1
  resource cpu on pods  (as a percentage of request):         34% (87m) / 80%
Min replicas:                                                 1
Max replicas:                                                 10
Deployment 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 utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:
  Type     Reason                 Age                  From                       Message
  ----     ------                 ----                 ----                       -------
  Warning  FailedGetObjectMetric  106s (x80 over 21m)  horizontal-pod-autoscaler  unable to get metric packets-per-second: Deployment on sg-bs bikesvc/unable to fetch metrics from custom metrics API: no custom metrics API (custom.metrics.k8s.io) registered
对于上面展示的这个 HorizontalPodAutoscaler,我们可以看出有若干状态条件处于健康状态。 首先,AbleToScale 表明 HPA 是否可以获取和更新扩缩信息,以及是否存在阻止扩缩的各种回退条件。 其次,ScalingActive 表明 HPA 是否被启用(即目标的副本数量不为零) 以及是否能够完成扩缩计算。 当这一状态为 False 时,通常表明获取度量指标存在问题。 最后一个条件 ScalingLimitted 表明所需扩缩的值被 HorizontalPodAutoscaler 所定义的最大或者最小值所限制(即已经达到最大或者最小扩缩值)。 这通常表明你可能需要调整 HorizontalPodAutoscaler 所定义的最大或者最小副本数量的限制了。
posted @ 2021-12-09 11:21  Jeff的技术栈  阅读(445)  评论(0编辑  收藏  举报
回顶部