Sealos 基础教程:Sealos Devbox 的架构原理解析
今天这篇文章咱们来聊一聊 Sealos Devbox 到底是怎么设计的,据说隔壁老奶奶最喜欢看这种有技术深度的文章了。
Devbox 返璞归真,把开发者的开发精力放到开发中去,真正做到了摈弃复杂的 CI/CD,Docker,YAML 编排,除此之外还力求拉平开发与测试与运维团队之间的一切界限,从从业者的角度做到了一套环境,随处运行。
那么,代价是什么呢?
Devbox 的架构极大的阐释了 “Sealos - 一切皆应用” 的理念,通过对不同组件层级的抽象与集成,把复杂度控制在不同层级的内部,从而达到在体验和效果上的一致性。
在内部设计与架构方面,我们进行了大量复杂的工作,以确保系统的高效和解耦。这个过程涉及了不同分层级别下面的架构区别和规划,不同层级之间的技术细节与选型互不依赖,针对每一个功能点都进行了针对性的设计。
尽管内部逻辑复杂,Devbox 的核心却是让用户在几乎不需要更改现有的代码开发与上线流程的前提下能够直接无缝上云,快速且直接的体验到云原生与虚拟化的优势。在使用相同的 IDE 开发的前提下,可以提供和现有的所有开发流程完全一致的体验。
很多时候,研发同学和运维同学,开发流程和上线流程,很容易因为环境的不一致出现的问题而导致时间与精力的耗费。比如说在我的电脑上运行好好的,到了另一台电脑上就不行了,或者是同样的初始化脚本,在开发机上是可以跑起来的,但是在上线之后却出现了各种各样的问题,这种情况在 Devbox 上是不会发生的。
整体架构
整体架构图如下:
Devbox 可以大致的分为三个大部分:
- Interface
- Controller
- Container Shim
Interface
用户直接交互的界面与接口的聚合部分,包括 Web 前端,插件端,API 端。
Web 前端
Sealos 内 App 的部分,完整的用户交互界面,包括创建,查看,变更,删除等等,是用户与 Devbox 交互的第一入口。
插件端
实际为 VS Code 和 Jetbrain 等 IDE 的插件,在 IDE 内展示与管理 Devbox 列表,与 API 端交互。
API 端
负责与控制器交互,鉴权 web 前端/插件端请求,聚合转换数据接口等。
Controller
Devbox 控制器负责将来自用户的请求转换为 K8s 的资源,实际创建对应 Devbox 实例的 pod,svc,ingress 等,管理对应的数据,监听与同步 Devbox 实例的所有状态,返回外部可访问的网络 URL 等。
Devbox Controller 支持如下命令:
- 展示可用的 Runtime 集合
- 创建/删除 Devbox
- 展示 Devbox 的状态
- Devbox 的关机/开机/重启
- 变更 Devbox 的资源配置
- 提供 IDE 端可连接的网络
- nodePort 模式
- wsTunnel 模式
- 配置 Devbox 内应用监听的端口,提供对外测试用 URL
- 发布与共享预装好的 Runtime 环境
Container Shim
负责与 kubernetes 的底层 CRI 部分进行交互,实现容器的持久化与提交到 Devbox 专属的镜像仓库,更新镜像信息等,是 Devbox 的核心部分。
一个完整的用户流程
- 用户登录 Sealos,打开 Devbox 的 Web 界面,点击新建 Devbox,选择一个 Runtime,选择版本,调整所需的资源,点击创建。
- 前端创建一个 Devbox 的 CR,spec 内容为上述选择的信息。
- Controller 监听到 CR 的创建,生成所需的 image/tag,创建对应的 pod,svc 等资源,并记录到 CR 的 status 字段。
- 前端轮询 CR 的状态更新,拿到 status 字段里面的内容渲染到一键连接的按钮上。
- 用户点击一键连接,唤起 VS Code/Jetbrains 的插件,插件通过 API 端获取到 Devbox 的 SSH 连接信息,通过 nodePort/wsTunnel 连接到对应的 Pod 上。
- 用户在 IDE 内开发,调试,测试.
- 完成开发后,用户选择提交修改 (关机/定时触发)。
- K8s 监听到 Pod 的关闭/变更请求,发送对应的 Event 到 Sealos 的 Devbox 专用的 containerd-shim(Proxy 服务)。
- containerd-shim 根据不同的事件,执行对应的操作,比如保存用的 emptyDir,与 overlayFS 合并,commit 成一个新的镜像,提交到内部安全隔离的镜像仓库。
- 用户重新开机/继续使用 Devbox,Controller 会监听到对应的事件,重新创建对应的 Pod,切换 Pod 的 image 为上次 Commit 的镜像。
- 用户所有变更都保留,就像使用传统的虚拟机一样。
后续
后续,Devbox 还会提供:
- 开机自启动,模拟 systemd
- 自定义 runtime
- 开发环境共享
- 镜像仓库对用户开放
- 协作与权限控制
等等功能,力求在保证一致的开发运行体验的架构上,利用轻量级虚拟化的特点,提供更多的扩展能力。
颤抖吧世界,大的要来了!
Sealos 基础教程:Sealos Devbox 的架构原理解析的更多相关文章
- RocketMQ架构原理解析(四):消息生产端(Producer)
RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...
- RocketMQ架构原理解析(一):整体架构
RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...
- Tomcat 架构原理解析到架构设计借鉴
Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...
- 分布式架构原理解析,Java开发必修课
1. 分布式术语 1.1. 异常 服务器宕机 内存错误.服务器停电等都会导致服务器宕机,此时节点无法正常工作,称为不可用. 服务器宕机会导致节点失去所有内存信息,因此需要将内存信息保存到持久化介质上. ...
- Scrapy框架的架构原理解析
爬虫框架--Scrapy 如果你对爬虫的基础知识有了一定了解的话,那么是时候该了解一下爬虫框架了.那么为什么要使用爬虫框架? 学习框架的根本是学习一种编程思想,而不应该仅仅局限于是如何使用它.从了解到 ...
- RocketMQ架构原理解析(三):消息索引
一.概述 "索引"一种数据结构,帮助我们快速定位.查询数据 前文我们梳理了消息在Commit Log文件的存储过程,讨论了消息的落盘策略,然而仅仅通过Commit Log存储消息是 ...
- feign架构 原理解析
什么是feign? 来自官网的解释:Feign makes writing java http clients easier 在使用feign之前,我们怎么发送请求? 拿okhttp举例: publi ...
- RocketMQ架构原理解析(二):消息存储
一.概述 由前文可知,RocketMQ有几个非常重要的概念: broker 服务端,负责存储.收发消息 producer 客户端1,负责产生消息 consumer 客服端2,负责消费消息 既然是消息队 ...
- Spark集群基础概念 与 spark架构原理
一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...
- 【python基础教程】-10.开箱即用(模块的工作原理,获悉模块的功能以及常用模块)
资料来源 (1) Python基础教程第三版 1.模块的工作原理 1.1 简单的模块及使用 1.1.1 模块的本质 (1) 模块就是程序,任何python程序都可以作为模块导入; 1.1.2 简单的模 ...
随机推荐
- 轻松易懂,一文告诉你什么是http协议?
阅读本文之前,请详细阅读以下几篇文章: <一文包你学会网络数据抓包> <教你如何抓取网络中的数据包!黑客必备技能> 一.什么是http? Http协议即超文本传送协议 (HTT ...
- Buckingham-Reiner 方程和 Darby-Melson 经验方程
由 Roni, et al. (2018), Woolley, et al. (2014), Yang, et al. (2017) 整理人便便的物理性质数据如下: 性质 值 密度 \((\text{ ...
- 【Python】之操作鼠标键盘,上传文件,并支持中文
Mac系统实现操作键盘 Python中模拟键盘和鼠标最著名的模块是:pymouse和pykeyboard.一次安装两个模块比较麻烦,而有一个库整合了这两个模块,而且能支持跨平台操作,这个库叫PyUse ...
- 公有云-实验一 实践腾讯云部署Web应用
实验一 实践腾讯云部署Web应用 概述 企业A需要搭建一套在互联网上发布的论坛平台,但是企业内部并没有完善的基础架构设施,难以保证论坛平台的高可用性和高安全性.经过IT部门相关专家分析讨论,决定在腾讯 ...
- AGC007F 题解
题意 给定两个长为 \(n\) 的字符串 \(S, T\),求最少进行多少次操作才能使 \(S = T\). 一次操作定义为:对于 \(i = 1, 2, .. n\),令第 \(i\) 位为操作后的 ...
- C++ STL list容器——链表
list容器 简介 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列节点组成,节点可以在运行时动态生成.每个节点包括两部分:一个是存储 ...
- Spring —— AOP总结
AOP 总结
- 邀请参与 2022 第三季度 Flutter 开发者调查
自 Flutter 3 发布之后,我们在以移动端为中心到多平台框架的路线上稳步前行,用 Dart 2.17 的新语言特性帮助大家提升工作效率,并对核心工具进行了改进,让您在跨平台打造优秀体验时更加得心 ...
- manim边学边做--空心多边形
空心的多边形Cutout是一种比较特殊的多边形,主要用于解决与形状.大小.位置等相关的数学问题. Cutout多边形可以定义物体表面的空洞或凹陷部分,从而更准确地模拟现实世界中的复杂形状. 比如,在P ...
- Electron.Net + Linux + Blazor 初尝备忘录
Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序的一个框架, Electron.NET 是.net 下对 Electron 的封装实现, 通过它可以比较容 ...