K8S指南-平滑升级与自动扩缩容

2023-10-31

目录:
(1)k8s指南-概述
(2)k8s指南-架构
(3)k8s指南-工作负载(1)
(4)k8s指南-工作负载(2)
(5)k8s指南-工作负载(3)
(6)k8s指南-工作负载(4)
(7)k8s指南-Service
(8)k8s指南-Ingress
(9)k8s指南-DNS与服务发现
(10)K8S指南-平滑升级与自动扩缩容

首先给个结论:

  • 系统升级发布时,先是Deployment的replicas生效,假设replicas为10,则先将旧的pod扩/缩容到10。
  • 随后hpa的minReplicas和maxReplicas生效,假设hpa的范围是1~5,则会立即将旧的pod数量缩减到5。
  • 其后Deployment的RollingUpdate生效,按照maxSurge设置扩展新的pod,并逐步缩减旧的pod,直到旧的pod全部替换为新pod并且数量为5。
  • 最后hpa扩缩容策略生效,根据hpa的behavior来执行水平扩缩容。

Pod初始数量与滚动更新

在本系列前文中介绍Deployment的时候介绍过,pod的基本数量是由ReplicaSet控制的,参数字段为.spec.replicas

如果未指定.spec.replicas字段,则默认值为1。

当deployment更新时,在rs指定pod数量的基础上,根据更新策略来更新pod。也就是说,如果当前pod数不为1,而.spec.replicas参数为1时,rs控制器会将初始pod数量降为1。

Deployment支持两种更新策略,分别是滚动更新(RollingUpdate)和删除时更新(Recreate),后者也称为单批次更新。

  • Recreate,先删除当前正在运行的pod,当所有pod销毁后,再创建新的rs并启动新pod。在整个更新过程中,会造成服务中断。一般不用。
  • RollingUpdate,一次仅更新一批pod,分多次将全部pod更新完。该策略实现了服务平滑升级,但不同客户端得到的响应可能会因为来自新旧两个不同版本的服务端而有所不同。

HPA

RS可以控制pod的基本数量,但是需要手动去调整。
HPA(HorizontalPodAutoscaler)可以控制Deployment及其ReplicaSet的规模,从而可以实现自动控制pod的数量。

HPA自动扩缩不适用于无法扩缩的对象,例如DaemonSet。

HorizontalPodAutoscaler 被实现为 Kubernetes API 资源和控制器。

资源决定了控制器的行为。 在 Kubernetes 控制平面内运行的水平 Pod 自动扩缩控制器会定期调整其目标(例如:Deployment)的所需规模,以匹配观察到的指标, 例如,平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标。间隔时间由kube-controller-manager--horizontal-pod-autoscaler-sync-period参数设置,默认为15s。

对资源指标的支持

HPA的任何目标资源都可以基于其中的Pods的资源用量来实现扩缩。在定义Pod规约时,cpumemory这类资源请求是必须被设定的。这些设定值被用来确定资源利用量并被HPA控制器用来对目标资源完成扩缩操作。下面是一个示例:

spec:
  minReplicas: 1
  maxReplicas: 5
  metrics:
	type: Resource
	resource:
	  name: cpu
	  target:
	    type: Utilization
	    averageUtilization: 60

基于这一配置,HPA控制器会根据全部pod的平均cpu利用率是否达到60%来决定要不要扩缩容。
注意,利用率是pod的当前资源用量与request请求值之间的比值。

对容器资源指标的支持

HPA除了支持pod级别的资源指标外,还支持容器级别的资源指标。这使得用户可以为pod中最重要的容器配置扩缩阈值。
比如说,当前pod中有一个web应用和一个执行日志操作的容器,你可以基于web容器的资源用量来执行扩缩,而不管日志操作容器的资源用量。下面是一个示例:

type: ContainerResource
containerResource:
  name: cpu
  container: application // 容器名
  target:
    type: Utilization
    averageUtilization: 60

扩缩行为

在HPA中可以通过behavior参数来设置扩容和缩容行为,包括扩/缩容速率,扩/缩容之后的稳定窗口期。下面是一个示例:

behavior:
  scaleDown:
    stabilizationWindowSeconds: 600 # 等待10分钟再开始缩容
    policies:
    - type: Pods
      value: 4
      periodSeconds: 60   // 每分钟最多只允许缩容4
    - type: Percent
      value: 10
      periodSeconds: 60  // 每分钟最多只允许缩容10%

以上配置为缩容时的策略,第一个策略允许在一分钟内最多缩容4个pod,第二个表示在一分钟内最多缩容当前pod数量的10%。当存在多个策略时,取最大更改量的策略为默认策略。

稳定窗口

