Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >云原生-什么是HPA和PDB、VPA

云原生-什么是HPA和PDB、VPA

作者头像
章工运维
发布于 2024-02-29 02:27:53
发布于 2024-02-29 02:27:53
67500
代码可运行
举报
文章被收录于专栏:章工运维章工运维
运行总次数:0
代码可运行

# Horizontal Pod Autoscaler(HPA)

# 概述

HPA是Horizontal Pod Autoscaler的缩写,它在Kubernetes中允许根据应用程序的负载动态调整Pod的副本数量,从而使得应用程序能够自动扩展或收缩,以适应变化的工作负载,进而提高资源利用率和应用程序的性能。

# 原理

HPA 的原理基于两个核心概念:指标(Metrics)和目标值(Target Value)

  1. 指标: HPA 使用预定义的或自定义的指标(例如 CPU 使用率、内存使用率)来监控应用程序的负载。这些指标反映了应用程序当前的性能状况。
  2. 目标值: HPA 需要设定一个目标值,表示期望的指标水平。当监测到应用程序的实际指标超过或低于这个目标值时,HPA 将触发相应的伸缩操作。

# 使用场景

HPA 在以下场景中特别有用:

  • 流量波动: 当应用程序面临流量波动的时候,需要在使用高峰期动态扩展副本,低谷的时候再缩减相应副本时,HPA是能够自动完成这一过程的,比如每天中午的忙时扩展,午夜闲时自动收编。
  • 成本优化: HPA还可以根据实际负载调整规模,以提高资源利用率,从而降低云服务成本,比如双十一期间因订单量激增,自动扩容申请,但是双十一过后自动回复平常的使用水平。

# 示例

接下来让我们用一个简单的小例子来看看HPA的使用。假设有一个Web服务,我们希望在CPU使用率达到80%时自动扩展,下降到20%时自动缩容。

首先,需要创建一个HPA对象,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@@左右滑动
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deployment-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80

apply一下看看结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@@左右滑动
ubuntu@VM-16-3-ubuntu:~$ cat hpa.yaml 
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-deployment-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
ubuntu@VM-16-3-ubuntu:~$ 
ubuntu@VM-16-3-ubuntu:~$ kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-89f9774c6-vrzs7   1/1     Running   0          11s
ubuntu@VM-16-3-ubuntu:~$ kubectl get deployments.apps 
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   1/1     1            1           14s
ubuntu@VM-16-3-ubuntu:~$ kubectl apply -f hpa.yaml 
horizontalpodautoscaler.autoscaling/nginx-deployment-hpa created
ubuntu@VM-16-3-ubuntu:~$ kubectl get hpa
NAME                   REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx-deployment-hpa   Deployment/nginx-deployment   <unknown>/80%   1         10        1          25s
ubuntu@VM-16-3-ubuntu:~$ 

可以看到HPA已经成功检测到Deployment的当前副本,同时已经设定了Targets是80%,但是由于没有Metrix,所以当前的使用率无法获取。

这个小例子中定义了一个叫做为nginx-deployment-hpa的HPF并关联了名字叫做nginx-deployment的Deployment。当CPU使用率平均值达到80%时,HPA将触发自动扩展,确保Pod的数量在1到10之间。

通过应用这个HPA对象,Kubernetes将根据CPU使用率的变化自动调整Pod的数量,以确保nginx服务的性能和可用性。

# VPA的工作原理

与HPA不同,VPA是一种直接调整正在运行中的Pod的资源分配的机制。VPA不需要增加或减少Pod的数量,而是通过调整现有Pod的资源限制来实现弹性伸缩。这种机制适用于那些对资源需求有明确上限的应用程序,例如数据库或缓存服务。

VPA的组件包括VPA Recommender、VPA Updater和VPA Admission Controller。VPA Recommender负责监视资源利用率并计算目标值,它会查看指标历史记录、OOM事件和部署spec,并据此提出公平的请求。VPA Updater则会逐出那些需要新资源限制的Pod。通过这种方式,VPA可以根据定义的“目标CPU使用率”自动调整正在运行中的Pod的资源分配。

