Git Product home page Git Product logo

sofastack / sofa-serverless Goto Github PK

View Code? Open in Web Editor NEW
112.0 19.0 40.0 263.86 MB

a framework to enabe app architecture evolve from monolithic to microservices smoothly by involving modular and macroservices architecture.

Home Page: https://sofaserverless.gitee.io/home/

License: Apache License 2.0

Dockerfile 0.13% Makefile 0.85% Go 27.30% Shell 0.05% Java 71.67%
devops microservice modularization serverless architecture modularity spring-boot

sofa-serverless's Introduction

Coverage Status license Maven Central

SOFAServerless 品牌全新升级为 Koupleless, SOFAServerless 仓库已不再迭代

欢迎访问全新 GitHub 地址:https://github.com/koupleless/koupleless

完整产品介绍欢迎查阅 Koupleless 全新官网


欢迎来到 SOFAServerless 开源社区。SOFAServerless 是一种模块化的应用架构模式,能够帮助大中小企业低成本地实现极速研发、运维、微服务演进和人员协作,从而为企业实现降本增效。欢迎加入钉钉群关注我们或者与我们一起共建面向普通应用低成本接入的 Serverless 解决方案。钉钉群号:24970018417 。

A4单页_画板 1-01

A4单页_画板 1-02

SOFAServerless

SOFAServerless 技术体系是蚂蚁集团随着业务发展、研发运维的复杂性和成本不断增加的情况下,为帮助应用又快又稳地迭代而研发。从细化研发运维粒度和屏蔽基础设施的角度出发,演进出的一套低成本接入的 Serverless 解决方案。

核心方式是通过类隔离和热部署技术,将应用从代码结构和开发者阵型拆分为两个层次:业务模块和基座,基座为业务模块提供计算环境并屏蔽基础设施,模块开发者不感知机器、容量、中间件等基础设施,专注于业务研发帮助业务快速向前发展。

背景

在应用架构领域,不可避免的问题是应用随着业务的复杂度不断增加,研发运维的过程中的问题会不断暴露出来。首先我们看一下普通应用研发和运维过程中的流程是什么样的:

image

如图所示,从需求到设计、开发、线下测试,再到发布线上的研发运维不断反馈、循环迭代的过程。可以简化为开发同学提交代码到代码仓库,在线下做并行的验证测试,测试通过之后在线上发布,发布过程是串行的,只能够有一个发布窗口,这样的过程在应用体量业务还不太复杂的情况下问题,并不是很明显。

但当业务复杂度不断增加,普通应用迭代过程在会出现一些新的问题,如下图:

image

  1. 管理成本高:需求管理、代码管理、人员管理。
  2. 时间成本高:线上验证与发布互相阻塞。单次启动慢。
  3. 变更风险高:一次变更涉及所有代码。一次变更涉及所有机器。

另外,由于这些问题是因为多个业务与研发任务耦合在某些单点上导致的,研发运维的成本随着业务的复杂度呈现出指数增长的特点:

image

SOFAServerless 研发运维体系

对于这些问题,业界已经发展并演进出了多种应用架构,从单体架构 -> 垂直架构 -> SOA 架构 -> 分布式微服务架构 -> 服务网格架构等,我们分析这些演进过程为解决遇到的研发运维问题提出 SOFAServerless 研发运维体系。

通过借助 SOFAArk 框架将应用拆分成基座和模块,同时将应用里的接口按场景维度做分组,使得业务可以按一组接口的粒度进行极速发布运维以及资源按需隔离。

image

从这张图里可以看到 Serverless 应用拆分的形态,通过把一个普通的 Java 应用拆出多个模块,进一步对应用进行了拆分:基座和模块,对应的研发人员也划分为基座开发者和模块开发者。

基座负责沉淀通用的逻辑,为模块提供计算和环境,并为模块开发者屏蔽基础设施,让模块开发者不需要关心容量和资源等。各个模块则是独立的代码仓库,可以进行独立的研发运维,这样研发运维粒度就得到了精细化,并且由于基座为模块屏蔽了环境与基础设施,模块开发者可以专注于业务开发从而提高了业务创新效率。SOFAServerless 开源版首个版本计划在 10 月左右透出,届时欢迎大家一起来建设社区 Serverless 技术。

SOFAServerless 优势

极速发布运维

相对于普通应用的镜像构建需要 3 分钟,发布需要镜像下载、启动、挂载流量大概 3 分钟,总共平均需要 6 分钟;模块构建只需要 10 秒,启动大概 1~10 秒 (模块大小可大可小,对于较小的模块,速度可以做到毫秒级别) 。 把一次发布耗时从原来的 6 分钟下降到 15 秒,一次迭代从原来 2 周下降到了 2 天,最快可以 5 分钟上线的。

快速弹性调度

image

对于线上集群的部署形态,不同的机器上部署的模块不尽相同。例如对于模块 1,只安装在了第一第二台机器上,那么模块升级时只会涉及到这两台机器本身,变更的机器范围就比较小了。另外,模块 1 如果要扩容的话,可以从集群内筛选出较空闲的机器进行模块热部署即可,一般也就是 10s 级别,所以能做大快速的水平扩展能力。

