K8S自动扩缩容实践

server/2025/3/14 21:40:30/

以下是 Kubernetes 中 Horizontal Pod Autoscaler (HPA)Vertical Pod Autoscaler (VPA) 的详细 YAML 配置过程及说明:


一、Horizontal Pod Autoscaler (HPA)

1. 前提条件:安装 Metrics Server

HPA 依赖资源指标(如 CPU/内存),需先安装 Metrics Server:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

2. 示例 Deployment

部署一个需要自动扩缩容的应用:

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestresources:requests:cpu: "100m"   # 必须定义资源请求,HPA 才能计算利用率memory: "128Mi"limits:cpu: "200m"memory: "256Mi"

3. 创建 HPA 规则

基于 CPU 利用率的自动扩缩容:

# hpa-cpu.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: nginx-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 50  # 当 CPU 使用率超过 50% 时扩容

基于 内存利用率的自动扩缩容:

# hpa-memory.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: nginx-hpa-memory
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx-deploymentminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: 70  # 当内存使用率超过 70% 时扩容

4. 验证 HPA

kubectl get hpa          # 查看 HPA 状态
kubectl describe hpa nginx-hpa  # 查看详细事件

二、Vertical Pod Autoscaler (VPA)

1. 前提条件:安装 VPA

VPA 需要独立组件,安装步骤如下:

# 克隆 VPA 仓库
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler# 安装 VPA 组件
./hack/vpa-up.sh

2. 创建 VPA 规则

# vpa.yaml
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:name: nginx-vpa
spec:targetRef:apiVersion: "apps/v1"kind: Deploymentname: nginx-deploymentupdatePolicy:updateMode: "Auto"  # 模式:Auto/Off/InitialresourcePolicy:containerPolicies:- containerName: "*"  # 匹配所有容器minAllowed:cpu: "50m"memory: "64Mi"maxAllowed:cpu: "500m"memory: "1Gi"
参数说明:
  • updateMode
    • Auto:自动调整 Pod 资源请求并重启 Pod。
    • Initial:仅调整新 Pod 的资源请求。
    • Off:仅提供建议,不自动执行。
  • minAllowed/maxAllowed:资源调整的上下限。

3. 验证 VPA

kubectl describe vpa nginx-vpa  # 查看 VPA 建议
kubectl get pods -l app=nginx   # 观察 Pod 是否重启(Auto 模式下)

三、HPA + VPA 结合使用注意事项

  1. 优先级问题

    • HPA 和 VPA 同时作用于同一个 Deployment 时,可能因资源调整冲突导致不稳定。
    • 建议优先使用 HPA,VPA 仅在资源请求明显不合理时启用。
  2. VPA 的限制

    • VPA 的 Auto 模式会重启 Pod,可能影响服务可用性。
    • 不支持 StatefulSet 的所有场景(需谨慎使用)。
  3. 资源请求定义

    • 即使使用 VPA,部署时仍需定义初始 resources.requests,否则 Pod 可能无法调度。

四、完整流程示例

1. 部署应用

kubectl apply -f deployment.yaml

2. 部署 HPA

kubectl apply -f hpa-cpu.yaml

3. 部署 VPA

kubectl apply -f vpa.yaml

五、常见问题

1. HPA 不生效

  • 检查 Metrics Server
    kubectl top pods  # 若无数据,说明 Metrics Server 未正常工作
    
  • 确认资源请求:确保 Deployment 中定义了 resources.requests

2. VPA 未调整资源

  • 查看 VPA 建议
    kubectl describe vpa <vpa-name>
    
  • 检查模式:确认 updateMode 设置为 Auto

总结

  • HPA:通过调整 Pod 副本数应对流量波动,适合无状态服务。
  • VPA:通过调整 Pod 资源请求优化资源利用率,适合资源需求变化大的场景。
  • 两者结合时需谨慎,避免资源调整冲突。

http://www.ppmy.cn/server/174985.html

相关文章

Linux下部署前后端分离项目 —— Linux下安装nginx

1 打包前后端项目 1.1 打包Vue项目 # 构建生产环境包 npm run build:prod 注意&#xff1a;我这边使用的命令是 npm run build:pro&#xff0c;一般都是 npm run build:prod&#xff0c;具体看前端package.json文件中是如何配置的&#xff0c;如下&#xff1a; 1.2 后端打包 …

深入解析 React 最新特性:革新、应用与最佳实践

深入解析 React 最新特性&#xff1a;革新、应用与最佳实践 1. 引言 React 作为前端开发的核心技术之一&#xff0c;近年来不断推出 新的 API 和优化机制&#xff0c;从 Concurrent Rendering&#xff08;并发模式&#xff09; 到 Server Components&#xff08;服务器组件&a…

c++介绍函数指针 十

指针代表内存中地址标识符&#xff0c;变量&#xff0c;数组都是存储内存中的数据。所以可以获得它们的地址&#xff0c;用指针来表示这块内存。 如图输出内存中的地址。 对于一个函数来说&#xff0c;也是内存中存储这段数据&#xff0c;所以我们也可以获取函数的地址。 函数…

Mysql表的查询

一&#xff1a;创建一个新的数据库&#xff08;companydb),并查看数据库。 二&#xff1a;使用该数据库&#xff0c;并创建表worker。 mysql> use companydb;mysql> CREATE TABLE worker(-> 部门号 INT(11) NOT NULL,-> 职工号 INT(11) NOT NULL,-> 工作时间 D…

unity几种设计模式(自用)

unity的几种设计模式 1.单例模式2.观察者模式3.工厂模式4.状态模式5.命令模式 1.单例模式 public class GameManager : MonoBehaviour {public static GameManager Instance { get; private set; }void Awake(){if (Instance null){Instance this;DontDestroyOnLoad(gameObj…

微信小程序审核失败,你的小程序涉及提供播放、观看等服务,请补充选择:文娱-其他视频类目 解决

之前审核的都没有什么问题&#xff0c;结果这次就不给过还提示我们这个。 我们的视频是操作演示的视频。仅用于介绍使用。 是否接受修改指引&#xff0c;勾选我不理解以上内容 再勾选 下面不理解内容异项 申诉理由 视频播放和观看只限于当前用户自己使用&#xff0c;而视…

idea超级AI插件,让 AI 为 Java 工程师

引言​ 用户可在界面中直接通过输入自然语言的形式描述接口的需求&#xff0c;系统通过输入的需求自动分析关键的功能点有哪些&#xff0c;并对不确定方案的需求提供多种选择&#xff0c;以及对需求上下文进行补充&#xff0c;用户修改确定需求后&#xff0c;系统会根据需求设…

VMware虚拟机网络连接模式介绍以及nat模式访问公网实践

在 VMware 虚拟机中&#xff0c;网络配置是非常重要的一部分。VMware 提供了三种主要的网络连接模式&#xff0c;分别是桥接模式&#xff08;Bridged&#xff09;、NAT模式&#xff08;NAT&#xff09; 和仅主机模式&#xff08;Host-Only&#xff09;。每种模式都有其特定的用…