当前位置: 首页 > news >正文

详解Knative的服务管理组件(Serving)

 Knative的服务管理组件Serving是管理应用服务的理想选择,它通过自动缩容为零和基于HTTP负载自动扩展的方式简化了部署流程。Knative平台可管理应用服务的部署、版本、网络、扩缩容。

Knative Serving通过HTTP URL的方式来暴露服务,同时有许多默认的安全设置。在特定的使用场景下,我们可能需要调整这些默认值以满足需求,或者调整服务版本之间的流量分配。由于Knative Serving内置了自动缩容为零的能力,因此称其为Serverless。

01 Serving的架构设计

Knative Serving建立在Kubernetes基础之上,支持Serverless应用和函数的部署与管理。Knative Serving提供了以下中间件原语。

  • 快速部署无服务容器。

  • 自动扩缩容机制,支持缩容到零。

  • 基于Istio组件的服务路由和网络编程。

  • 部署代码的时间点快照以及配置管理。

Knative Serving支持容器化的工作负载。

  • Function:传统FaaS的函数应用。通过将传统FaaS平台运行时框架与函数应用一起封装到容器中,实现对FaaS函数应用的支持。

  • 微服务:满足单一职责原则、可独立部署升级的服务。Knative非常适合用来部署和管理微服务。

  • 传统应用:主要指传统无状态的单体应用。虽然Knative不是运行传统应用的最佳平台,但支持传统无状态应用的部署。

Knative Serving定义了一套CRD对象。这些对象用于定义和控制Serverless工作负载在集群中的行为,如图1所示。

 

图1 Knative Serving对象模型

1、服务(Service):service.serving.knative.dev资源自动管理用户工作负载的整个生命周期。它控制路由和配置对象的创建,在服务更新时确保应用有对应的服务路由、配置和一个新的修订版。服务可以被定义为总是把流量路由到最新的修订版或特定修订版。

2、路由(Route):route.serving.knative.dev资源映射一个网络端点到一个或更多修订版。你可以用多种方式来管理流量,包括分流和命名路由。

3、配置(Configuration):configuration.serving.knative.dev 资源维护了部署应用的最终状态。它遵循云原生应用12要素原则,提供了代码和配置分离的机制。每次修改配置会创建一个新的修订版。

4、修订版(Revision):revision.serving.knative.dev资源是在每次变更工作负载时生成的代码和配置的时间点快照。修订版是不可变对象。系统会自动清理,保留有用的修订版,删除不再使用的修订版。修订版对应的Pod实例数量会根据流量的大小自动进行伸缩。

02 Serving相关的Kubernetes Services

Knative Serving组件包含4个kubernetes Service和2个Deployment,构成了Serving的整体管理能力。

  • activator(Service):负责为不活跃状态的修订版接收并缓存请求,同时报告指标数据给autoscaler。在autoscaler扩展修订版之后,它还负责将请求重试到修订版

  • autoscaler(Service):接收请求指标数据并调整需要的Pod数量以处理流量负载。

  • controller(Service):协调所有公共Knative对象,自动扩展CRD。当用户请求一个Knative service给Kubernetes API,controller将创建对应配置和路由,并将配置转换为revision,同时将revision转化为deployment和KPA。

  • webhook(Service):拦截所有Kubernetes API调用以及所有CRD的插入和更新操作,用来设置默认值,拒绝不一致和无效的对象,验证和修改Kubernetes API调用。

  • networking-certmanager(Deployment):协调集群的ingrese为证书管理对象。

  • networking-istio(Deployment):协调集群的ingress为Istio的虚拟服务。

03 Autoscaler的工作流程

Serverless的重要特点之一就是请求驱动计算。当没有请求时,系统不会分配相应的资源给服务。Knative Serving支持从零开始扩容,也支持缩容到零。在初始状态下,修订版的副本是不存在的。客户端发起请求时,系统要完成工作负载的激活过程。

Knative的扩缩容的流程如图2所示。

 

图2 Knative自动扩缩容的架构图

初次请求流程:客户端请求通过入口网关转发给Activator,Activator负责为不活跃状态的修订版接收并缓存请求,同时报告指标数据给Autoscaler;Autoscaler会创建修订版的Deployment对象;Deployment对象根据Autoscaler设定的扩展副本数创建相应数量的Pod副本。一旦Pod副本的状态变为Ready,Activator会将缓存的客户端请求转发给对应的Pod副本。Gateway然后会将新的请求直接转发给相应的Pod副本,不再转发给Activator。

持续请求流程:修订版副本中的Queue Proxy容器会不断报告指标数据给Autoscaler,Autoscaler会根据当前的指标数据情况不断调整修订版的副本数量。

缩容到零的流程:当一定时间周期内没有请求时,Autoscaler会将Pod副本数设置为零,回收Pod所占资源。同时Gateway会将后续请求路由到Activator,如果后续请求出现可以触发初次请求流程。

04 扩缩容算法

Autoscaler 默认基于Pod接收到的并发请求数扩缩容资源。Pod并发请求数的目标值(target)默认为100。计算公式是:Pod数=并发请求总数/Pod并发请求数的目标值。如果Knative服务中配置并发请求数的目标值为10,那么如果加载了50个并发请求到Knative服务,Autoscaler 就会创建了5个 Pod。

