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 流量摘除的策略后续再单独介绍。

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
SQL 缓存 算法
CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点
CPU密集型与I/O密集型是在计算机上执行任务的两种策略,在并发执行任务场景下,我们需要选择使用多线程或多进程; 如果是IO密集型任务,使用多线程,线程越多越好; 如果是CPU密集型任务,使用多进程,线程数量与CPU核心数匹配。
2351 0
|
NoSQL druid Java
在Redis中秒杀场景下超时与超卖问题的解决方案
在Redis中秒杀场景下超时与超卖问题的解决方案
966 0
|
Web App开发 存储 监控
|
监控 Java 网络性能优化
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
本文介绍了 Kubernetes 中的容器工作内存(WorkingSet)概念,它用于表示容器内存的实时使用量,尤其是活跃内存。
57942 130
容器内存可观测性新视角:WorkingSet 与 PageCache 监控
|
存储 算法 Java
2025 年一线互联网大厂完整 Java 面试题及答案解析汇总
本文深入剖析一线互联网大厂Java面试题,涵盖Java核心基础(如数据类型、面向对象特性)、JVM(内存模型与垃圾回收机制)、并发编程(线程同步与线程池)及框架(Spring与Spring Boot)。通过技术方案解析与实际应用案例,助力掌握面试要点。资源地址:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
995 0
|
人工智能 测试技术 API
成功注册Google的SerpAPI实现AI Agent的tool
成功注册Google的SerpAPI实现AI Agent的tool
4528 6
|
Linux C语言
【编程小实验】C语言实现:无限循环写入文本文件,支持Ctrl+C中断与数据追加(附完整源码)
在Linux中,文件I/O(输入/输出)是程序与文件进行交互的基本方式,包括读取文件内容和向文件写入数据。这通常通过标准的C库函数来实现,下面是一些基本的文件读写操作和代码示例。
930 0
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
6839 2
|
域名解析 网络协议 Linux
Linux 中的 Nslookup 命令怎么使用?
【4月更文挑战第12天】
1878 6
Linux 中的 Nslookup 命令怎么使用?