使用VPA时,需要定义一个“Pod Autoscaler” Deployment,它指定了要伸缩的目标Pod。然后,可以使用Kubernetes API定义一个VPA对象,与Pod Autoscaler一起工作。这样,当目标CPU使用率超过或低于设定的阈值时,Kubernetes会自动调整正在运行中的Pod的资源分配,以保证应用程序的性能和稳定性。

# 总结

HPA和VPA是Kubernetes中两种主要的自动扩缩容机制。HPA主要用于根据CPU利用率调整应用程序的副本数,适用于需要水平扩展的应用程序;而VPA则直接调整正在运行中的Pod的资源分配,适用于对资源需求有明确上限的应用程序。在实际应用中,根据应用程序的特点和需求选择合适的自动扩缩容机制,可以提高资源的利用效率和应用程序的稳定性。

# Pod Disruption Budget(PDB)

# 概述

PDB的全称叫做Pod Disruption Budget,是用于控制维护期间Pod中断的策略。它确保在进行计划性维护或者升级时不会导致应用程序的过度中断,从而提高应用程序的可靠性。

# 原理

PDB使用两个关键概念:最小可用副本数(Min Available)和最大不可用副本数(Max Unavailable),分别用于定义在维护期间需要保持的最小可用Pod数量和允许的最大不可用Pod数量:

  1. minAvailable(最小可用 Pod 数量):
  • minAvailable 用于指定在维护期间必须保持运行的Pod的最小数量。这确保了即使在维护期间,也有足够数量的Pod在运行,以保持服务的可用性。
  • 我们可以将 minAvailable 设置为一个整数值,也可以是一个百分比。例如,如果设置为2,表示在维护期间至少要保持2个Pod在运行。如果设置为百分比,它表示相对于ReplicaSet(或其他控制器)中当前运行的Pod数量的百分比。
  1. maxUnavailable(最大不可用 Pod 数量):
  • maxUnavailable 用于指定在维护期间允许的最大不可用 Pod 数量。这是一个相对值,通常与 minAvailable 一起使用,提供了更灵活的控制。
  • minAvailable,我们也可以将 maxUnavailable 设置为一个整数值或百分比。例如,设置为 maxUnavailable: 1 表示在维护期间允许最多1个Pod不可用;设置为 maxUnavailable: 10% 表示在维护期间允许最多10%的Pod不可用。

简单来说就是在Kubernetes维护升级期间,有最多有多少POD可以被删掉,至少要有多少POD必须Ready来提供服务。

# 使用场景

PDB一般适用于以下场景:

  • 保障服务可用性: 在进行计划性维护时,PDB可以确保至少保持指定数量的Pod在运行,从而不影响服务的可用性。
  • 避免突发中断: PDB可以防止在维护期间出现过多的Pod中断,确保应用程序的稳定运行。

# 示例

继续做实验,比如,比如针对Nginx的POD定义了如下的PDB策略:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@@左右滑动
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: nginx-pdb
spec:
  minAvailable: 2  # 至少保持 2 个 Pod 在运行
  maxUnavailable: 1  # 允许最多 1 个 Pod 不可用
  selector:
    matchLabels:
      app: nginx  # 应用程序标签

在这个例子中,PDB nginx-pdb 将确保在维护期间至少有2个Pod在运行,并且允许最多1个Pod不可用。请注意,selector 部分根据部署nginx所打的label来定义。