低变更风险

对于一次模块的升级变更,只会涉及模块自身的代码本身不会设计整个应用代码。模块变更需要更新的机器也只是模块安装过的机器本身,不会涉及到整个集群,所以变更范围大大缩小,变更风险也相较普通应用能得到明显减少。

极致省资源

因为模块应用是合并部署在基座上,所以可以完全复用基座的 CPU、Mem 等物理资源,相比每个应用空跑 SpringBoot 都需要花费近百兆 JVM 内存,采用 SOFAServerless 多个模块应用只要复用一份 SpringBoot JVM 即可,极大节省了资源成本。

并行独立迭代

多个模块的开发和发布运维,可以并行进行,互相不影响,也有效解决了迭代冲突、环境抢占等企业应用的研发痛点。


SOFAServerless 开源组件

image


SOFAServerless 开源版大体里程碑

https://github.com/sofastack/sofa-serverless/releases

sofa-serverless's People

Contributors

charlie17li avatar chenlei3641 avatar codenoobking avatar dependabot[bot] avatar gold300jin avatar gongjiu avatar hustchaya avatar liu-657667 avatar lunarscave avatar lvjing2 avatar lylingzhen avatar nmcmd avatar novoland avatar qixiaobo avatar sususama avatar tomorjm avatar tovihe avatar ujjboy avatar yuanyuan2021 avatar yuanyuancin avatar yuhaiqun19892019 avatar zjulbj avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sofa-serverless's Issues

SpringBoot 服务共享机制设计与实现

每个模块是独立 Spring Context,提供了bean的隔离能力。但是隔离了之后还需要共享,用于模块之间的服务调用,这时需要一套服务的发现机制。
在 SOFABoot 里可以使用 SOFAService 和 SOFAReference 来完成一部分的服务查找,在 SpringBoot 里需要设计一套完整的服务发现和调用机制。

2023-08-21 社区会议

主题:Serverless 社区双周会
时间:08月21日 19:30 - 08月21日 20:30
会议号:90957500367
电话呼入: +867936169179(**大陆)
+867388953916(**大陆)
入会链接:https://meeting.dingtalk.com/j/blp36k9mTbc

议题

https://github.com/sofastack/sofa-serverless/milestone/2

Arklet 部分

image

开源之夏同步

8月迭代进展对焦

ModuleController

演示

开源之夏同步

8月迭代进展对焦

欢迎感兴趣同学参加,有任何想交流讨论的议题可以直接留言。

想要参加社区建设的同学可以关注社区的SOFAServerless 新手任务列表 SOFAArk 新手任务列表,总有一个适合你😜。

Module Controller 核心模型设计

模型对比

Pod Module 关系和区别
Pod Module Pod: K8S 中创建和管理的、最小的可部署的计算单元。 Module: serverless 创建和管理的、最小的可部署的计算单元。
PodSpec ModuleSpec PodSpec: 对 pod 的描述。包含容器、调度、卷等。 ModuleSpec: 对Module的描述,包含模块、服务、调度(亲和性)。
PodTemplate ModuleTemplate PodTemplate: 定义pod的生成副本,包含PodSpec。 ModuleTemplate:定义Module的生成副本,包含 ModuleGroupSpec
Deployment ModuleDeployment Deployment: 定义Pod的期望状态和副本数量。 ModuleDeployment: 定义Module的期望状态和副本数量。
ReplicaSet ModuleReplicaSet ReplicaSet: 管理pod的运行副本。 ModuleReplicaSet: 管理 Module 的运行副本。

Module-Deployment 模型

image

Module 模型

image

Module-Template 模型

image

Module-ReplicaSet 模型

image

【spring-boot-ark-plugin】

  • web-ark-plugin 支持模块使用tomcat
  • runtime-sofa-boot-plugin 支持兼容sofaboot内容(SofaFramework管理、JvmService缓存、卸载关闭sofaruntime、biz健康检查)
  • spring-boot-ark-plugin 支持兼容springboot内容(卸载关闭springcontext)

SOFAServerless End User Registration「SOFAServerless 使用者登记」

非常感谢大家对 SOFAServerless 开源的关注和支持,这是我们前进最大的动力。

收集目的

了解 SOFAServerless 的使用场景以便更好的规划技术路线
聆听社区的不同声音,让 SOFAServerless 变得更好
吸引更多的开源爱好者参与贡献,共同打造 SOFAServerless

收集方式

请按如下参考格式回复本 Issue 进行登记:

* 公司/组织名称:蚂蚁金服
* 地点:**杭州
* 网址:http://www.antfin.com
* 使用能力或场景:全套金融级分布式中间件
* 接口人联系方式:[email protected]

展示

我们会定期同步信息至「Awesome SOFA」的用户列表中。

服务

如果您已经在生产环境中使用 SOFAServerless 的任何一个组件,我们将会把您加入到 SOFAServerless 的金牌服务群里面,您的问题将会得到更加高效的反馈。

再次感谢您的支持和反馈!
SOFAServerless 团队

【Contributor 文档】弹性运维调度系统 module-controller 单元测试和集成测试流程

