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 Issues

【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 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 版本,完成文件与方法拆分、单测注释、开发者文档与用户使用文档。

Serverless 运维调度组件一期实现

In what area(s)?

/area operator

Describe the feature

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

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

月会 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 版本发布,包括每月一次的日常迭代演进。

SOFABoot 验证支持常用中间件

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

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

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

In what area(s)?

/area operator

Describe the feature

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

月会 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
  • 消息
  • 数据库
  • 缓存

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

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

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

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

收集目的

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

收集方式

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

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

展示

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

服务

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

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

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

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

In what area(s)?

/area operator

Describe the feature

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

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)

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 环境

【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 缓存,已经加速源代码构建。

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 新手任务列表,总有一个适合你😜。

[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

【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 个模块已从机器上卸载

[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模块数量没有超过设定的阈值

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

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

通过基座看到模块实例个数【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 上已被调度的模块实例个数

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

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.