结果在apply的时候遇到了问题,提示min和max不能同时定义,没办法,注释掉一个apply成功:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@@左右滑动
ubuntu@VM-16-3-ubuntu:~$ kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-89f9774c6-vrzs7   1/1     Running   0          30m
nginx-deployment-89f9774c6-fnbsx   1/1     Running   0          16s
nginx-deployment-89f9774c6-9bw6m   1/1     Running   0          16s
ubuntu@VM-16-3-ubuntu:~$ kubectl apply -f pdb.yaml 
The PodDisruptionBudget "nginx-pdb" is invalid: spec: Invalid value: policy.PodDisruptionBudgetSpec{MinAvailable:(*intstr.IntOrString)(0xc01a234760), Selector:(*v1.LabelSelector)(0xc01a234780), MaxUnavailable:(*intstr.IntOrString)(0xc01a234740), UnhealthyPodEvictionPolicy:(*policy.UnhealthyPodEvictionPolicyType)(nil)}: minAvailable and maxUnavailable cannot be both set
ubuntu@VM-16-3-ubuntu:~$ 
ubuntu@VM-16-3-ubuntu:~$ vi pdb.yaml 
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: nginx-pdb
spec:
  minAvailable: 2  # 至少保持 2 个 Pod 在运行
  #maxUnavailable: 1  # 允许最多 1 个 Pod 不可用,提示冲突后,注释掉maxUnavailable
  selector:
    matchLabels:
      app: nginx  # 应用程序标签
ubuntu@VM-16-3-ubuntu:~$ 
ubuntu@VM-16-3-ubuntu:~$ kubectl apply -f pdb.yaml 
poddisruptionbudget.policy/nginx-pdb created
ubuntu@VM-16-3-ubuntu:~$ kubectl get pdb
NAME        MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
nginx-pdb   2               N/A               1                     5s
ubuntu@VM-16-3-ubuntu:~$ 

所以在真正使用的时候需要特别注意PDB,我们就因为PDB的问题,导致Kubernetes更新失败并无法修复,最后重装了Kubernetes。

HPA和PDB作为Kubernetes中两个关键的概念,用于应对不同的场景和挑战。HPA使得应用程序能够根据实时负载动态调整规模,提高资源利用率;而PDB则确保在计划性维护期间最小化Pod中断,提高应用程序的可靠性。通过合理使用这两个功能,我们可以更好地管理和优化Kubernetes集群中的应用程序。

