草庐IT

k8s教程(pod篇)-扩缩容

杨林伟 2023-10-15 原文

文章目录

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

在实际生产系统中,我们经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。此时可以利用Deployment/RCScale机制来完成这些工作

Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式。

02 手动扩缩容机制

手动模式通过运行kubectl scale命令或通过RESTful API对一个Deployment/RC进行Pod副本数量的设置,即可一键完成

以部署nginx为例子,使用命令查看当前部署 nginx pod的数量,正在运行的副本数为3:

通过kubectl scale命令可以将Pod副本数量从初始的3个更新为5个:

-replicas的值设置为比当前Pod副本数量更小的数字,系统将会“杀掉”一些运行中的Pod,以实现应用集群缩容:

03 自动扩缩容机制

自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整

3.1 HPA控制器

Kubernetes从1.l版本开始,新增了名为Horizontal Pod Autoscaler(HPA) 的控制器,用于实现 基于CPU使用率进行自动Pod扩缩容的功能

如下图所示,HPA控制器基于Masterkube-controller-manager服务启动参数--horizontal-pod-autoscaler-- symc-period定义的探测周期(默认值为15s),周期性地监测目标Pod的资源性能指标,并与HPA资源对象中的扩缩容条件进行对比,在满足条件时对Pod副本数量进行调整


Metrics Server持续采集所有Pod副本的指标数据,HPA 控制器通过Metrics Server的API获取这些数据,基于用户定义的扩缩容规则进行计算,得到目标Pod的副本数量

当目标Pod副本数量与当前副本数量不同时, HPA控制器就向Pod的副本控制器(DeploymentRCReplicaSet)发起scale操作,调整Pod的副本数量,完成扩缩容操作。

3.2 指标的类型

Masterkube-controller-manager服务持续监测目标Pod的某种性能指标, 以计算是否需要调整副本数量,目前Kubernetes支持的指标类型如下:

指标描述
Pod资源使用率Pod级别的性能指标,通常是一个比率值,例如CPU使用率
Pod自定义指标Pod级别的性能指标,通常是一个数值,例如接收的请求数量
Object自定义指标或外部自定义指标通常是一个数值,需要容器应用以某种方式提供,例如通过HTTP URL “/metrics” 提供,或者使用外部服务提供的指标采集URL

3.3 扩缩容算法

Autoscaler控制器从聚合API获取到Pod性能指标数据之后,基于下面的算法计算出目标Pod副本数量,与当前运行的Pod副本数量进行对比,决定是否需要进行扩缩容操作:

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

即:当前副本数×(当前指标值/期望的指标值),将结果向上取整

以CPU请求数量为例,如果用户设置的期望指标值为100m,当前实际使用的指标值为200m,则计算得到期望的Pod副本数量应为两个(200/100=2)。如果当前实际使用的指标值为50m,计算结果为0.5,则向上取整,值为1,得到目标Pod副本数量应为1个。

也可以设置容忍度和期望指标值来控制

  • 当计算结果与1非常接近时,可以设置一个容忍度让系统不做扩缩容操作。容忍度通过kube-controller--manager,服务的启动参数--horizontal-pod-autoscaler- tolerance进行设置,默认值为0.1(即10%),表示基于上述算法得到的结果在 [-10%,+10%]区间内,即[0.9,1.1]区间,控制器都不会进行扩缩容操作
  • 也可以将期望指标值(desiredMetricValue)设置为指标的平均值类型,例如targetAveragevaluetargetAverageUtilization,此时当前指标值 (currentMetricValue)的算法为所有Pod副本当前指标值的总和除以Pod副本数量得到的平均值

3.4 HorizontalPodAutoscaler配置详解

Kubernetes将 HorizontalPodAutoscaler资源对象 提供给用户来定义扩缩容的规则,HorizontalPodAutoscaler资源对象处于Kubernetes的API组“autoscaling” 中,下面对HorizontalPodAutoscaler的配置和用法进行说明。

3.4.1 基于autoscaling/v1版本的配置

配置如下:

apiVersion: autoscaling/v1 
kind: HorizontalPodAutoscaler
metadata:
	name: php-apache
spec:
	scaleTargetRef:
		apiversion: apps/v1
		kind: Deployment
		name: php-apache
	minReplicas: 1
	maxReplicas: 10
	targetCPUUtilizationPercentage: 50

参数解析:

参数解析
scaleTargetRef目标作用对象,可以是Deployment、ReplicationController或ReplicaSet…
targetCPUUtilizationPercentage期望每个Pod的CPU使用率都为50%,该使用率基于Pod设置的CPU Request值进行计算,例如该值为200m,那么系统将维持Pod的实际CPU使用值为100m
minReplicas和maxReplicasPod副本数量的最小值和最大值,系统将在这个范围内进行自动扩缩容操作,并维持每个Pod的CPU使用率为50%

为了使用autoscaling/v1版本的HorizontalPodAutoscaler,需要预先安装Metrics Server,用于采集Pod的CPU使用率

3.4.2 基于autoscaling/v2beta2版本的配置

配置如下:

apiVersion: autoscaling/v2beta2 
kind: HorizontalPodAutoscaler
metadata: 
	name: php-apache
spec:
	scaleTargetRef:
		apiversion: apps/v1
		kind: Deployment
		name: php-apache
	minReplicas: 1
	maxReplicas: 10
	metrics:
	- type: Resource
	  resource:
		name: cpu
		target:
		type: Utilization
		averageutilization: 50

参数解析:

参数解析
scaleTargetRef目标作用对象,可以是Deployment、ReplicationController或ReplicaSet…
minReplicas和maxReplicasPod副本数量的最小值和最大值,系统将在这个范围内进行自动扩缩容操作,并维持每个Pod的CPU使用率为50%
metrics目标指标值,在metrics中通过参数type定义指标的类型;通过参数target定义相应的指标目标值,系统将在指标数据达到目标值时(考虑容忍度 的区间,见前面算法部分的说明)触发扩缩容操作

可以将 metrics中的type(指标类型)设置为以下四种:

指标类型描述
Resource指的是当前伸缩对象下Pod的CPU和Memory指标,只支持Utilization和Averagevalue类型的目标值。对于CPU使用率,在target参数中设置 averageUtilization定义目标平均CPU使用率。对于内存资源,在target参数中设置Averagevalue定义目标平均内存使用值
Pods指的是伸缩对象Pod的指标,数据需要由第三方的Adapter提供, 只允许Averagevalue类型的目标值
ObjectKubernetes内部对象的指标,数据需要由第三方Adapter提供, 只支持Value和Averagevalue类型的目标值
External指的是Kubernetes外部的指标,数据同样需要由第三方Adapter提供,只支持Value和Averagevalues类型的目标值

3.4.3 举例

3.4.3.1 Metrics示例 - Pod类型

下面是一个类型为Pods的Metrics示例:

metrics:
- type: Pods
  pods
	  metric:
	  	name: packets-per-second
	  target:
		type: Averagevalue
		averagevalue: 1k

含义:设置Pod的指标名为packets-per-second,在目标指标平均值为1000时
触发扩缩容操作。

3.4.3.2 Metrics示例 - Object类型

例1:设置指标的名称为requests–per-second,其值来源于Ingress “main- route’”,将目标值(value)设置为2000,即在Ingress的每秒请求数量达到2000个时触发扩缩容操作:

metrics:
- type: Object
  object:
  	metric:
  		name: requests-per-second 
  	describedobject:
  		apiVersion:	extensions/vlbeta1 
  		kind: Ingress
  		name: main-route
  	target:
  		type: Value
  		value: 2k

例2:设置指标的名称为http_requests, 并且该资源对象具有标签 verb=GET,在指标平均值达到500时触发扩缩容操作:

metrics:
- type: Object
  object:
	  metric:
		  name: 'http requests' 
		  selector: 'verb=GET'
	  target:
		  type: Averagevalue
		  averagevalue: 500

3.5 基于自定义指标的HPA实践

基于自定义指标进行自动扩缩容时,需要预先部署自定义Metrics Server,目前可以使用基于Prometheus、Microsoft Azure、Datadog Cluster等系统的Adapter实现自定义Metrics Server,未来还将提供基于Google Stackdriver的实现自定义Metrics Server。

以下是基于Prometheus的HPA架构如图所示:

关键组件包括如下:

组件描述
Prometheus定期采集各Pod的性能指标数据
Custom Metrics Server自定义Metrics Server,用Prometheus Adapter进行具体实现。它从Prometheus服务采集性能指标数据,通过Kubernetes的Metrics Aggregation层将自定义指标API注册到Master的API Server中, 以/apis/custom.metrics.k8s.io路径提供指标数据。
HPA ControllerKubernetes的HPA控制器,基于用户定义的HorizontalPodAutoscaler进行自动扩缩容操作

由于篇幅原因,本文不再详述整个实现的过程!有兴趣的童鞋可以参考教程:https://imroc.cc/k8s/best-practice/custom-metrics-hpa/

04 文末

本文主要讲解pod扩缩容的一些概念以及案例,希望能帮助到大家,谢谢大家的阅读,本文完!

有关k8s教程(pod篇)-扩缩容的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  4. objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错 - 2

    我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U

  5. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  6. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  7. ruby-on-rails - rails 教程 : Putting flash messages in partial yields error "undefined method ` each' for nil:NilClass"? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView:

  8. ruby-on-rails - Ruby on Rails 教程 - 5.26 - Sublime Text "Unable to Save"新文件 "spec/support/utilities.rb" - 2

    我正在使用SublimeText2,同时遵循MichaelHartl的RubyonRails教程。可以在http://ruby.railstutorial.org/book/ruby-on-rails-tutorial找到我所指的教程的具体部分。(ctrl+F“list5.26”)。我能够创建规范/支持文件。但是,在尝试创建spec/support/utilities.rb文件时,我收到消息“无法保存~/rails_projects/sample_app/spec/support/utilities.rb”。有人知道为什么会这样吗?SublimeText论坛上有人似乎遇到了完全相同的问

  9. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  10. 【云计算】私有云在VMware下虚拟机的创建与配置(图文教程) - 2

    【适用平台】私有云   说明:完成私有云部分是需要两台虚拟机的,分别为controller、compute两个节点,但我们只需配置一台,然后克隆就方便多啦!需要用到的映射文件:关于vm的安装我就不介绍的,毕竟挺简单的,下面让我们看看基于私有云模块中,虚拟机的搭建吧。1、创建新的虚拟机,这里一般我会选择自定义,毕竟后面的配置都要根据私有云相关来进行搭建,会比较复杂。(如果是基础的可以选择典型,典型的满足一般虚拟机的配置) 2、选择稍后安装操作系统会比较方便后续的选择,这里你也可以自己选择自己的映像文件(但不建议)  3、我们是基于Linux下操作的,所以选择Linux客户机操作系统,版本选择自己

随机推荐