在上面扩缩行为示例代码中有一个参数为stabilizationWindowSeconds, 这个时间叫稳定窗口,目的是为了避免因为指标利用率的毛刺现象而出现频繁的扩缩容。

有了稳定窗口期之后,当HPA控制器判断需要扩缩容时,需要先保持窗口期的时间稳定不变。稳定期结束后,根据稳定期时间段的最终期望结果来进行扩缩容。

算法细节

从最基本的角度来看,HPA控制器是基于指标期望值和实际值的比例来进行工作的。计算方式为:

期望副本数 = ceil[当前副本数 *(当前指标值 / 期望指标值)]

举个例子,假设当前指标值为200m, 期望值为100m,则hpa会将当前pod数量扩容2倍(200/100)。
如果当前值为 50m,则pod数量会减半(50/100)。其中ceil为天花板函数,表示向上取整。

但有一点需要注意,如果期望值与实际值的比值接近1,则控制面不会进行扩缩容。那接近1是怎么衡量的呢?这里实际上是可以通过参数进行控制的,如果没有显式设置,则默认值为0.1。换句话说,默认情况下,当期望值与实际值的比值在0.9~1.1之间时,hpa不会实际发生扩缩容。

默认行为

要使用自定义扩缩容,不必指定所有字段。可以在基础配置中指定默认行为,并在自定义配置中覆写自定义参数。
下面是一个默认配置:

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300  // 缩容稳定窗口期
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15    //15s内最多缩容50%
  scaleUp:
    stabilizationWindowSeconds: 0   // 扩容稳定窗口期为0
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15   // 15s内最多扩容100%
    - type: Pods
      value: 4
      periodSeconds: 15  // 15s内最多扩容4个pod
    selectPolicy: Max  // 更改值最大的策略生效,默认就是该策略

然后在自定义配置中覆写缩容策略:

behavior:
  scaleDown:
    policies:
    - type: Percent
      value: 10
      periodSeconds: 60

该配置会与默认配置合并,最终的缩容策略为:60s内最多缩容10%。

selectPolicy:Disable会关闭扩/缩容

副本数上下限

在HPA中可以指定副本数的上下限。比如minReplicas: 1 maxReplicas: 5表示pod数量下限为1,上限为5,换句话说,不管如何缩容,pod数都不能少于1,不管如何扩容,pod数不能大于5。

HPA中副本数的上下限也会对Deployment中的ReplicaSet有影响。
当Deployment上线或更新时,pod初始数量会被设置为Deployment中的rs数量,随后会受到HPA中的副本数限制。

举例说明,当前pod数量为20。Deployment更新时,其rs参数为1,因此rs控制器会将pod数量Scale down到1。
如果HPA中的minReplicas和maxReplica为15~25,则会将pod数量Scale up到15。随后Deployment中更新策略才会对pod执行更新。

这个就是本文开头给出的结论。

快速扩容为什么不快?

比如说有一个配置如下:

behavior:
  scaleUp:
    policies:
    - type: Percent
      value: 900
      periodSeconds: 10

表示允许每10秒最大扩容900%。

但在实际中发现,pod扩容没有达到预期效果。通常原因是计算周期与指标延迟。

在上文中说过HPA控制器是周期性计算期望副本数的,默认值为15秒。每次计算时获取到的监控指标也可能是有延迟的。
这两部分的时长之和为扩容的延迟时间。

通常都不需要HPA极度的灵敏,有一定的延时一般都是可接受的。

使用自定义指标进行伸缩

Kubernetes默认提供了CPU和内存作为HPA弹性伸缩的指标,如果有更复杂的场景需求,比如基于业务单副本QPS大小来进行自动扩缩容,可以考虑安装prometheus-adapter来实现基于自定义指标来进行弹性伸缩。

参考资料

[1]. https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

K8S指南-平滑升级与自动扩缩容 的相关文章

