如何通过Autoscaler实现Kubernetes的伸缩?

news2024/11/16 19:45:34

本文将介绍如何在流量高峰之前使用KEDA和Cron scaler主动调整工作负载规模。

在设计Kubernetes集群时,我们可能经常需要回答以下问题:

  • 集群伸缩需要多长时间?
  • 在新Pod创建之前需要等待多长时间?

有四个主要因素会影响集群的伸缩:

  • Horizontal Pod Autoscaler的反应时间;
  • Cluster Autoscaler的反应时间;
  • 节点预配时间;以及
  • Pod创建时间。

下文将依次讨论这些因素。

默认情况下,kubelet每10秒从Pod中提取一次CPU使用情况数据,而Metrics Server每1分钟从kubelet获取一次这些数据。Horizontal Pod Autoscaler每30秒检查一次CPU和内存度量。

如果度量超过阈值,Autoscaler会增加Pod的副本数,并在采取进一步行动之前暂停3分钟。在最糟糕的情况下,可能要等待长达3分钟才能添加或删除Pod,但平均而言,用户应该期望等待1分钟后Horizontal Pod Autoscaler即可触发伸缩。

Horizontal Pod Autoscaler的反应时间

​Cluster Autoscaler会检查是否有待处理的Pod,并增加集群的大小。检测到需要扩展集群可能需要:

  • 在具有少于100个节点和3000个Pod的集群上最多需要30秒,平均延迟约为5秒;或
  • 在具有100个以上节点的集群上最多需要60秒的延迟,平均延迟约为15秒。

Cluster Autoscaler的反应时间


Linode上的节点预配,也就是从Cluster Autoscaler触发API到新创建节点上可以调度Pod,这一过程需要大约3-4分钟时间。

Linode的预配时间

简而言之,对于小规模集群,我们会面临:

HPA延迟: 1m +

CA延迟: 0m30s +

云提供商: 4m +

容器运行时: 0m30s +

=========================

总计 6m

端到端Autoscaler反应时间

对于具有100个以上节点的集群,总延迟可能为6分30秒……这是一个相当长的时间,那么该如何解决这个问题?可以主动调整工作负载,或者如果非常了解流量模式,也可以提前伸缩。

使用KEDA进行预伸缩

如果流量的变化模式可预测,那么在高峰之前扩展工作负载(和节点)就是可行的。

Kubernetes没有提供根据日期或时间扩展工作负载的机制,因此我们将介绍如何使用KEDA(Kubernetes Event Driven Autoscaler)实现我们的目标。

KEDA由三个组件组成:

  • 一个伸缩器;
  • ​一个指标适配器;以及

  • 一个控制器。

KEDA的架构

我们可以使用Helm安装KEDA:

$ helm repo add kedacore https://kedacore.github.io/charts
$ helm install keda kedacore/keda

安装好Prometheus和KEDA后,让我们创建一个部署。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: podinfo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: podinfo
  template:
    metadata:
      labels:
        app: podinfo
    spec:
      containers:
        - name: podinfo
          image: stefanprodan/podinfo

用下列命令将资源提交到集群:

$ kubectl apply -f deployment.yaml


KEDA在现有的Horizontal Pod Autoscaler之上工作,并使用名为ScaleObject的自定义资源定义(CRD)进行包装。下列ScaledObject使用Cron Scaler定义了更改副本数的时间窗口:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scaledobject
  namespace: default
spec:
  maxReplicaCount: 10
  minReplicaCount: 1
  scaleTargetRef:
    name: podinfo
  triggers:
    - type: cron
      metadata:
        timezone: Europe/London
        start: 23 * * * *
        end: 28 * * * *
        desiredReplicas: "5"

用下列命令提交对象:

$ kubectl apply -f scaled-object.yaml

接下来会发生什么?什么也不会发生。自动伸缩只会在23 * * * *到28 * * * *之间触发。在Cron Guru的帮助下,我们可以将这两个Cron表达式翻译成:

  • 从第23分钟开始(例如2:23、3:23等)。
  • 在第28分钟停止(例如2:28、3:28等)。

如果等到开始时间,我们将注意到副本数增加到5。

使用KEDA通过Cron表达式进行伸缩

在第28分钟后,副本数是否恢复到1?是的,自动伸缩器会恢复为minReplicaCount中指定的副本数。

如果在其中一个时间间隔内增加副本数会发生什么?如果在23和28分钟之间,我们将部署的副本数扩展到10,KEDA将覆盖我们的更改并设置计数。如果在第28分钟后重复相同实验,副本数将设置为10。

