Horizontal Pod Autoscaler(Pod水平自动伸缩)

Horizontal Pod Autoscaler 根据观察到的CPU利用率(或在支持自定义指标的情况下,根据其他一些应用程序提供的指标)自动伸缩 replication controller, deployment, replica set, stateful set 中的pod数量。注意,Horizontal Pod Autoscaling不适用于无法伸缩的对象,例如DaemonSets。

Horizontal Pod Autoscaler 被实现作为Kubernetes API资源和控制器。该资源决定控制器的行为。控制器会定期调整副本控制器或部署中副本的数量,以使观察到的平均CPU利用率与用户指定的目标相匹配。

1. Horizontal Pod Autoscaler 是如何工作的

Horizontal Pod Autoscaler 实现为一个控制循环,其周期由--horizontal-pod-autoscaler-sync-period选项指定(默认15秒)。

在每个周期内,controller manager都会根据每个HorizontalPodAutoscaler定义的指定的指标去查询资源利用率。 controller manager从资源指标API(针对每个pod资源指标)或自定义指标API(针对所有其他指标)获取指标。

对于每个Pod资源指标(比如:CPU),控制器会从资源指标API中获取相应的指标。然后,如果设置了目标利用率值,则控制器计算利用率值作为容器上等效的资源请求百分比。如果设置了目标原始值,则直接使用原始指标值。然后,控制器将所有目标容器的利用率或原始值(取决于指定的目标类型)取平均值,并产生一个用于缩放所需副本数量的比率。

如果某些Pod的容器未设置相关资源请求,则不会定义Pod的CPU使用率,并且自动缩放器不会对该指标采取任何措施。

2. 算法细节

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]

直译为:(当前指标值 ➗ 期望指标值) ✖️ 当前副本数 ,结果再向上取整,最终结果就是期望的副本数量

例如,假设当前指标值是200m ,期望指标值是100m,期望的副本数量就是双倍。因为,200.0 / 100.0 == 2.0 

如果当前值是50m,则根据50.0 / 100.0 == 0.5,那么最终的副本数量就是当前副本数量的一半

如果该比率足够接近1.0,则会跳过伸缩

当targetAverageValue或者targetAverageUtilization被指定的时候,currentMetricValue取HorizontalPodAutoscaler伸缩目标中所有Pod的给定指标的平均值。

所有失败的和标记删除的Pod将被丢弃,即不参与指标计算

当基于CPU利用率来进行伸缩时,如果有尚未准备好的Pod(即它仍在初始化),那么该Pod将被放置到一边,即将被保留。

kubectl 也支持Horizontal Pod Autoscaler

# 查看autoscalers列表
kubectl get hpa
# 查看具体描述
kubectl describe hpa
# 删除autoscaler
kubectl delete hpa

# 示例:以下命名将会为副本集foo创建一个autoscaler,并设置目标CPU利用率为80%,副本数在2~5之间
kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80

3. 演示

Horizontal Pod Autoscaler automatically scales the number of pods in a replication controller, deployment, replica set or stateful set based on observed CPU utilization.

创建Dockerfile,并构建镜像

FROM java:8
COPY ./hello-world-0.0.1-SNAPSHOT.jar hello-world.jar 
CMD java -jar hello-world.jar 

在hello-world.jar中执行一些CPU密集型计算

运行镜像并暴露为服务

kubectl run hello-world-example \
     --image=registry.cn-hangzhou.aliyuncs.com/chengjs/hello-world:2.0 \
     --requests='cpu=200m' \
     --limits='cpu=500m' \
     --expose \
     --port=80 \
     --generator=run-pod/v1 

创建 Horizontal Pod Autoscaler

HPA将增加和减少副本数量,以将所有Pod的平均CPU利用率维持在50% 

kubectl autoscale deployment hello-world-example --cpu-percent=50 --min=1 --max=10 

检查autoscaler的当前状态

kubectl get hpa 

增加负载

接下来,利用压测工具持续请求,以增加负载,再查看

kubectl get deployment hello-world-example

通过使用autoscaling/v2beta2版本,你可以定义更多的指标 

首先,以autoscaling/v2beta2格式获取HorizontalPodAutoscaler的YAML

kubectl get hpa.v2beta2.autoscaling -o yaml > /tmp/hpa-v2.yaml

在编辑器中打开/tmp/hpa-v2.yaml文件,接下来对其进行修改

第一个可以替换的指标类型是Pod指标。这些指标在各个容器中平均在一起,并且和目标值进行比较,已确定副本数。例如:

type: Pods
pods:
  metric:
    name: packets-per-second
  target:
    type: AverageValue
    averageValue: 1k 

第二个可以替换的指标类型是对象指标。顾名思义,它描述的是Object,而不是Pod。例如:

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

修改后完整的/tmp/hpa-v2.yaml文件如下:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
  metadata:
    name:hello-world-example
    namespace:default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: hello-world-example
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Pods
    pods:
      metric:
        name: packets-per-second
      target:
        type: AverageValue
        averageValue: 1k
  - type: Object
    object:
      metric:
        name: requests-per-second
      describedObject:
        apiVersion: networking.k8s.io/v1beta1
        kind: Ingress
        name: main-route
      target:
        type: Value
        value: 10k
