Serverless Knative冷启动与自动扩缩容研究:从原理到实践

news2024/9/19 9:46:16

最近一个研究生网页的提问,然后就有了这篇博客!

大佬你好,我看到您的关于Serverless的文章于是十分冒昧的向您提问。我现在是一名在研究通过Serverless容器调度解决冷启动问题的本科生,导师放养,就让看论文但是后面的代码操作一点也不明白也不知道从哪里开始学起,我找了几本书和网课都是讲怎么在Serverless上部署应用程序的但是和我想研究的Serverless内部的容器调度都没有关系,现在十分迷茫不知道该从哪里学起,是该学习kubernetes吗还是什么,不知道怎么开始求大佬指点,谢谢大佬

引言

在Serverless架构中,冷启动问题和自动扩缩容是两个密切相关且至关重要的主题。本文将从Knative的自动扩缩容原理出发,逐步深入到实际案例,帮助你构建一个完整的研究思路。

1. Knative自动扩缩容原理

1.1 核心概念

Knative的自动扩缩容功能主要包括两个关键部分:

  1. 缩减至零(Scale-to-zero):当服务一段时间没有请求时,Pod数量会降到零,节省资源。
  2. 自动扩缩容(Autoscaling):根据incoming流量动态调整Pod数量。

1.2 核心组件

Knative的自动扩缩容由三个主要组件协作完成:

  1. Autoscaler:负责计算和决定需要的Pod数量。
  2. Activator:在没有运行中的Pod时接收请求,并触发扩容。
  3. Queue-Proxy:作为每个Pod的sidecar,收集指标并执行流量缓冲。

1.3 工作流程

  1. Autoscaler持续监控流量指标。
  2. 当流量增加时,Autoscaler计算需要的Pod数量并触发扩容。
  3. 当流量减少时,Autoscaler逐步减少Pod数量,最终可能缩减至零。
  4. 当服务缩减至零后,新的请求会被Activator接收,Activator随即触发扩容。

下面是一个0 instance 情况下,接到请求负载的流程图:
image.png
分解序列图,我们可以得到以下步骤:

  1. 用户发送一个 GET 请求。请求首先到达网关,网关当前将流量发送到 Activator(激活器)。
  2. Activator 缓存请求,然后通知 Autoscaler(自动伸缩器)。
  3. Autoscaler 做出扩展决定,将实例数扩展到 1。Autoscaler 更新 Knative 服务,将其状态设置为一个实例。
  4. 最终,这导致启动一个新的 Revision 实例。
  5. Autoscaler 记录到实例数已达到 1。
  6. Activator 注意到一个 Revision 实例现在已启动。
  7. Activator 现在将之前缓存的请求转发给 Revision 实例。
  8. Revision 实例发送响应。
  9. 响应随后从 Activator 流经网关返回给用户。

2. 冷启动问题深析

2.1 什么是冷启动?

冷启动指的是当服务从零实例扩展到至少一个运行实例所需的时间。这个过程可能包括:

  1. 调度Pod
  2. 拉取容器镜像
  3. 启动容器
  4. 初始化应用

2.2 冷启动的影响

冷启动可能导致:

  • 首次请求的延迟增加
  • 用户体验下降
  • 在高并发情况下可能引发连锁反应

2.3 Knative如何缓解冷启动问题

  1. 预热:通过设置minScale确保始终有最小数量的Pod运行。
  2. Activator:在冷启动过程中缓存请求。
  3. 渐进式扩容:使用算法避免过度扩容。

3. Knative自动扩缩容配置详解

3.1 关键配置参数

apiVersion: v1
kind: ConfigMap
metadata:
  name: config-autoscaler
  namespace: knative-serving
data:
  container-concurrency-target-default: "100"
  enable-scale-to-zero: "true"
  stable-window: "60s"
  scale-to-zero-grace-period: "30s"
  • container-concurrency-target-default:每个Pod的目标并发请求数
  • enable-scale-to-zero:是否允许缩减至零
  • stable-window:稳定窗口期,用于计算平均并发
  • scale-to-zero-grace-period:缩减至零前的等待时间

3.2 服务级别配置