注:当前流水线只支持 module-controller master 分支,若需要跑其它分支可在社区协作钉钉群(群号:24970018417)讨论并提交 PR。

单元测试

自动执行

任意 Contributor 修改 module-controller 代码并发起 PR 到 master 分支或者在 master 分支 PR 合并之后,单元测试的 Workflow 会被自动执行,您可在 PR 的流水线中看到单元测试的执行结果,单测 Workflow 执行通过才允许合并。比如:https://github.com/sofastack/sofa-serverless/pull/50/checks

image

您也可前往 GitHub Workflow 直接查看执行结果:https://github.com/sofastack/sofa-serverless/actions/workflows/module_controller_unit_test.yml


手动执行

  1. 进入 GitHub Workflow:https://github.com/sofastack/sofa-serverless/actions/workflows/module_controller_unit_test.yml

  2. 点击右上角 "Run workflow" -> "Run workflow":

image

  1. 等待 Workflow 执行完成,可以点击查看执行详情:

image

image

如何修改 Workflow

Workflow 定义文件:https://github.com/sofastack/sofa-serverless/blob/master/.github/workflows/module_controller_unit_test.yml ,可按需修改并提交 PR。
注:当前尚未开启 go build 增量构建,欢迎大家指教如何配置开启。


集成测试

流水线位置

https://github.com/sofastack/sofa-serverless/blob/master/.github/workflows/module_controller_build_deploy_to_aliyun.yml

流水线触发时机

module-contorller/ 目录里的代码 PR 完成到 master 分支的合并之后,会触发该流水线执行。每次正式 Release 版本前,必须保证集成测试流水线成功执行。

集成测试原理

有输入和建议欢迎补充。

集成测试用例写在 module-controller/integration-tests 里。module-controller/IntegrationTestDockerfile 是用来构建集成测试应用的 Dockerfile,构建出的集成测试应用是一次性 Job,集成测试用例跑完后销毁。

每一个集成测试用例都会发起一条运维链路(比如正常的模块发布链路;带 Beta 和分组确认的模块发布链路等等),并对中间件结果进行详细 Assert 验证和日志输出,在所有集成测试跑完后,集成测试应用结束。

module-controller/IntegrationTestDockerfile 是集成测试构建运行的 Dockerfile。

流水线步骤

  1. 登录阿里云镜像服务。
  2. 使用 module-controller/Dockerfile 打包构建出 module-controller Operator 镜像。
  3. 使用 module-controller/IntegrationTestDockerfile 打包构建出集成测试应用镜像,该镜像包含了所有集成测试用例。
  4. 将镜像上传到阿里云镜像服务。
  5. 调用阿里云容器服务重新部署 Operator 镜像和集成测试镜像。
  6. 临时:Github 构建机与阿里云 APIServer 网络不可达,当前测试镜像部署后需要到阿里云登录 module-controller-integration-tests pod 查看执行结果。
  7. workflow 执行通过才允许正式发版。

moduleController 本地联调的网络问题

本地通过minikube启动基座。
本地启动module-controller是无法直接访问具体的基座ip来安装pod
考虑通过ingress或者其他代理来访问集群内的基座来实现模块安装

SOFAServerless 各组件 Release notes 与最新发布计划

SOFAArk

release 2.2.2 ,8月 release,计划发布内容

ModuleController

release 0.3 ,8月 release,计划发布内容

  • 模块发布、卸载、扩缩容、副本保持、基座运维联动
  • 回滚链路、各项参数校验、单测达到 80/60、8+ 集成测试、CI 自动化、开发者指南

Arklet

release 0.1,8月 release

  • Arklet 开发测试与CI环境
  • Arklet 基础运维版本 #11
  • Arklet 锁控制

ArkCtl

  • ArkCtl 简单代码框架
  • ArkCtl 开发测试与 CI 环境

SOFABoot 验证支持常用中间件

验证支持常见中间件排摸,产出哪些是可以直接使用,哪些中间件还有哪些问题

  1. RPC: SOFARPC
  2. 消息: kafka, Pulsar, RocketMQ
  3. 缓存:Redis
  4. 数据库: mybatis + druid
  5. tomcat

Contributor 指南

找人指南

大家可以随时咨询各组件的 Maintainer 和 Member 帮助答疑解惑,Maintainer 和 Member 也会辅导大家技术方案设计和编码实现。钉钉群号:24970018417 。

ModuleController

Maintainer: @gold300jin

SOFAArk

Maintainer: @yuanyuancin @lvjing2
PMC (Project Management Committee): @glmapper

Arklet

Maintainer: @yuanyuancin @lvjing2
PMC (Project Management Committee): @TomorJM

ArkCtl

Maintainer: @yuanyuancin @lvjing2


各组件本地开发与 CI 流程

ModuleController - 弹性运维调度系统

  1. 如何搭建部署运维调度系统:#3
  2. 执行单元测试与集成测试:#2

Arklet - 客户端运维 Agent

  1. 手动或自动执行单元测试:#47

[FEATURE] 关于 arklet 健康检查解决方案

关于 arklet 健康检查解决方案

version: 0.0.1

