Knative应用模型,即Knative Service,可以简化 Kubernetes 上的服务部署和管理。您可以通过操作Knative Service进行工作负载的生命周期管理。
模型介绍
Knative Service是用户直接操作的资源对象,一个Knative Service的包括如下:
Configuration:用于定义工作负载配置,包括容器镜像、环境变量、资源限制等。每次对 Configuration 的修改(例如更新镜像版本、调整环境变量)都会触发新 Revision 的生成。
Revision:每次Configuration的更新都会创建一个快照,即一个 Revision (修订版本),以保留对应的配置状态。Knative基于Revision实现应用的多版本管理。
Route:用于配置路由规则,向多个Revision分发流量。支持配置转发到不同Revision的流量百分比,以实现灰度发布
Tag:为特定Revision打上唯一Tag后, Knative 会自动为该Revision生成独立的访问地址,可用于金丝雀验证。
简单来说,Knative Service 是 Kubernetes 资源的高级抽象,集成了多个核心资源(Deployment、Serivce、Ingress),并支持弹性伸缩、多版本管理等能力。
YAML示例
一个简单的Knative Service示例YAML如下。
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
spec:
template:
spec:
containers:
- image: registry-vpc.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
env:
- name: TARGET
value: "Knative"
功能特性
通过操作Knative Service的资源对象,它能以更简便的方式实现如下功能。
基于请求的自动弹性
基于CPU或者Memory的弹性策略有时无法精准反映业务的实际负载。对于Web服务来说,基于并发数(Concurrency)或者每秒处理请求数(RPS)进行弹性伸缩更能直接反映服务性能。
Knative Serving会为每个Pod注入queue-proxy容器,收集容器并发数(Concurrency)或请求数(RPS)指标。Autoscaler定时获取指标后,会根据相应的算法自动调整Deployment的Pod数量,从而实现基于请求的自动扩缩容。实现流程如下。
用户发起请求,HTTP Router将请求转发至Knative的Serverless Service(SKS)。
简单来说,您可以将SKS理解为Knative基于Kubernetes抽象的Service资源,其后端可以对应不同的 endpoints
SKS根据应用中的运行实例数量进行路由决策。
Serve 模式:当前应用中有运行实例,直接将请求转发至运行中的 Pod。
Proxy 模式:当前应用中实例数量已缩容至0,流量会被路由到 Activator。Activator作为请求缓冲代理。
Activator接收请求并记录并发指标,然后将指标发送至Autoscaler。
Autoscaler 根据预设指标判断是否需要扩容,在需要时向API Server发送扩容申请。
API Server根据Autoscaler的请求更新 Deployment,创建新Pod。
Activator 在检测到新 Pod 就绪后,将请求转发至新 Pod。
操作文档,请参见基于流量请求数实现服务自动扩缩容。
在没有流量时将 Pod数量自动缩容至 0
Knative支持在应用无流量请求时将Pod数量自动缩容至0,并在有请求时自动扩容Pod。Knative中定义了2种请求访问模式:Proxy(代理模式)和 Serve(请求直达模式)。模式的切换由Autoscaler组件负责。当请求为0时,Autoscaler会将请求模式切换为Proxy模式。当有请求访问时,Autoscaler会收到通知进行扩容,扩容的Pod状态变为Ready后对请求进行转发,此时Autoscaler会将访问模式切换为Serve模式。
配置示例,请参见基于流量请求数实现服务自动扩缩容。
多版本管理与灰度发布
Configuration的更新会创建一个唯一的Revision。Route可以将请求路由到Revision,并向不同的Revision转发不同比例的流量。您可以使用Revision进行版本管理(例如版本回退)。您还可以进行流量的灰度发布,例如创建了V1版本的Revision后,当版本需要变更时可以更新服务的Configuration,创建V2版本的Revision,通过Route对V1、V2设置不同的流量比例(例如V1为70%,V2是30%),那么流量会按照预设的比例进行分发。
操作文档,请参见基于流量灰度发布服务。