研发工程师玩转Kubernetes——自动扩缩容

在《研发工程师玩转Kubernetes——使用Deployment进行多副本维护》一文中,我们通过Deployment实现了多副本维护——即维持在一个确定数量的副本个数。而在现实场景中,我们往往需要根据服务的压力,采用水平(横向)扩容的方式——即增加多个副本,来分担压力。当服务压力降低时,又需要减少副本数来节约成本。本节我们将介绍如何根据服务压力进行自动的扩缩容。

部署

我们借用《研发工程师玩转Kubernetes——CPU配额》中的代码。它是一个Http服务,接受请求后执行一段消耗CPU的操作。

推送镜像

docker build -t simple_http:v5 .
docker tag simple_http:v5 localhost:32000/simple_http:v5
docker push localhost:32000/simple_http:v5

Deployment清单

Deployment可以通过spec.replicas指定需要维护的副本个数。但是本节我们需要动态扩缩容,副本个数根据服务压力动态改变,而不会固定在一个固定的副本个数上,所以spec.replicas字段不需要指定。
在这里插入图片描述

HorizontalPodAutoscaler清单

HorizontalPodAutoscaler是用来设置动态扩缩容条件的组件。我们可以通过它来设置诸如:最少副本数量,最多副本数量和触发扩容的条件(如CPU达到80%时开始扩容)。

# simple_http_deployment.yaml部分内容
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: simple-http-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: simple-http-deployment
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

上面的例子意思是:针对名字(name)叫simple-http-deployment、类型(kind)是Deployment的Pod集合,最低维持(minReplicas)2个副本。如果Pod的CPU利用率超过80%,则开始扩容,最大(maxReplicas)不超过10个副本。
完整的yaml如下:

# simple_http_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-http-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: simple_http
  template:
    metadata:
      labels:
        app: simple_http
    spec:
      containers:
      - name: simple-http-container
        image: localhost:32000/simple_http:v4
        ports:
        - containerPort: 8888
        command: ["python","main.py","-port","$(SERVER_PORT)"]
        env:
        - name: SERVER_PORT
          value:  "8888"
        resources:
          limits:
            cpu: 100m
---
apiVersion: v1
kind: Service
metadata:
  name: simple-http-service
spec:
  type: NodePort
  selector:
    app: simple_http
  ports:
  - port: 80
    targetPort: 8888
    nodePort: 30000 
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: simple-http-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: simple-http-deployment
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 80

执行部署

上述清单我们都放在simple_http_deployment.yaml文件中,只要执行create指令就行

kubectl create -f simple_http_deployment.yaml

deployment.apps/simple-http-deployment created
service/simple-http-service created
horizontalpodautoscaler.autoscaling/simple-http-hpa created

测试

查看HorizontalPodAutoscaler副本数量

kubectl get horizontalpodautoscalers.autoscaling simple-http-hpa 

在这里插入图片描述
此时只有2个副本。
我们使用《研发工程师玩转Kubernetes——CPU配额》中的wrk进行压力测试。
在这里插入图片描述

 wrk -t10 -c10 -d300  http://192.168.137.248:30000

在压测过程中,我们使用下面命令查看CPU负载。

kubectl get horizontalpodautoscalers.autoscaling simple-http-hpa 
NAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGE
simple-http-hpaDeployment/simple-http-deployment1%/80%21024m48s
simple-http-hpaDeployment/simple-http-deployment10%/80%(CPU负载开始增加)21025m1s(开始压测)
simple-http-hpaDeployment/simple-http-deployment95%/80%(CPU负载超过阈值80%)21025m16s
simple-http-hpaDeployment/simple-http-deployment97%/80%2103(开始动态扩容)5m33s
simple-http-hpaDeployment/simple-http-deployment89%/80%(CPU负载开始下降)21046m53s
simple-http-hpaDeployment/simple-http-deployment89%/80%21069m17s
simple-http-hpaDeployment/simple-http-deployment85%/80%21079m43s
simple-http-hpaDeployment/simple-http-deployment79%/80%(CPU负载开始低于阈值80%)210710m(压测结束)
simple-http-hpaDeployment/simple-http-deployment1%/80%210710m
simple-http-hpaDeployment/simple-http-deployment1%/80%2102(自动缩容)15m

我们使用wrk压测了5分钟。这5分钟容器的CPU负载一直很高,Pod也一直在自动扩容。
5分钟后wrk停止,CPU利用率降低到1%。大概又过了5分钟,Pod自动缩容到最低的副本数2。

Kubernetes HorizontalPodAutosc

参考资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/24622.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot +spring security,前后端分离时的security处理方案(二)

一.简介 在前后端分离这样的开发模式下,前后端的交互都是通过 JSON 来进行数据传递的,无论登录成功还是失败,都不会有服务端跳转或者客户端跳转之类的操作。 也就是说无论登录成功还是失败,服务端都会返回一段登录成功或失败的 …

使用【Python+Appium】实现自动化测试

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址 Redirecting 点击下载按钮会到GitHub的…

解决dpdk reserve的内存返回的虚拟地址和iova地址一样的问题

1. 背景: 在ubuntu20.04上用dpdk API: rte_memzone_reserve_aligned("L1L2_PCIE_MEMORY", 1.5*1024*1024*1024, rte_socket_id(), RTE_MEMZONE_1GB|RTE_MEMZONE_IOVA_CONTIG, RTE_CACHE_LINE_SIZE); 分配1.5…

如何在 GNU Linux 上通过 Nvm 安装 Node 和 Npm?