在了解了理论后,让我们看一些实际用例。

在工作时间内伸缩

假设我们在开发环境中部署了一个应该在工作时间段内处于活跃状态,并且在夜间应该关闭的工作负载。

我们可以使用以下ScaledObject:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scaledobject
  namespace: default
spec:
  maxReplicaCount: 10
  minReplicaCount: 0
  scaleTargetRef:
    name: podinfo
  triggers:
    - type: cron
      metadata:
        timezone: Europe/London
        start: 0 9 * * *
        end: 0 17 * * *
        desiredReplicas: "10"

默认副本数为零,但在工作时间(上午9点到下午5点)期间,副本会扩展到10个。

仅在工作时间内扩展工作负载

我们还可以扩展Scaled Object以排除周末:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scaledobject
  namespace: default
spec:
  maxReplicaCount: 10
  minReplicaCount: 0
  scaleTargetRef:
    name: podinfo
  triggers:
    - type: cron
      metadata:
        timezone: Europe/London
        start: 0 9 * * 1-5
        end: 0 17 * * 1-5
        desiredReplicas: "10"

这样,我们的工作负载将仅在周一至周五的9点到17点活跃。由于可以组合多个触发器,因此还可以包括一些例外情况。

在周末伸缩

例如,我们可能计划在星期三让工作负载保持更长时间,为此可使用以下定义:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scaledobject
  namespace: default
spec:
  maxReplicaCount: 10
  minReplicaCount: 0
  scaleTargetRef:
    name: podinfo
  triggers:
    - type: cron
      metadata:
        timezone: Europe/London
        start: 0 9 * * 1-5
        end: 0 17 * * 1-5
        desiredReplicas: "10"
    - type: cron
      metadata:
        timezone: Europe/London
        start: 0 17 * * 3
        end: 0 21 * * 3
        desiredReplicas: "10"

在此定义中,工作负载会在周一至周五的9点到17点之间处于活动状态,但星期三会从9点持续到21点。

总结

KEDA cron自动伸缩器可以让我们定义一个时间范围,在此范围内缩放工作负载。这有助于在流量高峰之前扩展Pod,从而提前触发Cluster Autoscaler。

本文介绍了Cluster Autoscaler的工作原理、水平扩展和向集群添加节点需要的时间,以及如何使用KEDA根据Cron表达式扩展应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows环境下 VS2022 编译 OGG 源码

OGG OGG音频编码格式,全称为Ogg Vorbis,是一种开源且无专利限制的音频压缩格式。它被设计用来提供高质量的音频存储和传输,同时保持较小的文件大小。OGG Vorbis支持多声道音频,并且可以处理可变比特率,这意味着它可以根…

分享从零开始学习网络设备配置--任务6.3 使用基本ACL限制网络访问

任务描述 某公司构建了互联互通的办公网,为保护公司内网用户数据的安全,该公司实施内网安全防范措施。公司分为经理部、财务部和销售部,分属3个不同的网段,3个部门之间用路由器进行信息传递。为了安全起见,公司领导要求…

npm 清除缓存

npm cache clean --forcenpm cache verify# 安装依赖 npm install# 建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题 npm install --registryhttps://registry.npmmirror.com npm彻底清理缓存_npm cache verify-CSD…

OpenCV仿射变换和透视变换函数(C++)

文章目录 引言图像仿射变换 warpAffine()图像的旋转仿射变换 透视变换 warpPerspective()透视变换例子参考文献 **仿射变换相关函数** cv::transform():对一组点进行仿射变换 cv::warpAffine():对整幅图像进行仿射变换 cv::getAffineTransform()&#xf…

[基于 Vue CLI 5 + Vue 3 + Ant Design Vue 4 搭建项目] 01 安装 nodejs 环境

文章目录 下载安装测试 这里让我们去看看如何安装一下 nodejs 的环境 下载 通过官网进行下载安装包 官网 https://nodejs.org/zh-cn点击 下载 Node.js (LTS) 开始下载 安装 下载完成之后,双击进行安装 开始进行安装了 这样,node.js 就安装好了 测试 …

Ubuntu下使用Cron定时任务

Ubuntu下使用Cron定时任务 文章目录 Ubuntu下使用Cron定时任务概述Cron 工作原理crontab的基本指令使用Cron 定时任务语法用户的crontab 文件系统的crontab 文件cron 任务设置环境变量1. 直接在 crontab 中声明变量2. 将变量声明为命令的一部分3. 从文件加载变量使用环境变量控…

网络基础入门指南(二)