为了快速响应负载的变化,同时避免过度响应负载变化导致频繁创建销毁Pod,Autoscaler实现了两种模式的缩放算法:稳定模式(Stable)和恐慌模式(Panic),如图3所示。

图3 Autoscaler的两种工作模式

1、稳定模式:在稳定模式下,Autoscaler自动调整Deployment的大小,以实现每个Pod所需的平均并发数。Pod的并发数是根据60秒窗口期内接收到的所有数据请求的平均数来计算得出。

2、恐慌模式:Autoscaler计算60秒窗口期内的平均并发数,系统需要60秒内稳定在所需的并发级别。与此同时,Autoscaler 也会计算6秒的窗口期,一旦该窗口期内达到了目标并发数的2倍,则会进入恐慌模式。在恐慌模式下,Autoscaler将在时间更短、对请求更敏感的紧急窗口上工作。一旦紧急情况持续 60 秒,Autoscaler 将返回初始的 60 秒稳定窗口。

 

05 Queue Proxy

Knative服务对应的Pod里有两个容器,分别是User Container和Queue Proxy。User Container为Knative服务中定义的业务容器,包含应用程序及其依赖的运行环境。Queue Proxy是系统容器,以Sidecar方式存在。

Knative Serving为每个Pod注入Queue代理容器 (queue-proxy)。该容器负责向Autoscaler报告用户容器流量指标。Autoscaler接收到这些指标之后,会根据流量指标及相应的算法调整Deployment的Pod副本数量,从而实现自动扩缩容。

06 总结

Knative Serving组件是Knative的核心组件,它完成了一个Serverless计算平台最重要的能力,即服务的部署与弹性伸缩。Knative Service资源对象集成了配置管理、版本管理、流量控制以及扩缩容控制,极大地简化了Serverless的服务管理。

本文摘编于机械工业出版社出版的图书《Knative实战:基于Kubernetes的无服务器架构实践》。

关于作者:

李志伟 某网云原生实验室负责人,容器云领域专家。在Kubernetes、Istio、Serverless、DevOps工具等领域有深入的研究和实践。热心于云原生技术的应用与推广,曾荣获“K8sMeetup中国社区”最受欢迎讲师奖项。

游杨  某网云原生实验室高级运维开发工程师。先后参与Kubernetes和Knative项目的落地与实施工作,拥有丰富的容器平台实践经验,聚焦于Kubernetes、Serverless、CI/CD技术领域。

本书的读者对象:

  • 对Serverless技术感兴趣的读者。

  • 想要将Knative引入当前技术栈的架构师。

  • 想要采用Serverless技术的应用开发者。

  • 想要自己维护Knative Serverless平台的运维开发人员。

 


扫码关注【图书小编辑】视频号

每天来听华章哥讲书

更多精彩回顾

书讯 | 4月书讯 | 好书和最美四月天一起来了...

资讯 | RedMonk 编程语言排行榜:JS持续霸榜,Dart 快速上升!

书单 | 8本书助你零基础转行数据分析岗

干货 | 数字化转型最致命的5个误区

收藏 | Redis最佳实践:7个维度+43条使用规范,带你彻底玩转Redis | 附实践清单

点击阅读全文购买

相关文章:

  • 终于有人将金融风险管理讲明白了
  • 2021年全球机器学习技术大会开幕在即(附精选日程)
  • 抛开数学,一文了解推荐系统框架及原理
  • 恭喜!第十届“吴文俊人工智能科学技术奖”揭晓!华章多位作译者获奖
  • 广告营销行业数据分析入门指导书
  • 五分钟了解互联网Web技术发展史
  • 如何部署一个Knative Service
  • 终于有人把Scrapy爬虫框架讲明白了
  • 超音速亚原子 Java丨Quarkus 开发团队成员打造专为Kubernetes而优化的Java解决方案,助力你快速上手...
  • 河马书来了!线上实验领域的“圣经”火热预售中
  • 【新书速递】深入理解Java虚拟机HotSpot
  • 筑牢“数据基座” 掘金数字经济——5位大咖畅聊金融科技
  • 字节跳动杨震原:A/B测试不是万能的,但不会一定不行 ​
  • 423世界读书日 | 今年的阅读计划完成三分之一了吗?
  • 【技术大会】阿里云 Serverless Developer Meetup 即将亮相上海
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • input实现文字超出省略号功能
  • JavaScript中的对象个人分享
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • storm drpc实例
  • Theano - 导数
  • Vue小说阅读器(仿追书神器)
  • 反思总结然后整装待发
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 使用SAX解析XML
  • 思否第一天
  • 小试R空间处理新库sf
  • 栈实现走出迷宫(C++)
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 自制字幕遮挡器
  • 容器镜像
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • !$boo在php中什么意思,php前戏
  • (52)只出现一次的数字III
  • (java)关于Thread的挂起和恢复
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)大道至简,职场上做人做事做管理
  • (转)关于pipe()的详细解析
  • (转)我也是一只IT小小鸟
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • ... 是什么 ?... 有什么用处?
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .Net Redis的秒杀Dome和异步执行
  • .net 简单实现MD5
  • .NET/C# 的字符串暂存池
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net开发引用程序集提示没有强名称的解决办法
  • .Net中的设计模式——Factory Method模式
  • /etc/fstab 只读无法修改的解决办法