Node.js 是一个流行的 JavaScript 运行时环境,用于开发服务器端和网络应用程序。它带有一个强大的软件包管理器 npm,可以方便地安装和管理 JavaScript 包和依赖项。在 GNU/Linux 系统上,使用 Nvm(Node Version Manager&#xff09…

Framework开发环境搭建

Framework开发环境搭建 开启Android Framework之旅,一步步记录自己学习过程。 硬件配置 RAM:最低16GB,建议32GB,有条件64GB,内存越高,编译时间越短ROM:最低400GB,代码250GB构建15…

Svn安装

目录 一. 软件环境 二. SVN服务端 1. yum安装svn 2. 查看安装的文件列表 3. 建立版本库 3.1 修改数据存储默认位置 3.2 使用svnadmin建立版本库 4. 配制 4.1 添加用户 4.2 配制读写权限 4.3 配制服务 5. 启动服务 5.1 停止服务 5.2 启动服务 5.3 拉取项目 三.…

Zookeeper集群 + Kafka集群

Zookeeper 概述 Zookeeper 定义 Zookeeper是一个开源的分布式的,为分布式框架提供协调服务的Apache项目。 Zookeeper 工作机制 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的…

CodeForces.1786A2.发牌.[中等][flg标识][数学规律][双色牌]

题目描述: 题目解读: 发牌问题,给两人发双色牌,同样还是 给a发1张,然后给b发2,3张; 给a发4,5张,给b发6,7张; 给a发8,9张&#xff…

《最新出炉》Python+Playwright自动化测试-2-playwright的API及其他知识

一.简介 上一篇我已经将PythonPlaywright的环境搭建好了,而且也简单的演示了一下三款浏览器的启动和关闭,是不是很简单啊。今天主要是把一篇的中的代码进行一次详细的注释,然后说一下playwright的API和其他相关知识点。那么首先将上一篇中的…

Spring Cloud面试题

组件 Spring Cloud Eureka:服务注册与发现 Spring Cloud Zuul:服务网关 Spring Cloud Ribbon:客户端负载均衡 Spring Cloud Feign:声明性的Web服务客户端 Spring Cloud Hystrix:断路器 Spring Cloud Config&#xff1…

[C++]octomap安装后测试

测试环境&#xff1a; vs2019 octomap1.9.6 release x64 代码&#xff1a; #include <octomap/octomap.h> #include <octomap/OcTree.h> using namespace std; using namespace octomap; void print_query_info(point3d query, OcTreeNode* node) { if (…

矿井水除氟,污水除氟的工艺分析

高矿化度的废水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

Vivado综合属性系列之十二 BLACK_BOX

目录 一、前言 二、BLACK_BOX ​2.1 属性说明 ​2.2 工程代码 ​2.3 结果 一、前言 ​在调试中&#xff0c;有时不需要知道一个模块或实例的具体实现&#xff0c;或者需要使其对外属于不可见&#xff0c;只知道它的输入输出&#xff0c;即像一个黑盒&#xff0c;此时可以对模…

港联证券|“面值退”增多凸显A股市场化进程良性态势

近日&#xff0c;多家陷入“1元退市”危机的公司纷纷发布风险提示公告称&#xff0c;公司股票存在可能因股价低于面值被终止上市的风险。据《经济参考报》记者不完全统计&#xff0c;今年以来&#xff0c;沪深两市已有10余只个股锁定“面值退”&#xff0c;其中多以披星戴帽公司…

Windows平台下用例图中包含(include)、扩展(extend)和泛化(generalization)介绍

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows平台下用例图中包含(include)、扩展(extend)和泛化(generalization&#xff09;介绍。 用例图是解决用户需求的图&#xff0c;画好用例图一定要理清用例之间的关系。用例之间有三种关系&…

什么是跳表

什么是跳表 跳表全称为跳跃列表&#xff0c;它允许快速查询&#xff0c;插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表&#xff0c;且每一层链表中的元素是前一层链表元素的子集&#xff08;见右…

【Qt】QLocalSocket与QLocalServer问题:接收不到数据、只能收到第一条、数据不完整解决方案【2023.05.24】

简介 Qt很强大,但是Qt的帮助文档、API属实是让我们走不少弯路。QLocalSocket一个很简单的东西,我仅想用来实现一个简单的本地进程通信,就遇到了:客户端循环发送数据,服务端只能接收到一条、接收到数据不完整等奇奇怪怪的现象。 最郁闷的是,网上很多教程说的都是错的😒。…

Spring Authorization Server 系列(三)code换取token

code换取token 概述客户端认证方式换取结果 概述 在获取到code后&#xff0c;就可以使用code换取token了&#xff0c;但在换取token这一步还会对客户端进行一些校验&#xff0c;而这也支持不同的方式&#xff0c;一起来看看。 客户端认证方式 JwtClientAssertionAuthenticati…

期末复习总结【MySQL】聚合查询 + 多表联合查询(重点)

文章目录 前言一、聚合查询1, 聚合函数2, 聚合函数使用示例3, GROUP BY 子句4, HAVING 子句 二、联合查询(重点)1, 笛卡尔积2, 内连接2.1, 示例12.2, 示例22.3, 示例3 3, 外连接4, 自连接 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#…

Yolov8轻量级:EfficientViT,基于级联分组注意力模块的全新实时网络架构,better speed and accuracy

EfficientViT: Memory Efficient Vision Transformer with Cascaded Group Attention 论文:https://arxiv.org/abs/2305.07027 代码:Cream/EfficientViT at main microsoft/Cream GitHub 🏆🏆🏆🏆🏆🏆Yolo轻量化模型🏆🏆🏆🏆🏆🏆 近些年对视觉Tra…