一、什么是交换机 交换机,Switch 用于将多台计算机/交换机连接到一起,组建网络 交换机负责为其中任意两台计算机提供独享线路进行通信类型: 非网管(即插即用),便宜,不可管理 网管&#xff0…

CCF推荐C类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)

中国计算机学会(CCF)在计算机体系结构、并行与分布计算、存储系统领域推荐了一系列C类会议和期刊。此汇总涵盖了各期刊和会议的全称、出版社、dblp文献网址及研究领域,为学者和研究人员提供了重要的学术交流资源。列表包括《ACM Journal on E…

Javase复习day21算法、arrays、Lamdba表达式

常见算法 查找算法 基本查找 package search;public class BasicSearchDemo1 {public static void main(String[] args) {//基本算法(顺序查找)int[] arr {131,23,57,37,95,48,57,43};System.out.println(basicSearch(arr, 43));}public static boo…

基于PINN 进行混合流体中的热量与质量扩散预测

近年来,物理信息神经网络(PINN,Physics-Informed Neural Networks)成为解决复杂物理问题的一种强大工具。PINN 的核心在于结合物理定律和机器学习的能力,直接从偏微分方程(PDEs)出发&#xff0c…

LDtk to Unity 大致流程和一些注意点

因为自己也还在探索中,所以有点杂乱,后续有其他的东西还会继续更。 制作 先套用这个模板,确定基础的循环。再去丰富。 LDtk一小时完全入门教程_哔哩哔哩_bilibili To Unity 安装包 LDtk To Unity 输出 图集 在Run after saving运行 ../../Lib…

Arch - 架构安全性_凭证(Credentials)

文章目录 OverView凭证(Credentials)1. 传统认证授权方式:Cookie-Session 机制2. OAuth2 令牌概述什么是 JWTJWT 令牌 结构HeaderPayloadSignature JWT的优劣势无状态架构的挑战 3. JWT 与 Cookie-Session 的对比 OverView 即使只限定在“软…

rustDesk远程软件,强的可怕

背景 最近在做一个机房的远程运维,对面系统都是windows的,远程本来采用的向日葵,开两三个窗口就不能再多开了,没办法冲了年费瓜子会员,开通会员之后,确实好很多。 随后又增加了一个值班人员,我…

HarmonyOs 应用基础--ArkTS-核心-基础

目录 八. ArkTS-语句-类型进阶与渲染控制 1. 对象进阶 1.1. 定义对象数组 1.2. 使用对象数组 2. 渲染控制 - ForEach 2.1. ForEach语法 2.2. ForEach使用优化代码 2.3. 案例-学生档案 实现思路 3. Math对象 4. 综合案例 -- 抽奖卡案例 4.1. 初始页面布局(静…

手机到了外地ip地址就变了吗

手机到了外地IP地址就变了吗?随着智能手机的普及,人们越来越频繁地使用手机进行各种网络活动。然而,关于手机IP地址是否会随着地理位置的变化而改变,许多用户仍心存疑惑。本文将深入探讨这一问题,揭示IP地址变化的奥秘…

【C++ 09】继承

文章目录 🌈 一、继承的概念及定义⭐ 1. 继承的概念⭐ 2. 继承的定义🌙 2.1 定义格式🌙 2.2 继承方式和访问限定符🌙 2.3 继承父类成员访问方式的变化🌙 2.4 默认继承方式 🌈 二、父类和子类对象赋值转换⭐…

分布式通信:多计算平台的任务分配

目录 1. 分布式通信 1.1 树莓派配置流程​编辑 1.2 树莓派和laptop处于同一网络​编辑 1.3 laptop配置 1.4 通信测试 1.5 分组通信 ​编辑 1.6 分布式通信测试 ​编辑参考资料 1. 分布式通信 机器人体积较小,采用树莓派作为控制器,实现传感器处…

仿某皮影狸app官网源码 不错的APP下载官网单页源码 HTML源码

分享一款不错的APP下载官网单页源码,直接修改index.html即可 源码下载:https://download.csdn.net/download/m0_66047725/89731228 更多资源下载:关注我。

OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、选择映射(SLM) 4.2 相位截断星座图(PTS) 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 mat…

极狐GitLab 新一代容器镜像仓库正式上线啦!

从极狐GitLab 17.3 开始,私有化部署实例也可以使用新一代容器镜像仓库啦!新一代容器镜像仓库具有更高效的零宕机垃圾收集功能和其他优势。 从去年开始,极狐GitLab 就启动了重构容器镜像仓库的计划,用以构建具有更强功能的镜像仓库…