status:
  observedGeneration: 1
  lastScaleTime: <some-time>
  currentReplicas: 1
  desiredReplicas: 1
  currentMetrics:
  - type: Resource
    resource:
      name: cpu
    current:
      averageUtilization: 0
      averageValue: 0
  - type: Object
    object:
      metric:
        name: requests-per-second
      describedObject:
        apiVersion: networking.k8s.io/v1beta1
        kind: Ingress
        name: main-route
      current:
        value: 10k

4. Docs

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

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

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands 

<think>好的,我现在需要给用户介绍HPA(Horizontal Pod Autoscaler)。首先,我应该明确HPA是什么,可能是在Kubernetes中的概念。HPA的中文全称是水平Pod自动伸缩器,对吧? 接下来,要解释它的作用。水平自动伸缩指的是根据负载情况自动调整Pod的数量,这和垂直自动伸缩(增加单个Pod的资源)不同。需要强调HPA的横向扩展特性。 然后,要说明HPA的工作原理。它应该是基于某种指标,比如CPU利用率或者内存使用量,当这些指标超过或低于设定的阈值时,HPA就会增加或减少Pod的数量。这里可能需要提到Metrics Server,因为HPA需要从它那里获取指标数据。 还要提到HPA的配置参数,比如目标利用率、最小和最大Pod数量。举个例子,当CPU使用率超过50%时,HPA会将Pod数量从2个增加到最多5个,这样用户更容易理解。 另外,HPA支持自定义指标,比如应用特定的QPS(每秒查询数),这需要安装适配器,比如Prometheus Adapter。这部分可能对高级用户比较重要,但需要简明扼要地说明。 应用场景方面,可以举例如应对流量高峰,保证服务稳定,同时节省资源。例如电商大促时自动扩容,流量下降后自动缩容,这样用户能直观感受到HPA的价值。 最后,使用步骤可能需要简要说明:安装Metrics Server、部署应用、创建HPA策略、测试验证。不过用户可能不需要详细步骤,但了解大致流程有帮助。 需要注意HPA的局限性,比如不是所有应用都适合,特别是那些有状态的或有启动延迟的应用,自动伸缩可能导致问题。这部分提醒用户在实际使用中注意评估。 总结时,要强调HPA在Kubernetes生态中的重要性,帮助用户实现弹性伸缩,提升资源利用率。确保整个解释结构清晰,由浅入深,覆盖基本概念、原理、配置、场景和注意事项。</think>HPA(Horizontal Pod Autoscaler)是 Kubernetes 中实现**水平 Pod 自动伸缩**的核心组件,它能根据实时负载动态调整 Pod 副本数量,确保应用既能应对流量高峰,又能避免资源浪费。 --- ### 一、核心原理 1. **指标监控** HPA 持续采集目标 Pod 的指标数据(如 CPU 使用率、内存占用、自定义指标等),默认通过 Metrics Server 获取基础资源指标。 2. **伸缩决策** 根据用户设定的目标值(如 `targetCPUUtilizationPercentage: 50%`),HPA 自动计算所需 Pod 数量: ``` 期望副本数 = ceil[当前副本数 × (当前指标值 / 目标指标值)] ``` 例如:当前 CPU 使用率为 75%,目标为 50%,则副本数会调整为 `ceil(当前副本数 × 1.5)`。 3. **边界控制** 用户需设置最小(`minReplicas`)和最大(`maxReplicas`)副本数,防止过度伸缩。 --- ### 二、典型配置示例 ```yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: myapp-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 60 ``` --- ### 三、关键特性 1. **多指标支持** - **资源指标**:CPU、内存(需安装 Metrics Server) - **自定义指标**:QPS、队列长度等(需 Prometheus Adapter) - **外部指标**:如来自云服务商的负载均衡器请求数 2. **冷却机制(Cooldown)** - **扩容冷却期**(默认 3 分钟):防止短时间内频繁扩容 - **缩容冷却期**(默认 5 分钟):避免因指标抖动导致副本数震荡 --- ### 四、应用场景 | 场景 | 说明 | |---------------------|----------------------------------------------------------------------| | 突发流量 | 电商大促时自动扩容 Web 服务 | | 周期性负载 | 每天早高峰时自动扩展数据处理服务 | | 成本优化 | 夜间流量低谷时自动缩减非关键业务 Pod 数量 | --- ### 五、使用限制 - **有状态服务需谨慎**:如数据库等有状态应用可能因副本变化导致数据不一致 - **启动延迟敏感型应用**:新增 Pod 需要较长时间初始化时,可能引发短暂服务降级 - **指标采集延迟**:默认 15 秒采集间隔,突发瞬时流量可能响应不及时 --- ### 六、最佳实践 1. **设置合理的边界值**:避免将 `maxReplicas` 设为过大值导致资源耗尽 2. **结合 Cluster Autoscaler**:当节点资源不足时自动扩容集群节点 3. **压力测试**:通过负载测试确定最佳目标指标阈值 4. **监控 HPA 事件**:使用 `kubectl describe hpa` 查看伸缩决策日志 HPA 与 Kubernetes 生态系统深度集成(如与 Cluster Autoscaler 联动),是实现云原生应用弹性架构的关键技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值