0、需求

  • arklet 中编排健康检查与心跳上报指令
  • 在jvm和spring中考虑健康检查
  • 心跳上报考虑宿主与biz模块、子应用的状态感知(暂未在本期考虑)

主要的思路:

  • 设计模块Arklet Actuator,最开始可以通过 properties 控制是否打开监控
  • 与 Springboot Actuator 对接,设定时间间隔写到日志,调用时从日志(elastic.logstash)中读取。
  • Health Checker Processor 负责 Health Check Handler 的调度
  • 在上游发起 Http 请求时,UnifiedOperationServiceImpl 调用 Health Check Processor 获取最新健康检查信息
  • 设置 flashback 时间,所有 Arklet Actuator 配置写在 Auto Health Checker Configuration

1、指令层设置

  • /metrics:查询 spring + JVM 健康度

  • /health :查询对应 biz 的心跳(maybe SOFA Boot)

{
"bizName": "dynamic-provider",
"bizVersion": "1.0.0"
}

2、控制层

主要设计:

202308141839.png

  • MetricHandler 同内置指令
  • 将 Health Checker Processor 注入 UnifiedOperationService,提供统一接口调用 Metrics Checker Handler (抽象是 Health Checker Handler,负责下期的 biz 模块 BizHealth Checker Handler)
  • Metrics Info 作为每个健康检查的 Meta Data
  • Actuator Callback 健康检查后回调
  • Auto Health Checker Configuration springboot 启动配置等
  • Metrics Checker Handler
    • 装配 Metrics Info 成 Response
    • (解析 Request 中 BizModel)
    • 响应 CallBack
    • 读取日志最新检查信息

初始化的流程:

202308141904.png

完成一次请求的流程:

202308141900.png

【Contributor 文档】手动或自动执行 arklet 单元测试

注:当前流水线只支持 arklet master 分支,若需要跑其它分支可在社区协作钉钉群(群号:24970018417)讨论并提交 PR。

自动执行

任意 Contributor 修改 arklet 目录内容并发起 PR 到 master 分支或者在 master 分支 PR 合并之后,单元测试的 Workflow 会被自动执行,您可在 PR 的流水线中看到单元测试的执行结果,单测 Workflow 执行通过才允许合并。比如:https://github.com/sofastack/sofa-serverless/pull/49/checks

image

您也可前往 GitHub Workflow 直接查看执行结果:https://github.com/sofastack/sofa-serverless/actions/workflows/arklet_unit_test.yml


手动执行

  1. 进入 GitHub Workflow:https://github.com/sofastack/sofa-serverless/actions/workflows/arklet_unit_test.yml

  2. 点击右上角 "Run workflow" -> "Run workflow":

image

  1. 等待 Workflow 执行完成,可以点击查看执行的详情:

image

image


如何修改 Workflow

Workflow 定义文件:https://github.com/sofastack/sofa-serverless/blob/master/.github/workflows/arklet_unit_test.yml ,可按需修改并提交 PR。当前 Workflow 开启了 Maven 缓存,已经加速源代码构建。

月会 23.08.07 SOFAServerless 月会(第五次月会)

月会议题

Serverless 开源计划

SOFAServerless 是一种新的应用架构模式,能以极低的成本将应用纵向或横向拆分成基座与模块,让业务研发者享受到 Serverless 秒级研发运维体验,同时也解决了微服务领域里 4 个痛点问题:

  1. 通过横向拆分出基座屏蔽业务以下的基础设施、框架、中间件和业务通用逻辑等部分,从而极大降低了业务开发者的认知负荷、提高了开发效率。
  2. 一个应用可以低成本改造或拆分出多个模块,模块间可以并行独立迭代,从而解决了多人协作阻塞问题。
  3. 存量微服务如果拆分过多,可以低成本改造成模块应用,合并部署在一起,解决拆分过多带来的资源成本和维护成本痛点。
  4. 模块可以灵活部署,解决微服务拆分与组织发展灵敏度不一致导致的协作低效与分工不合理问题。应用拆分出多个模块,可以部署在一起,也可以进一步演进成独立微服务,同样如果微服务拆分过多,也可以低成本改回模块合并部署到一起。

技术先进性

image

项目愿景

image

项目架构图

image

S2 需要建设完善的,开箱即用的能力,欢迎社区小伙伴一起共建:

  1. ModuleController:运维调度组件
  2. Arklet:运维管道、研发框架adapter
  3. ArkCtl:研发工具
  4. SOFABoot/SpringBoot 研发框架与相关中间件

RoadMap

2023.8 完成 SOFABoot 完整的部署功能验证,产出 benchmark 基线
2023.9 发布基础运维和调度系统 ModuleController 0.5 版
2023.9 发布研发运维工具 Arkctl 与 Arklet 0.5 版
2023.10 发布模块半自动拆分工具 0.5 版
2023.10 编写基础使用教程,新增 2+ SOFABoot 技术栈公司使用
2023.11 支持 SpringBoot 完整能力和 5+ 社区常用中间件
2023.11 SOFAServerless (ModuleController、Arkctl、Arklet、SpringBoot 兼容) 1.0 版本正式发布
2023.12 基础弹性伸缩能力发布
2023.12 新增 5+ 家公司使用、20+ Contributor