可以在Knative Service定义中覆盖全局配置:

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/minScale: "1"
        autoscaling.knative.dev/maxScale: "5"
        autoscaling.knative.dev/target: "10"

这里设置了最小1个Pod,最大5个Pod,每个Pod的目标并发为10。

4. 使用Apache Kafka增强Knative自动扩缩容

image.png
在 Knative Eventing 系统中,通过 Channels(通道)和 Subscriptions(订阅)定义了一个 Channel(通道),它可以连接到各种后端,如 In-Memory(内存中)、Kafka 和 GCP Pub/Sub,用于事件源。每个 Channel 可以有一个或多个以 Sink Services(接收服务)的形式存在的 Subscriber(订阅者),这些订阅者可以接收事件消息并按需处理。来自 Channel 的每条消息都被格式化为 CloudEvent 并发送到链中的其他 Subscriber 以进行进一步处理。Channels 和 Subscriptions 的使用模式不支持消息过滤功能。

4.1 为什么选择Kafka?

  1. 解耦:Kafka可以解耦事件产生和消费。
  2. 缓冲:在流量突增时作为缓冲。
  3. 持久化:确保消息不会丢失。

4.2 Kafka与Knative Eventing集成

  1. 部署Kafka集群。
  2. 配置KafkaSource连接Kafka和Knative服务。
  3. 利用Knative Eventing的自动扩缩容特性。

4.3 配置示例

apiVersion: sources.knative.dev/v1beta1
kind: KafkaSource
metadata:
  name: kafka-source
spec:
  consumerGroup: knative-group
  bootstrapServers:
    - my-cluster-kafka-bootstrap:9092
  topics:
    - my-topic
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: event-display

这个配置将Kafka主题my-topic的消息发送到Knative服务event-display

5. 实战案例:构建Serverless冷启动负载仿真平台

现在,让我们通过一个实际案例来整合前面所学的知识,构建一个Serverless冷启动负载仿真平台。

5.1 平台概述

我们将创建一个系统,使用真实的访问模式数据通过Kafka发送消息,触发Knative服务的自动扩缩容,并监控冷启动性能。

5.2 技术栈

  • Kubernetes:底层容器编排平台
  • Knative:Serverless框架
  • Apache Kafka:消息队列
  • Prometheus & Grafana:监控和可视化

5.3 实现步骤

  1. 准备环境
    • 部署Kubernetes集群
    • 安装Knative(Serving和Eventing)
    • 部署Kafka集群
  2. 创建负载生成器
import json
from kafka import KafkaProducer
import time

producer = KafkaProducer(bootstrap_servers=['localhost:9092'])

def send_load(timestamp, requests):
    message = json.dumps({
        'timestamp': timestamp,
        'requests': requests
    }).encode('utf-8')
    producer.send('load-topic', message)

# 读取仿真数据并发送
with open('simulation_data.csv', 'r') as f:
    for line in f:
        timestamp, requests = line.strip().split(',')
        send_load(timestamp, int(requests))
        time.sleep(1)  # 控制发送速率
  1. 配置Knative服务
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: cold-start-service
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/minScale: "0"
        autoscaling.knative.dev/target: "10"
    spec:
      containers:
      - image: your-test-image:latest
  1. 配置KafkaSource
apiVersion: sources.knative.dev/v1beta1
kind: KafkaSource
metadata:
  name: kafka-load-source
spec:
  consumerGroup: knative-group
  bootstrapServers:
    - my-cluster-kafka-bootstrap:9092
  topics:
    - load-topic
  sink:
    ref:
      apiVersion: serving.knative.dev/v1
      kind: Service
      name: cold-start-service
  1. 部署监控
    • 配置Prometheus采集Knative指标
    • 设置Grafana仪表板展示关键指标:
      • Pod数量变化
      • 请求延迟
      • 冷启动频率和持续时间
  2. 运行实验
    • 启动负载生成器
    • 观察Knative服务的扩缩容行为
    • 通过Grafana分析冷启动性能

5.4 数据分析

通过这个平台,你可以:

  1. 研究不同负载模式对冷启动的影响
  2. 评估各种Knative配置对冷启动性能的影响
  3. 开发和测试新的冷启动优化策略

结论