随机推荐

  • 如何遍历一个对象所有的属性并判断属性值

    最近的项目里的一个需求 要我判断一个对象里的所有属性 是否存在值不是 或是null的 public boolean checkGoodMode List
  • 服务器物理内存稳定90%多,服务器物理内存使用率90以上

    服务器物理内存使用率90以上 内容精选 换一换 系统每30秒周期性检测HDFS服务直接内存使用状态 当检测到DataNode实例直接内存使用率超出阈值 最大内存的90 时 产生该告警 直接内存使用率小于阈值时 告警恢复 DataNode可用
  • android自定义圆环控件 滑动选择百分比

    之前做了一个聊天应用 其中需要一个圆环控件 滑动可以选择百分比 看效果图 这个自定义view可以分几步完成 画绿色圆环 画灰色圆环 画三角形 画百分比 其中三角形围绕环形旋转 采用Path类实现 首先画出基本的三角形路径 而后适当计算一下
  • 构造函数及复制构造函数

    一 构造函数 是为了让我们自己去规定 我们定义对象的初始化 这里给出一段程序 作用是按格式输出 输入的时间 include
  • 小型水库雨水情测报及大坝安全监测系统

    一 方案背景 我国水库众多 水库在带给人们便利的同时也存在着巨大的安全隐患 对大坝安全监测的要求越来越高 一旦溃坝失事 会对生命 财产 基础设施 生态环境 经济社会发展等造成灾难性破坏 大坝安全关系着公共安全 经济安全和国家安全 更是水库安
  • R手册--目录

    R手册 说明 本手册所列包基本来自AwesomeR 结合 GitHub 和help package pk name 官方文档整理所得 有助于使用时下最实用的包对R进行深入的学习 致谢 ApacheCN 中文开源组织 致力于官方文档及AI书籍
  • Mac电脑快速安装apt-get

    最近在mac上安装环境和工具 发现以前习惯的apt get者mac上是没有的 所以查了资料 找了一个简单靠谱的方式 1 下载 首先下载前置环境x11 1 双击XQuartz 2 7 8 dmg 安装fink的前置环境X11 2 安装完之后
  • 28、认证

    认证技术 认证 Authentication 又称鉴别或确认 是证实某事是否名副其实或是否真实有效的一个过程 加密 确保信息的机密性 阻止对手的被动攻击 如截取 窃听等 认证技术 完整性 放抵赖 防篡改 确保报文发送者和接收者的真实性以及报
  • UVSLED透明屏,在商业广告中,有哪些应用表现?

    UVSLED透明屏是一种新型的显示屏技术 它采用了UVSLED Ultraviolet Shortwave Light Emitting Diode 作为光源 具有高亮度 高对比度和高色彩饱和度的特点 UVSLED透明屏可以实现透明显示效果
  • vue的监听select的事件

  • webpack发布

    当我们项目开发完成后 需要发布上线 而我们通过webpack dev server的插件打包的文件是存在于内存上的 物理磁盘上并不存在 所以我们需要将内存中的项目复制一份到物理磁盘上 方法 在package json文件中的scripts中
  • 计算机英语学习笔记&深度学习

    学习资料来源于 Robust Face Recognition via Multimodal Deep Face Representation Changxing Ding Student Member IEEE Dacheng Tao F
  • Linux系统下通过TCP与UDP方式建立简易的客户端与服务器之间的连接

    TCP方式 服务器函数 include head h define IP 192 168 31 38 define PORT 2023 int main int argc const char argv 创建套接字socket int sf
  • Oracle快速入门

    目录 快速了解 Oracle SQL Server和MySQL优劣与选择 查看是否开启oracle服务 常用终端命令 常用数据类型 常用运算符 DDL 公司项目推荐写法 DML DQL 特殊关键字 函数 PL SQL 特点和优势 PL SQ
  • 浏览器报错DNS_PROBE_FINISHED_BAD_CONFIG的解决办法

    版权声明 转载请注明作者 独孤尚良dugushangliang 出处 https blog csdn net dugushangliang article details 103047975 是日 发现百度搜索出现问题 起初以为这爆出来一个
  • 满二叉树已知先序,求后序。

    哈哈哈 基金这两天没眼看了 现在看啥都是绿的 题目 已知满二叉树的先序序列 求其后序序列 算法思想 其实做这类题型的时候 咱们可以找一个具体的实例 来找相应的规律 举个例子 先根 1245367 后根 4526731 由例子可以很清晰的看出
  • 定制SpringBoot Starter 之Elasticsearch Rest High Level Client Starter

    定制SpringBoot Starter 之Elasticsearch Rest High Level Client Starter 1 自定义SpringBoot Starter 三要素 1 1 pom
  • (无需root)在termux中使用esptool为ESP8266/ESP32刷写固件

    不说废话 直接走起 下载一个termux 百度一下 给termux换源 百度一下 装python apt install python python pip python cryptography 给pip换源 百度一下 装esptool
  • 模拟退火算法——概率法解全局优化

    1 直观介绍 模拟退火算法来源于固体退火原理 是一种基于概率的算法 将固体加温至充分高 再让其徐徐冷却 加温时 固体内部粒子随温升变为无序状 内能增大 而徐徐冷却时粒子渐趋有序 在每个温度都达到平衡态 最后在常温时达到基态 内能减为最小 它
  • K8S指南-平滑升级与自动扩缩容

    目录 1 k8s指南 概述 2 k8s指南 架构 3 k8s指南 工作负载 1 4 k8s指南 工作负载 2 5 k8s指南 工作负载 3 6 k8s指南 工作负载 4 7 k8s指南 Service 8 k8s指南 Ingress 9 k