Serverless 运维调度 ModuleControler @gold300jin gold

开发一个 K8S Operator,编排客户端 API 实现 Biz 模块的热部署,初步达成 Serverless 研发体验

导师:@gold300jin
设计详见7月月会
关联 Issue:Serverless 运维调度一期(https://github.com/sofastack/sofa-serverless/issues/5)

当前进展同步

1.【已完成】运维能力演示
2.【已完成】基础热部署、基础扩缩容
3. 进展同步

能力演示

打开视频

ModuleController 版本8月发布计划

-【完成 50%】Serverless 运维调度组件开发测试环境
-【进行中】0.2 版本、0.3 版本运维能力
-【进行中】基础副本保持器

开源之夏进展同步

<开源之夏进展同步>

暂定 RoadMap:

08.07【已完成】:0.1 版本上线(包括架构和接口模型设计、代码框架、单模块简单发布与扩缩容能力、环境搭建)
GitHub Issue:Serverless 运维调度 0.1 版本开发与演示
08.15(下次月会演示):0.2 版本上线(包括非对等模块发布、卸载、扩缩容、副本保持、基座运维联动)
GitHub Issue:#15
08.25(下次月会演示):0.3 版本上线(包括回滚链路、各项参数校验、单测达到 80/60、8+ 集成测试、CI 自动化、开发者指南)
GitHub Issue:#16
09:18: 0.4 版本上线(支持以 hook 方式联动企业四七层流量、模块基座 1:1 先扩后缩发布、缩容、替换等、8+ 集成测试)
09.31:0.5 版本上线(所有非对等运维部署策略、两种调度策略、状态回流、5+ 集成测试)
10.11:0.7 版本上线(所有对等运维能力、部署策略、基座链路、5+ 集成测试)
11.30:1.0 Release 版本上线(各项 Bug 修复、打磨、预演用例补充)


Serverless 运维调度组件 CI 介绍

建设运维调度到客户端端到端 CI:#2


SOFAArk

7月进展同步

[x] 打包插件支持url获取排除 jar 列表

8 月预计发布内容

  • 2.2.2 版本,预计 8 月底发布
  • DeclaredMode 支持 java -jar 模式运行,修复多级(超过3级)内嵌jar的 artifact 提取
  • 支持 SOFABoot 4.0 sofastack/sofa-ark#682
  • zip file 安全问题修复,sofastack/sofa-ark#565

当前未关闭 Issue 进展同步

需求类:
sofaark静态合并部署 集成 springcloud ( sofastack/sofa-ark#645 )

bug类:
日志打印 ( sofastack/sofa-ark#624 )

测试类:
集成测试 ( sofastack/sofa-ark#25 )
需求类:
sofa-ark-maven-plugin的gradle插件( sofastack/sofa-ark#73 )
sofa-ark-maven-plugin 打包 war 包( sofastack/sofa-ark#215 )
资源隔离( sofastack/sofa-ark#566 )

Arklet

开发一个客户端,支持 Biz 模块的热部署和热卸载,初步实现 Serverless 体验
导师:@glmapper
设计详见 6月月会

8月预计发布内容

  • Arklet 开发测试与CI环境
  • 【已完成部分】Arklet 基础运维版本 #11
  • Arklet 锁控制

ArkCtl 版本发布计划

-【8 月开始】ArkCtl 简单代码框架
-【8 月开始】ArkCtl 开发测试与 CI 环境

Spring Cloud/ SOFABoot 研发框架【未开始】

  • 兼容性测试与回归测试环境
  • 日志
  • rpc
  • 消息
  • 数据库
  • 缓存

Serverless 运维调度组件一期实现

In what area(s)?

/area operator

Describe the feature

设计文档见月会文档:#1
@流铄 可将内部 Lark 文档复制到开源 Issue,完全公开。

运维调度组件一期,暂且叫 0.5 版本,计划支持 模块副本保持、模块分批发布、模块分批回滚、模块分批扩缩容、模块分批下线、堆叠调度 等几大特性。并和社区同学一同共建。具体发布时间 8.07 月会给出。

[Feature] Operator 支持多种 Module 部署策略

In what area(s)?

/area operator

Describe the feature

背景

实际生产上部署或者升级 Module 往往需要十分谨慎,我们需要一定的部署策略来降低变更带来的风险,需要做到可灰度;可监控;可回滚

需求

  • 自定义分组策略: 该策略将 Module 部署分成多个组顺序执行 #22
  • Beta 确认策略: 该策略在部署时会先尝试部署一个 Module 经过人工观察确认后,方可执行后续部署流程
  • 分组确认策略: 该策略执行需要开启自定义分组策略,在每个分组部署后需要人工观察确认后,方可进行后续分组部署 #33
  • 灰度时间策略:该策略执行需要开启自定义分组策略,在每个分组部署后需要等待设置的灰度时间,如果 Module 状态正常方可进行后续分组部署 #33
  • 最大不可用数量策略:TODO

在同一个分组中,Module 部署到 Pod 上有两种选择方式

  • 分组 Pod 选择策略,打散: 将 Module 尽可能放置到空闲的 Pod 上 #45
  • 分组 Pod 选择策略,堆叠:将 Module 尽可能放置到非空闲的 Pod 上 #45

设计

ModuleDeployment

ModuleDeployment 通过控制 ModuleReplicaSet 来实现: beta部署、分批部署、分组确认、灰度时间等部署策略,对于一个ModuleDeployment CR 其协调过程具体如下:

  1. 检查是否需要需要创建新批次
    1. 如果所有批次都发布完成就返回
    2. 如果存在下一个批次就创建新批次
  2. 检查是否开启 beta部署策略
    1. 若开启则更新 ModuleReplicaSet 其replica 为 1
    2. 若没有开启,则进入正常批次流程
  3. 正常批次流程下,计算当前批次期望的 replica 值,然后更新 ModuleReplicaSet
  4. 更新 ModuleReplicaSet 后,则首先判断是否开启分组确认策略
    1. 若开启,则修改 ModuleDeployment.Spec.Pause 进入暂停,等待用户确认
  5. 其次判断灰度时间策略是否开启
    1. 若开启,则修改 ModuleDeployment.Spec.Pause 进入暂停,并创建一个延时任务加入本地延时队列,规定时间后再 Resume
  6. 最后判断当前批次是否是最后一批
    1. 如果不是,则进入重新更新 ModuleReplicaSet
    2. 否则结束 Reconcile
image

ModuleReplicaSet

ModuleReplicaSet 主要负责协调同分组之内的 Module 部署,在 Reconcile 方法中,对于一个 moduleReplicaSet 资源:

  1. 首先检查是否开启 MaxUnvaliable 策略,若开启则检查是否满足最大不可用数
  2. 其次根据 Module 的部署类型执行不同的分组策略: 打散、堆叠
image
打散 | 堆叠 策略

在 ModuleReplicaSet Controller 为每个Module选择 Pod时,首先从 APIServer 根据 deployment 获取一组 Pod, 并根据策略(打散|堆叠)对 pod 进行打分排序,最后执行 Module 绑定

image
  • 当采用打散策略时,优先选择使用 Biz 模块数少的 Pod
  • 当采用堆叠策略时,优先选择使用 Biz 模块数多的 Pod,并且 Biz模块数量没有超过设定的阈值

Serverless 运维调度 0.1 版本开发与演示

In what area(s)?

/area operator

Describe the feature

1、开源版模型和 API 定义(基于 K8S Operator 架构)
2、代码脚手架
3、Controller一期实现
4、手动测试环境搭建:基座、模块和镜像等
5、非对等单模块发布
6、非对等单模块简单扩容
7、非对等单模块简单缩容

模块运维调度 ModuleController S2 规划会议纪要

参会人:@lvjing2 @gold300jin @yuanyuancin @lylingzhen

1、追加 Backoff 退避重试和上限。【归属 8 月 0.3 版本】
2、决策:模块发布只支持先卸后装,不支持多版本共存,ModuleController 需要编排 Arklet Uninstall 和 Install。【归属 8 月 0.3 版本?】
3、9 月第一周支持与 K8S Service 联动,从而支持模块、基座与用户的 K8S 流量体系打通联动。【归属 9 月上旬 0.4 版本】
4、9 月支持基础的集中式调度和打散式调度。【归属 9 月上旬 0.4 版本】
5、10 月份可以考虑支持金融级运维特性,如 Beta、分批确认/忽略等交互、批次灰度时长等。
6、决策:模块、基座弹性伸缩集成 Promethues,同时提供一键部署能力。
7、spec 把归属基座等信息写进去。
8、对等考虑基于非对等的100%副本保持来做

9、重要:8 月底 0.3 版本,完成文件与方法拆分、单测注释、开发者文档与用户使用文档。

通过基座看到模块实例个数【0.5 人天】

当前无法直观的查询到基座上部署的模块实例个数,可以给 K8S Pod、Deployment 或 ReplicaSet 上加一些 label,让用户能直观的看到基座上部署的模块实例个数:


1、K8S Deployment 或 ReplicaSet 上加几个 label:
serverless.alipay.com/average-module-instance-count-on-base : 9.68 // 基座 Pod 上平均已被调度的模块实例个数(不一定安装成功)
serverless.alipay.com/max-module-instance-count-on-base : 20 // 基座 Pod 上最多的已被调度模块实例个数
serverless.alipay.com/min-module-instance-count-on-base : 0 // 基座 Pod 上最少的已被调度模块实例个数

另外,可以通过 module CR 里 “归属基座” label 一把捞出基座 Deployment 上的所有模块实例。


2、Pod 上加一个 label:
serverless.alipay.com/module-instance-count : 10 // 这个基座 Pod 上已被调度的模块实例个数

SpringBoot 服务共享机制设计与实现

每个模块是独立 Spring Context,提供了bean的隔离能力。但是隔离了之后还需要共享,用于模块之间的服务调用,这时需要一套服务的发现机制。
在 SOFABoot 里可以使用 SOFAService 和 SOFAReference 来完成一部分的服务查找,在 SpringBoot 里需要设计一套完整的服务发现和调用机制。

2023-09-04 社区会议

主题:Serverless 社区双周会
时间:09月04日 19:30 - 09月04日 20:30
会议号:90957500367
电话呼入: 057128095818
02162681677
更多呼入号码:https://meeting.dingtalk.com/dialin/?corpId=dingd8e1123006514592
入会链接:https://meeting.dingtalk.com/j/EQzqQVtJoro

议题

8月回顾

Arklet 待完成的动作

增加影响基座健康状态的能力,查询健康状态指令
健康状态检查方案 review
模块安装支持远程协议
修复 ModuleController 使用 Arklet 遇到的问题 #17
增加锁控制 #39
基座引用的 starter,支持 Spring Boot、SOFABoot,Arklet 版本推到 Maven **仓库

ModuleController 的功能

各项参数校验、单测达到 80/60、8+ 集成测试、CI 自动化、开发者指南

ModuleController 0.3 版本 release
Arklet 0.3 版本 release
SOFAArk 2.2.2 版本 release

9 月迭代规划讨论

SOFAArk

基座模块1:1 复用 ClassLoader
支持 SOFABoot 4

SOFAServerless

支持中间件列表与优先级,排摸支持情况,设计评测标准
基座 Starter,Arklet 的打包发布

ModuleController

新扩后缩
模块回滚
模块流量 Service

Arklet

服务的跨SpringContext 发现与调用
#42
#39
#37
#17

Arkctl Arklet ModuleController 0.5 发版本

新晋PMC

产品指标化运营系统调研与搭建

按照业界的一些主流统计方法,每月先手动产出一份社区运营指标,具体包括:
1、简单的北极星指标。
2、Gitee 的指标体系。
3、CHAOSS 指标体系。
4、尝试使用并部署 DevLake 观测指标。

Serverless 运维调度 0.3 版本发布与演示

In what area(s)?

/area operator

Describe the feature

1、各项参数校验
2、模块滚动回滚
3、单测覆盖率达到行 80% 分支 60%
4、新增 8+ 集成测试,具备 PR 合并自动化能力
5、module-controller 开发指南文档

【User 文档】弹性运维调度系统 module-controller 搭建部署文档

demo 应用准备

基座准备

dynamic-stock-mng
https://github.com/sofastack-guides/sofa-ark-dynamic-guides

注:本地构建建议使用最新版本 arklet。

构建基座镜像

在本地使用 docker 构建镜像:
docker buildx build --platform linux/amd64 -t dynamic-stock-mng .
docker tag [ImageId] serverless-registry.cn-shanghai.cr.aliyuncs.com/opensource/test/dynamic-stock-mng:[镜像版本号]
docker push serverless-registry.cn-shanghai.cr.aliyuncs.com/opensource/test/dynamic-stock-mng:[镜像版本号]

注意: 使用 docker buildx build --platform linux/amd64 , build for multiple architectures

模块准备
dynamic-provider
上传OSS: http://serverless-opensource.oss-cn-shanghai.aliyuncs.com/module-packages/stable/dynamic-provider-1.0.0-ark-biz.jar?Expires=1690827422&OSSAccessKeyId=TMP.3KkBner42hKhywrbHcxUSvaypwEqSV6P2nFhdxU6CFA3Z3FW9FNwWBLvBiNXMfwhLXEhSSiMLx6f25ynecTYD4fjVQXWys&Signature=FPMoPLiDZdYS6nE%2Fb8GG1Vw3Ik0%3D

Operator 准备

构建 Operator 镜像

在本地使用 docker 构建镜像:
docker buildx build --platform linux/amd64 -t module-deployment .
docker tag [ImageId] serverless-registry.cn-shanghai.cr.aliyuncs.com/opensource/test/module-deployment:[镜像版本号]

部署

本地使用 minikue kubectl 部署 CRD、RBAC、测试基座、Operator 等

部署CRD

kubectl apply -f /module-deployment/config/crd/bases/module-deployment.serverless.alipay.com_moduledeployments.yaml kubectl apply -f /module-deployment/config/crd/bases/module-deployment.serverless.alipay.com_modulereplicasets.yaml
kubectl apply -f /module-deployment/config/crd/bases/module-deployment.serverless.alipay.com_modules.yaml kubectl apply -f /module-deployment/config/crd/bases/module-deployment.serverless.alipay.com_moduletemplates.yaml

部署RBAC

kubectl apply -f /module-deployment/config/rbac/role.yaml kubectl apply -f /module-deployment/config/rbac/role_binding.yaml
kubectl apply -f <?>/module-deployment/config/rbac/service_account.yaml

部署 demo 应用

kubectl apply -f <?>/module-deployment/config/samples/dynamic-stock-deployment.yaml
为demo应用配置了slb,可访问: 139.224.111.169:8080

部署 operator

kubectl apply -f <?>/module-deployment/config/samples/dynamic-stock-deployment.yaml


演示

副本数为1 的ModuleDeployment
kubectl apply -f <?>/module-deployment/config/samples/module-deployment_v1alpha1_moduledeployment.yaml
确认产生 ModuleDeployment ModuleReplicaSet 资源,确认长出一个 module。


kubectl get moduledeployment
kubectl get modulereplicaset
kubectl get module -oyaml
确认对应的pod上热部署了模块


资源 module 的ownereference 和其中的 label 都包含对应的pod信息。
登陆pod,确认 module 已安装。


扩容到 5
确认 module
kubectl get module
http://139.224.111.169:8080/ 已经可访问


缩容到 3
确认 module instance 只有 3 个,2 个模块已从机器上卸载

月会 23.07.03 SOFAServerless 月会(第四次月会)

月会议题

SOFAArk 版本发布计划

  • 2.2.1 版本,预计 7 月底发布
  • 打包插件支持url获取排除 jar 列表

Arklet 近期变更内容

  • 完成arklet工程初始化, 提供spring starter依赖方式启动
  • 提供apiclient指令渠道扩展能力, 完成http协议
  • 支持装卸、激活、查询模块指令, 提供标准指令扩展能力
  • 完成biz identify维度指令锁机制

当前未关闭 Issue 进展同步

需求类:
支持生成 zip64 格式可执行文件 ( sofastack/sofa-ark#404 )
sofaark静态合并部署 集成 springcloud ( sofastack/sofa-ark#645 )
Jar中jar中jar,解析ArtifactId ( sofastack/sofa-ark#655 )

bug类:
日志打印 ( sofastack/sofa-ark#624 )

--- 2023年6月月会---
测试类:
集成测试 ( sofastack/sofa-ark#25 )
需求类:
sofa-ark-maven-plugin的gradle插件( sofastack/sofa-ark#73 )
sofa-ark-maven-plugin 打包 war 包( sofastack/sofa-ark#215 )
资源隔离( sofastack/sofa-ark#566 )
资源模糊匹配( sofastack/sofa-ark#113 )

@gaosaroma

开源之夏活动

开发一个客户端,支持 Biz 模块的热部署和热卸载,初步实现 Serverless 体验

导师:@glmapper

设计详见 6月月会


开发一个 K8S Operator,编排客户端 API 实现 Biz 模块的热部署,初步达成 Serverless 研发体验

项目描述:SOFAArk 从最初的一个类隔离框架,逐步演进为支持合并部署与热部署的 “Serverless” 运行时框架,尤其在去年我们完成了 SOFAArk 1.0 到 2.0 架构的演进。但是为了让开发者真正享受 Serverless 的研发体验,我们需要先建设一个简易的 K8S Operator 和 SOFAServerlessModuleDeployment、SOFAServerlessModuleReplicaSet CRD,对接编排模块热装载和热卸载的客户端,实现模块秒级发布的初步能力,让开发者能初步体验到 Serverless 的发布运维能力。

导师:@gold300jin

项目产出要求:设计一组 CRD 并实现一个 K8S Operator,Operator 底层调用热安装和热卸载的客户端 arklet,让用户能够通过 kubectl 操纵 SOFAModuleDeployment 从而实现 SOFA 模块的热部署和热卸载运维能力。

项目技术要求:理解 SOFAArk 模块安装和卸载部分的源代码,并且熟悉 K8S CRD 和 Operator 体系的设计与开发。

初步设计

module deployment drawio

支持能力

通过API 和 CR 的方式支持:
支持 deployment 下 pod 的单模块和多模块的发布、回滚和下线。
支持变更中的 beta 和动态分组等部署策略。
支持变更中暂停和恢复。
支持模块的一致性校验和拉齐。
支持 pod 变更时(发布、重启、替换和扩容)的模块回放。
支持查询 pod 中的模块状态和运行情况。

SOFAServerless 开源计划和RoadMap

module-deployment

  • 23 年 7 月:module-deployment module-deployment crd api 和核心领域模型定义,首个初始化 MR 完成提交(代码脚手架)
  • 23 年 8 月:module-deployment operator 实现
  • 23 年 9 月:module-deployment 1.0 版本完成发布(基于 ModuleDeployment CR 的对等模块分组发布能力、模块首发和下线能力、基于基座模块安装个数限制的简单调度能力。使用 K8S 调和方式实现)
  • 23 年 10 月:module-deployment 1.1 版本完成发布(模块扩缩容能力、替换能力)
  • 23 年 11 月:module-deployment 1.2 版本完成发布(更加定制化的模块调度能力)
  • 24 年 1 月:module-deployment 1.3 版本完成发布(模块发布运维能力支持 HTTP/RPC + DB 方式实现)
  • 24 年 3 月:module-deployment 1.4 版本完成发布(支持先扩容后缩缩容的热部署方式,根除原地替换潜在的类卸载问题)
  • 24 年 5 月:module-deployment 1.5 版本完成发布(当发现基座应用 Pod 不够调度支持自动扩容 Pod)
  • 24 年 12 月:module-deployment 2.x 支持非对等模块发布

Arklet

  • 23.07.05:arklet 首个初始化 MR 完成提交
  • 23.09.05:arklet 1.0 版本完成发布(单模块安装和卸载运维编排、多模块安装和卸载运维编排、基座容器启动自动安装模块、HTTP/RPC 多种对外接口支持等)
  • 23 年 12 月:arklet 1.1 - 1.3 版本发布,包括每月一次的日常迭代演进。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.