通过深入理解Knative的自动扩缩容机制和冷启动问题,再结合实际的负载仿真平台,你现在有了一个强大的工具来系统地研究Serverless环境下的容器调度优化。这个平台不仅可以帮助你验证现有的理论,还可以成为你开发新的调度算法和优化策略的基础。
记住,真正的研究往往始于实践。通过不断调整参数、分析数据,你将逐步积累宝贵的经验,最终可能找到改善Serverless冷启动问题的创新方法。祝你研究顺利!

参考书籍

  • Knative云原生应用开发指南
  • Knative Cookbook Building Effective Serverless Applications with Kubernetes and OpenShift by Burr Sutter, Kamesh Sampath
  • Knative+in+Action-2021

书籍下载连接
https://pan.quark.cn/s/71701c85e7d8

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

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

相关文章

多态、接口、类练习题

代码: public static void main(String[] args) {Person2 personnew Person2("唐僧",new Horse());person.passRiver();person.onRoad();} 接口: interface Vehicles{public void work(); } lass Horse implements Vehicles{Overridepubli…

HIS系统开发,医院HIS系统开发注意事项

在当今信息化迅速发展的时代,医院信息系统(HIS)的开发已成为提升医疗服务效率和质量的关键。HIS系统的开发并非易事,它涉及到众多复杂的技术和管理问题。以下是开发HIS系统时需要特别注意的几个关键问题。 数据安全与隐私保护是HI…

正点原子imx6ull-mini-Linux驱动之Linux 并发与竞争实验(8)

在上一章中我们学习了 Linux 下的并发与竞争,并且学习了四种常用的处理并发和竞争的 机制:原子操作、自旋锁、信号量和互斥体。本章我们就通过四个实验来学习如何在驱动中使 用这四种机制。 1:原子操作实验 本例程我们在第四十五章的 gpiol…

不想交智商税的都收藏了!K9、希喂、渴望,最近风超大的猫咪主食罐测评

宠物行业有多卷咱就不说了,反正某宝一打开品牌多达上百个,各种猫粮产品更是数不胜数!不懂点门道的人选起来确实有点费脑子。不过我养猫这七八年来,前前后后入手过的主食罐头少说也有三十来款,自认还是积累了一些经验。…

《python语言程序设计》2018版第6章第21题平方根的近似求法math模块里有几种实现sqrt函数的方法

只能针对“1111” 或者“77”这样的,其它的不行。但是很成功了 def sqrt(n):lastGuess 0#我让他们两个相等,来建立循环的条件nextGuess n#这样就给了lastGuess和nextGuess进行循环的条件while lastGuess ! nextGuess:lastGuess 1nextGuess (lastGue…

【宝藏系列】物联网中常用的十种通信协议

【宝藏系列】物联网中常用的十种通信协议 文章目录 【宝藏系列】物联网中常用的十种通信协议1️⃣MQTT2️⃣CoAP3️⃣AMQP4️⃣XMPP5️⃣LwM2M6️⃣HTTP7️⃣DDS8️⃣Bluetooth Low Energy9️⃣LoRaWAN1️⃣0️⃣NB-IoT 1️⃣MQTT MQTT(Message Queuing Telemetry T…

51单片机和STM32区别

51单片机和 STM32 区别 51单片机和 STM32 是两种常见的微控制器,它们在架构、性能、外设接口、功耗和开发环境等方面有所不同。 1. 架构差异 51单片机基于传统的哈佛总线结构,采用 CISC 架构,而 STM32 基于 ARM Cortex-M 系列的32位处理器核…

JavaScript高级程序设计教程(第3版 电子版教程)

前言 JavaScript 是一种非常松散的面向对象语言,也是 Web 开发中极受欢迎的一门语言。JavaScript,尽管它的语法和编程风格与 Java 都很相似,但它却不是 Java 的“轻量级”版本,甚至与 Java 没有任何关系。JavaScript 是一种全新的…

vue一些npm i 时报错问题解决【JAVA前后端分离】

前端vue npm i 安装时出现 作为一个懂些前端得 JAVA开发自然是要粗暴解决这个问题了 问题解决 使用命令 npx -p npm6 npm i 即可编译 原因: ERESOLVE与npm版本有关,因为npm版本高对某些事情比npm6.x更严格。通常,最简单的解决方法是将--…

农合生活平台更新升级啦!了解详情戳这里

7月24日,农合生活平台完成了新一轮的版本更新。新版本上线后,农元NYT购买数量将不做限制,优惠券更易得,购物更划算,农元价值升值将进一步「加速度」。 更新说明 1. 数量:旧版本中农元只能定额定量购买&…

卡奥斯智能交互引擎:引领工业智能,共创数字化未来

​智能交互引擎:https://www.cosmoplat.cnhttps://datayi.cn/w/nPN4v4e9 📖一、平台简介 卡奥斯智能交互引擎聚焦工业领域,是卡奥斯结合海尔40年的工业制造经验积累和7年工业互联网平台建设的最佳工业智能实践。该引擎集成了工业大模型技术,基于卡奥斯…

Windows Server搭建Prometheus+Grafana监控系统

1.相关资源下载 所需资源百度网盘下载链接:https://pan.baidu.com/s/1wGH4KL085roIYBkTqmM5Og?pwd1111,也可根据下述方法,在官网进行下载。 1.1 Prometheus下载 访问地址https://prometheus.io/download/,点击prometheus-2.53…

项目管理中的关键:进度管理

项目管理中,进度管理无疑占据了举足轻重的地位,它不仅关乎项目能否按时完成,更是衡量项目效率、成本控制及质量保障的重要标尺。 它要求管理者根据项目的总体目标,科学合理地制定项目进度计划,并在项目实施过程中进行…

线程池参数设置问题

线程池主要包括以下参数&#xff1a; ThreadPoolExecutor executor new ThreadPoolExecutor(2,//核心线程数2,//最大线程数60L,//空闲线程存活时间TimeUnit.SECONDS,new ArrayBlockingQueue<>(2),//任务队列Executors.defaultThreadFactory(),new ThreadPoolExecutor.C…

分布式应用系统设计.Feed 流系统(学习笔记)

什么是Feed 流系统 今天记录 Feed 流系统的设计学习笔记&#xff0c;Feed 流常见系统包括 Twitter、微博、Instagram 和抖音等等&#xff0c;它们的特点是&#xff0c;每个用户都是内容创作者&#xff0c;每个用户也都是内容消费者&#xff0c;每个用户看到的内容都是不同的&a…

PyTorch学习(2)-猫狗大战数据集分类识别-PyTorch代码实训

猫狗大战数据集分类识别-PyTorch代码实训 二分类任务 数据集文件目录结构图 pythonProject/ │ ├── cat_recognition.py │ └── kagglecatsanddogs_5340/└── PetImages/├── Cat/...└── Dog/...Cat和Dog文件夹中的图片的后缀均为.jpg 代码1&#xff08;实现…

MYSQL多表数据去重、合并、取并集等

SQL join 用于把,来自两个或多个表的行结合起来。 下图展示了 LEFT JOIN、RIGHT JOIN、INNER JOIN、OUTER JOIN 相关的 7 种用法。。 1、SELECT <select_list> FROM TableA A LEFT JOIN TableB B ON A.Key = B.Key 2、SELECT <select_list> FROM TableA A LEFT …

在VMware里面安装Linux安装教程

!(https://gitee.com/code-shuyi/local-images/raw/master/image/202407311020201.png) 5385453)] [外链图片转存中…(img-BiUfrRTp-1722395385453)]

替代TLD5190同步四开关升降压LED专用电源调节器,支持PWM调光功能,具有强制电流调节模式

特征:PC8655替代TLD5190  AEC-Q100合格 −设备环境温度&#xff1a; -40C≤TA≤125C −器件结温&#xff1a; -40C≤TJ≤150C  工作输入电压4.5V至55V&#xff0c;启动电压降至4.5V  在各种条件下效率都很高&#xff0c;高达96%  3%LED电流精度  高侧PMOS调…

C语言中的浮点数存储:深入探讨

案例引入 请看下面一段代码并思考结果&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int n 9;float* pFloat (float*)&n;printf("n的值为&#xff1a;%d\n", n);printf("*pFloat的值为&#xff1a;%f\n", *…