Knative ServerlessService 介绍

本文涉及的产品
简介: ServerlessService 简称: SKS, 全称:Serverless Kubernetes-style Service 社区文档: https://docs.google.com/document/d/1byHQL6kePDZq6Qt4MqB-g4BDfiaJsfDPGb5oJEK1Ldo/edit?ts=5c81373b# https://docs.

ServerlessService 简称: SKS, 全称:Serverless Kubernetes-style Service 社区文档:

简单的解释

Knative 中 Autoscaler 是负责 KPA 伸缩的,并且在没有流量的时候可以缩容到零,而具体请求的流量是通过 Route 来实现的。那么 Route 和 Autoscaler 这两个看似独立的功能其实是需要紧密的配合的。否则 Autoscaler 都把 Pod 缩容到零了 Route 还在往老的 Revision 上面转发流量就会导致服务异常。所以 SKS(Serverless Kubernetes-style Service) 就是解决这个问题的。

目前的路由切换机制以及问题

image

首先从上图可以看出来目前是通过 Route 切换后端的 service 名字实现当 revision 缩容到零的时候路由转发到 activator 上面,但是这个过程需要 istio 重新下发 virtualService 并且没有一个检查机制,不知道 istio 是否下发完成。

参见如下三个代码片段:

从上面的代码片段中可以发现,activator 想要把一个 revision 缩容到零需要先标记为 inactive 状态,然后强制等待至少 30s,这 30s 其实就是在等待 istio virtualService 生效。这里有两个问题:

istio virtualService 如果在 30s 内已经生效了那多余的等待就是浪费的
如果负载很高的时候 30s 也不一定能够生效,所以也可能会失败
根本原因是两边的信息没有确认机制,目前仅仅是通过 30s 大概同步一下。#2949 这个 issue 有人提出了这个问题。

SKS(Serverless Kubernetes-style Service) 解决思路

State #1: Steady State

image

State #2: Scaled-to-Zero

image

State #3 (Prospective): Overload / Underprovisioned

image

Scale to Zero 时序图 : 最关键的就是这张时序图

image

为了解决这个问题所以提出了 SKS 的想法。SKS 有两个核心点:

  1. 加上了强制确认机制,SKS controller 会主动向发起请求确保 activator 路由生效之后再进行缩容到零的操作
  2. 从始至终 Route 后端对应的 service 的名字是不会变化。所以 virtualService 本身不需要重新下发
    不过也有一个问题:因为 istio 路由转发的原理也是通过监听 endpoints 然后直接向EndPoint 转发,而不是向 ClusterIP,所以即便 SKS controller 探测到 activator 成功了也不代表 istio 能够探测成功。不过这个生效时间差就很小了。

把问题降维到这个程度基本上就解决了,目前社区认为这个时间还是可以接受的。因为在 Kubernetes 体系中 cloud-controller-manager 本身的实现机制和这个过程是一样的。Kubernetes 中当有 pod 需要删除时 controller-manager 会在 EndPoint 中摘除相关的 pod 信息但也不会等待 cloud-controller-manager 完成 slb 的摘除。这里面还有一个 pod 优雅下线的逻辑一起配合生效,关于 Kubernetes pod 流量摘除的策略后续再单独介绍。

相关实践学习
基于函数计算一键部署掌上游戏机
本场景介绍如何使用阿里云计算服务命令快速搭建一个掌上游戏机。
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
目录
相关文章
|
Kubernetes Cloud Native Serverless
Knative Eventing
Knative Eventing
103 0
|
监控 Kubernetes Cloud Native
手动安装 Knative
本章主要介绍如何在已有 Kubernetes 集群上执行 Knative 的自定义安装。Knative的模块化组件可以允许您安装所需的组件。
手动安装 Knative
|
Kubernetes Serverless 容器
Knative Serving
Knative Serving
91 0
|
11月前
|
消息中间件 存储 Kubernetes
【无服务器架构】Knative Eventing 介绍
【无服务器架构】Knative Eventing 介绍
|
Kubernetes API 容器
解读 Knative Eventing v0.12.0 新特性
本文针对 Knative Eventing v0.12.0 版本新功能特性进行解读,让你快速对 v0.12.0 版本有所了解。
1097 0
|
设计模式 Kubernetes 数据格式
解读 Knative Eventing v0.11.0 新特性
Knative Eventing v0.11.0 版本已经于 12 月 10 号正式发布。本次发布围绕 Eventing 事件源接入及事件可用性等相关功能展开。本文通过解读这些功能特性,让你快速对 v0.11.0 版本有所了解。
2450 0
|
算法 Perl 容器
Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
Knative Serving 默认情况下,提供了开箱即用的快速、基于请求的自动扩缩容功能 - Knative Pod Autoscaler(KPA)。下面带你体验如何在 Knative 中玩转 Autoscaler。
|
域名解析
Knative Serving 之路由管理和 Ingress
Knative 默认会为每一个 Service 生成一个域名,并且 Istio Gateway 要根据域名判断当前的请求应该转发给哪个 Knative Service。Knative 默认使用的主域名是 example.com,这个域名是不能作为线上服务的。
3273 0
Knative 基本功能深入剖析:Knative Eventing 之 Sequence 介绍
作者 | 元毅,阿里云容器平台高级开发工程师,负责阿里云容器平台 Knative 相关工作。 导读:在实际的开发中我们经常会遇到将一条数据需要经过多次处理的场景,称为 Pipeline。那么在 Knative 中是否也提供这样的能力呢?其实从 Knative Eventing 0.7 版本开始,就提供了 Sequence CRD 资源,用于事件处理 Pipeline。
|
Perl
在 minikube 上部署 knative
在 minikube 上部署 knative 流程简介。
217 0