在具体使用中,需要针对业务的需求来决定是否使用,使用后如何定义具体的参数。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
云原生|什么是HPA和PDB?
最近的项目,Kubernetes的人员要做系统维护的时候,需要修改我容器化应用的PDB,一直问我是否可以改动。
琉璃康康
2023/11/28
3900
云原生|什么是HPA和PDB?
如何在 Kubernetes 上部署高可用应用程序
但使用 Kubernetes 不仅仅是设置它并向其部署 pod。Kubernetes 中许多使应用程序更具弹性和高可用性的丰富功能不仅仅是一件事,而是不同流程和配置的组合。从如何在不停机的情况下部署应用程序,到调度Pod 以确保它们在节点之间正确分布。这些是我们将在本文中讨论的配置和技术的要点:
DevOps云学堂
2024/05/11
4560
如何在 Kubernetes 上部署高可用应用程序
K8S Pod 保护之 PodDisruptionBudget
在 Kubernetes 中,为了保证业务不中断或业务SLA不降级,需要将应用进行集群化部署。通过PodDisruptionBudget 控制器可以设置应用POD集群处于运行状态最低个数,也可以设置应用POD集群处于运行状态的最低百分比,这样可以保证在主动销毁应用POD的时候,不会一次性销毁太多的应用POD,从而保证业务不中断或业务SLA不降级。
YP小站
2020/06/04
2.3K0
K8s pod 动态弹性扩缩容(HPA )部署!步骤齐全,少走坑路
Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标自动调整 Deployment 、ReplicaSet 或 StatefulSet 或其他类似资源,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适用于无法缩放的对象,例如DaemonSet。
民工哥
2022/10/27
6.8K0
K8s pod 动态弹性扩缩容(HPA )部署!步骤齐全,少走坑路
【每日一个云原生小技巧 #44】Kubernetes VPA(Pod 纵向自动扩缩)
Kubernetes VPA 自动调整 Pod 中容器的 CPU 和内存资源限制。不同于水平自动扩缩(HPA),它关注的是单个 Pod 的资源分配,而不是增加或减少 Pod 的数量。
郭旭东
2023/12/14
3430
【云原生 | Kubernetes篇】深入了解Deployment(八)
Deployment控制RS,RS控制Pod的副本数 ReplicaSet: 只提供了副本数量的控制功能 Deployment: 每部署一个新版本就会创建一个新的副本集,利用他记录状态,回滚也是直接让指定的rs生效
Lansonli
2022/06/11
4360
【云原生 | Kubernetes篇】深入了解Deployment(八)
kubernetes其他控制器之PodDisruptionBudget
在Kubernetes中为了保证业务不中断或者业务SLA不降级,需要将应用集群化部署,比如Deployment,StatefulSet部署等。虽然是集群化部署,但是在我们主动销毁Pod的时候,为了避免一次性销毁太多Pod,Kubernetes引用PodDisruptionBudget(PDB)控制器,用来控制集群中Pod的运行个数。
极客运维圈
2020/03/23
9430
kubernetes其他控制器之PodDisruptionBudget
Kubernetes(k8s)-Deployment介绍
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
运维小路
2024/12/30
2340
Kubernetes(k8s)-Deployment介绍
云原生|Hi,Pod,你被控制了!
了解了Pod的基础知识之后,对于实验来说可以通过kubectl run或者apply一个yaml来创建Pod,但是对于生产环境中构建一个CNF来说,有些Pod需要多个副本,有的运行完就不再需要了,有些需要定期执行某些任务,有些需要在不同的node上只创建一个Pod,这样通过一个一个的创建Pod是不仅费时费力且不便于维护,因此需要一个概念来根据不同需求创建对应的Pod并确保在任何时候都有对应要求的副本在运行,这个概念便是Pod的控制器。
琉璃康康
2023/11/27
1880
云原生|Hi,Pod,你被控制了!
Kubernetes 微服务最佳实践
原文作者:ryan4yin,🔗: https://thiscute.world/posts/kubernetes-best-practices/ 本文主要介绍我个人在使用 Kubernetes 的过程中,总结出的一套「Kubernetes 配置」,是我个人的「最佳实践」。其中大部分内容都经历过线上环境的考验,但是也有少部分还只在我脑子里模拟过,请谨慎参考。 阅读前的几个注意事项: 这份文档比较长,囊括了很多内容,建议当成参考手册使用,先参照目录简单读一读,有需要再细读相关内容。 这份文档需要一定的 Kube
我的小碗汤
2023/03/19
1.2K0
Kubernetes 微服务最佳实践
一文看懂 Kubernetes 弹性伸缩
在 Kubernetes 集群中,自动化资源管理和伸缩是保持应用高效运行的关键。Kubernetes 提供了几种不同的机制来帮助实现这一目标:水平自动伸缩(HPA, Horizontal Pod Autoscaler)、垂直自动伸缩(VPA, Vertical Pod Autoscaler)和集群自动伸缩(CA, Cluster Autoscaler)。这些伸缩器在功能和使用场景上有所不同:
SRE运维手记
2024/09/06
5490
一文看懂 Kubernetes 弹性伸缩
K8s降本增效之VPA上篇
VPA全称VerticalPodAutoscaler,即Pod的横向扩缩,其根据容器资源使用率自动设置CPU和内存的requests及limit,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。
zouyee
2023/01/11
1.5K0
Kubernetes Pod Disruption Budget实用指南
管理Kubernetes集群在保持一致的可用性和对故障的韧性方面存在困难。虽然使用副本可以确保存在多个应用程序实例,但并不能保证应用程序运行时的不间断。
云云众生s
2024/03/28
3350
K8s:通过 Pod 干扰预算(PDB)提高节点故障、维护期间 Pod 频繁调度时工作负载的可用性
对于对高可用要求很高的一些容器化应用,例如一些有状态的工作负载,比如数据库,分布式协调服务等, K8s 集群中 Pod 频繁的调度是不能容忍的一件事。尤其涉及到应用集群数据同步,共识,心跳等诸多因素. 容易造成可用性降低,数据延迟甚至潜在的数据丢失。
山河已无恙
2023/08/21
2.1K0
K8s:通过 Pod 干扰预算(PDB)提高节点故障、维护期间 Pod 频繁调度时工作负载的可用性
Kubernetes中的OOM Killer优化技巧
Kubernetes 中的内存不足 (OOM) 杀手:如何优化容器内存管理并保持应用程序稳定性
云云众生s
2024/09/27
2140
k8s滚动升级和扩缩容
用于实现基于CPU使用率进行自动Pod扩缩容的功能。HPA控制器基于Master的kube-controller-manager服务启动参数--horizontal-pod-autoscaler-sync-period定义的探测周期(默认值为 15s),周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的扩缩容条件进行对比,在满足条件时对Pod副本数量进行调整.
丁D
2022/08/12
1.6K0
一文带你掌握Kubernetes VPA(Pod纵向自动扩缩)
之前的文章我们介绍了HPA(Horizontal Pod Autoscaler)的实现,HPA一般被称为横向扩展,与HPA不同的Vertical Pod Autoscaler ( VPA ) 会自动调整 Pod 的 CPU 和内存属性,被称为纵向扩展。VPA可以给出服务运行所适合的CPU和内存配置,省去估计服务占用资源的时间,更合理的使用资源。当然,VPA也可根据资源的使用情况“调整”pod的资源。这里的调整我们用了双引号,因为他的实现机制是重建而不是动态增加。下面是一个实际的例子:假设我的memory limits是100Mi,但是现在已经用到了98Mi,如果再大的话就oom了,此时vpa会在垂直方向上提升你的memory limits的大小。这种vpa比较适合一些资源消耗比较大的应用,例如es,你给大了资源浪费,给小了,又不够。所以vpa就派上用场了。当然,vpa不像hpa默认集成在k8s里面的,需要你自己去配置的。
用户1107783
2023/09/11
2.9K0
一文带你掌握Kubernetes VPA(Pod纵向自动扩缩)
自动扩缩容HPA实践(一)
在Kubernetes中,HPA(Horizontal Pod Autoscaler)是一种自动扩缩容应用程序的方式,可以根据应用程序负载动态调整Pod副本数量。HPA是一个非常有用的功能,它可以帮助您实现自动水平扩展和收缩应用程序,并确保应用程序始终能够处理负载。
玖叁叁
2023/04/30
5530
Kubernetes HPA 详解
在前面的学习中我们使用用一个 kubectl scale 命令可以来实现 Pod 的扩缩容功能,但是这个毕竟是完全手动操作的,要应对线上的各种复杂情况,我们需要能够做到自动化去感知业务,来自动进行扩缩容。为此,Kubernetes 也为我们提供了这样的一个资源对象:HorizontalPodAutoscaling(Pod水平自动伸缩),简称 HPA,HPA 通过监控分析一些控制器控制的所有 Pod 的负载变化情况来确定是否需要调整 Pod 的副本数量,这是 HPA 最基本的原理:
我是阳明
2020/06/15
4.6K0
Kubernetes HPA 详解
什么是HPA
HPA(Horizontal Pod Autoscaler)是Kubernetes的一项功能,可以自动根据CPU使用率等指标来调整Pod副本数量,以实现自动水平扩展和收缩应用程序。使用HPA,可以根据应用程序的需求动态调整Pod数量,从而实现更好的负载均衡和资源利用率。
玖叁叁
2023/04/30
9221
相关推荐
云原生|什么是HPA和PDB?
更多 >
LV.1
某公司资深运维高级运维工程师
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验