Serverless - Knative V1
Knative概述
概述
- Knative是一款基于Kubernetes的Serverless框架,支持基于请求的自动弹性、在没有流量时将实例数量自动缩容至零、版本管理与灰度发布等能力
- 在完全兼容社区Knative和Kubernetes API的基础上,ACS Knative进行了多维度的能力增强,例如通过保留实例降低冷启动时间、基于AHPA实现弹性预测等
为什么要在Kubernetes集群中使用Knative
Knative介绍
Knative是一款基于Kubernetes集群的Serverless框架,提供了云原生、跨平台的Serverless编排标准。Knative通过整合容器构建、工作负载管理以及事件模型来实现这一Serverless标准,优势如下。
- 更聚焦于业务逻辑:Knative通过简单的应用配置、自动扩缩容等手段让开发者聚焦于业务逻辑,降低运维负担、减少对底层资源的关注。
- 标准化:将业务代码部署到Serverless平台时,需要考虑源码的编译、部署和事件的管理。
- 目前社区和云厂商提供的Serverless解决方案和FaaS方案标准不一。
- Knative提供了一个标准、通用的Serverless框架。例如,如需在Knative中实现事件驱动,您可以编写对应的YAML文件(CR)并在集群中部署,无需与云产品做深度绑定,便于跨平台迁移。
- 使用门槛低:Knative支持将代码自动打包为容器镜像并发布为服务,也支持将函数快捷地部署到Kubernetes集群中,以容器的方式运行。
- 应用管理自动化:Knative支持在没有流量时自动将实例数量缩容至零,从而节省资源,还提供版本管理、灰度发布等功能。
- 事件驱动:Knative提供了完整的事件模型,便于接入外部系统的事件,并将事件路由到适当的服务或函数进行处理。
核心组件
Knative包括以下核心组件,分别执行不同的功能
- Knative Serving:管理Serverless工作负载,提供了应用部署、多版本管理、基于请求的自动弹性、灰度发布等能力,而且在没有业务流量时可以将应用实例缩容至零。
- Knative Eventing:提供了事件源的接入、事件注册和订阅、以及事件过滤等一整套事件管理的能力。事件模型可以有效地解耦生产者和消费者的依赖关系。
- Knative Functions: 提供了一个简单的方式来创建、构建和部署Knative服务。您无需深入了解底层技术栈(例如Kubernetes、容器、Knative),通过使用Knative Functions,即可将无状态、事件驱动的函数作为Knative服务部署到Kubernetes集群中。
功能特性
相较于在Kubernetes集群不使用Knative,使用Knative能帮您以更简便的方式实现如下功能特性。
基于请求的自动弹性
- 基于CPU或者Memory的弹性有时并不能完全反映业务的真实使用情况
- 对于Web服务来说,基于并发数(QPS)或者每秒处理请求数(RPS)进行弹性伸缩更能直接反映服务性能
- Knative Serving会为每个Pod注入queue-proxy容器,收集容器并发数(Concurrency)或请求数(RPS)指标
- Autoscaler定时获取指标后,会根据相应的算法自动调整Deployment的Pod数量,从而实现基于请求的自动扩缩容
- 如果在ACS集群中实现相应的操作,您需要分别创建Deployment、Service,配置Ingress网关,然后配置HPA参数。
- 而使用Knative服务时,您只需要部署Knative并配置Knative服务的YAML文件。
在没有流量时将实例数量自动缩容至零
- Knative支持在应用无流量请求时将Pod数量自动缩容至0,并在有请求时自动扩容Pod
- Knative中定义了两种请求访问模式:Proxy(代理模式)和Serve(请求直达模式)
- 模式的切换由Autoscaler组件负责
- 当请求为0时,Autoscaler会将请求模式切换为Proxy模式
- 当有请求访问时,Autoscaler会收到通知进行扩容,扩容的Pod状态变为Ready后对请求进行转发,此时Autoscaler会将访问模式切换为Serve模式
两种请求访问模式的路径与切换时机如下(承载访问模式的底层CRD为ServerlessService,简称SKS,Autoscaler根据实例数与Ready状态切换其模式):
flowchart TD
C["客户端请求"] --> GW["Ingress 网关"]
GW --> SKS{"访问模式<br>(Autoscaler 负责切换)"}
SKS -->|"Proxy 模式<br>0 实例 / 实例未 Ready"| ACT["Activator"]
SKS -->|"Serve 模式<br>请求直达"| QP["queue-proxy"]
ACT -->|"触发扩容"| AS["Autoscaler"]
AS -->|"扩容 Pod"| POD["Pod"]
POD --> QP
QP --> APP["业务容器"]
ACT -.->|"Pod Ready 后<br>转发请求"| QP
AS -.->|"切换为 Serve 模式"| SKS
- Proxy 模式:0实例或实例未Ready时,请求经Activator代理,Activator缓冲请求并触发扩容,待Pod Ready后完成转发
- Serve 模式:实例Ready后,Ingress网关绕过Activator,请求直达Pod内的queue-proxy,避免常驻代理层的额外开销
版本管理与灰度发布
创建Knative服务时底层会自动创建一个Configuration资源和一个Route资源。
- Configuration
- 当前期望状态的配置
- 每次更新Service就会更新Configuration,Configuration的更新会创建一个唯一的Revision
- Revision相当于Configuration的版本管理机制
- Route
- 负责将请求路由到Revision,并可以向不同的Revision转发不同比例的流量
基于以上特性,您可以使用Revision进行版本的管理,例如版本的回退。您还可以进行流量的灰度发布,例如创建了V1版本的Revision后,当版本需要变更时可以更新服务的Configuration,创建V2版本的Revision,通过Route对V1、V2设置不同的流量比例(例如V1为70%,V2是30%),那么流量会按照预设的比例进行分发。
事件驱动
Knative通过Eventing提供了完整的事件模型,便于接入外部系统(例如GitHub、消息队列等)的事件,并将事件路由到适当的Knative服务或函数进行处理。
为什么要使用ACS Knative
在完全兼容社区Knative并提供标准Kubernetes API接口的基础上,ACS Knative进一步增强产品化能力并提供了更丰富的产品方案。
- 产品化的能力:提供了产品化一键部署能力,您无需购买资源搭建系统。同时提供产品控制台,支持白屏化操作,降低Kubernetes集群和Knative的使用门槛
- 简化运维:
- 核心组件托管:在ACS集群中,Knative的核心组件Knative Serving和Knative Eventing均由ACS创建和托管,无需您承担资源费用,且提供高可用保障
- 网关托管:ACS Knative提供ALB、ASM和Kourier 3种网关。除社区兼容的Kourier外,其余两种云产品网关的Controller均由ACS创建,提供全托管、免运维的网关服务
- 生态集成
- 无缝集成了阿里云的计算、可观测(日志服务SLS、Prometheus)、CI/CD(云效)、应用集成(EventBridge)等产品
- 您无需自行采购服务器,也无需自建服务,便能在Knative服务中实现日志与监控告警、持续交付、事件驱动等能力
- 更丰富的功能特性:在社区Knative的基础上,ACS Knative结合实际业务场景提供了开箱即用的、更为丰富的产品方案。例如以下方案。
- 保留实例
- 在应用没有流量时,社区Knative默认将应用实例数缩容至零以降低成本,从而导致应用重新启动时会经历较长的冷启动时间
- 如果您的应用对冷启动延时较为敏感,推荐使用此功能,保留一个低规格的突发性能实例,平衡好使用成本和启动时长
- Knative自动伸缩
- 除提供开箱即用的HPA、KPA(Knative Pod Autoscaler)外,您还可以为Knative服务配置AHPA(Advanced Horizontal Pod Autoscaler)弹性能力
- 如果您的应用所需资源具备周期性变化,推荐您使用AHPA进行弹性预测,提前预热所需的资源,缓解使用Knative时遇到的冷启动问题
- 保留实例
使用场景
ACS Knative的典型使用场景如下
Web服务的托管
- 简化部署:ACS Knative封装了许多Kubernetes的底层细节,通过Knative服务大大简化了工作负载的部署和管理
- 简化多版本管理:Revision机制能够确保每个修订版本都有唯一标识,便于管理不同的版本,例如版本的回滚
- 简化流量灰度发布:ACS Knative提供流量管理功能。通过为不同Revision版本的服务分配不同的流量比例,可以快速实现灰度发布、A/B测试等
Serverless应用
- 聚焦业务逻辑:开发者无需关心IaaS资源,只需关注业务逻辑的开发,应用配置也大大简化,降低底层基础设施的运维成本。
- 资源按需使用、自动弹性:ACS Knative可以根据流量请求和并发情况自动扩缩资源,当没有业务流量时还可以将实例数量缩减至零,节省资源和成本。
AI场景
- 聚焦业务逻辑:GPU等异构计算场景下,开发者无需关心底层基础设施的维护,只需关注AI任务的构建和部署。
- 资源按需使用、自动弹性:ACS Knative可以根据实际负载情况自动扩缩资源,针对负载具有波动性的推理服务能够有效降低资源使用成本。
- 可移植性:ACS Knative可以运行在任何兼容Kubernetes的环境中,Knative服务可以在云上、本地数据中心甚至是边缘设备上移植部署。
事件驱动场景
- Knative Eventing提供了完整的事件模型,简化了接入外部系统的事件的流程。
- 例如,IoT设备可以将传感器数据发送到Knative服务中,ACS Knative可以配置对应的事件源用于接收数据,并触发相应的处理逻辑,例如数据存储、实时分析、监控告警等。
ACS Knative的使用流程
前提条件
- 已在ACS集群中部署Knative
- 在控制台一键部署ACS Knative,安装Knative Serving组件
- 完成网关选型并部署网关。ACS Knative支持ALB、ASM、Kourier三种网关
- ALB:基于阿里云ALB提供了更为强大的Ingress流量管理方式,全托管免运维,且支持自动弹性能力
- ASM:统一管理微服务应用流量、兼容Istio的托管式平台
- 通过流量控制、网格观测以及服务间通信安全等功能,简化您的服务治理,并为运行在异构计算基础设施上的服务提供统一的管理能力
- Kourier:基于Envoy架构实现的一款Knative社区开源的轻量级网关
服务部署与管理
自动伸缩
- 基于流量请求数(QPS)实现服务的自动扩缩容KPA(Knative Pod Autoscaler)
- 配置AHPA(Advanced Horizontal Pod Autoscaler),既可以根据历史指标弹性预测未来负载的情况并提前准备扩缩容,又能够结合Cron表达式实现定时扩缩
- 配置基于CPU指标阈值的HPA
版本管理与灰度发布
- 基于Revision修订版本实现版本的管理,例如版本的回滚
- 基于Revision版本,根据流量百分比灰度发布服务
Knative服务的访问
- Knative服务的默认域名格式为
{route}.{namespace}.{default-example.com},其中{default-example.com}是默认的域名后缀,您可以自定义域名后缀 - 使用自定义域名时,推荐为自定义域名配置一个HTTPS证书,提高数据传输的安全性
- 配置探针(存活探针(Liveness Probe)和就绪探针(Readiness Probe)),监测和管理服务的健康状况和可用性
进阶功能
事件驱动
- 在满足云原生开发的常见需求的基础上,Knative Eventing提供了完整、系统的Serverless事件驱动模式,
- 包括外部事件源的接入、事件流转和订阅、以及对事件的过滤等功能
- ACS Knative直接丰富的事件源,包括GitHub、EventBridge等
Knative Functions
简化在Kubernetes集群中创建、部署和调用函数的流程
AI推理服务
- KServe提供了一个基于Kubernetes集群的机器学习模型服务框架,提供简单的Kubernetes CRD
- 可将单个或多个经过训练的模型(例如TFServing、TorchServe、Triton等推理服务器)部署到模型服务运行时
服务网格
如果您需要在Knative服务中集成服务网格,以实现复杂的流量管理并增强服务安全性,推荐您使用服务网格ASM
可观测性与成本管理
监控大盘
您可以把Knative接入阿里云Prometheus监控,便于查看Knative的响应延迟、请求并发数等数据
相关计费
在ACS集群中使用ACS Knative时,ACS Knative本身不收取管理费用,但在使用过程中产生的负载均衡实例、NAT网关等,按照相应资源的价格计费






