今天这篇文章咱们来聊一聊 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 的架构原理解析的更多相关文章

  1. RocketMQ架构原理解析(四):消息生产端(Producer)

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  2. RocketMQ架构原理解析(一):整体架构

    RocketMQ架构原理解析(一):整体架构 RocketMQ架构原理解析(二):消息存储(CommitLog) RocketMQ架构原理解析(三):消息索引(ConsumeQueue & I ...

  3. Tomcat 架构原理解析到架构设计借鉴

    Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说如今就没有必要深入学习它了么?学习它我们又 ...

  4. 分布式架构原理解析,Java开发必修课

    1. 分布式术语 1.1. 异常 服务器宕机 内存错误.服务器停电等都会导致服务器宕机,此时节点无法正常工作,称为不可用. 服务器宕机会导致节点失去所有内存信息,因此需要将内存信息保存到持久化介质上. ...

  5. Scrapy框架的架构原理解析

    爬虫框架--Scrapy 如果你对爬虫的基础知识有了一定了解的话,那么是时候该了解一下爬虫框架了.那么为什么要使用爬虫框架? 学习框架的根本是学习一种编程思想,而不应该仅仅局限于是如何使用它.从了解到 ...

  6. RocketMQ架构原理解析(三):消息索引

    一.概述 "索引"一种数据结构,帮助我们快速定位.查询数据 前文我们梳理了消息在Commit Log文件的存储过程,讨论了消息的落盘策略,然而仅仅通过Commit Log存储消息是 ...

  7. feign架构 原理解析

    什么是feign? 来自官网的解释:Feign makes writing java http clients easier 在使用feign之前,我们怎么发送请求? 拿okhttp举例: publi ...

  8. RocketMQ架构原理解析(二):消息存储

    一.概述 由前文可知,RocketMQ有几个非常重要的概念: broker 服务端,负责存储.收发消息 producer 客户端1,负责产生消息 consumer 客服端2,负责消费消息 既然是消息队 ...

  9. Spark集群基础概念 与 spark架构原理

    一.Spark集群基础概念 将DAG划分为多个stage阶段,遵循以下原则: 1.将尽可能多的窄依赖关系的RDD划为同一个stage阶段. 2.当遇到shuffle操作,就意味着上一个stage阶段结 ...

  10. 【python基础教程】-10.开箱即用(模块的工作原理,获悉模块的功能以及常用模块)

    资料来源 (1) Python基础教程第三版 1.模块的工作原理 1.1 简单的模块及使用 1.1.1 模块的本质 (1) 模块就是程序,任何python程序都可以作为模块导入; 1.1.2 简单的模 ...

随机推荐

  1. Quartz.NET 的使用

    先貼使用代碼: 1 using Quartz; 2 using Quartz.Impl; 3 using Quartz.Logging; 4 using System; 5 using System. ...

  2. 2021 CCPC 威海

    gym 知乎 确定了我先写缺省源,gjk 正开,zsy 倒开的策略 先读了 EFGH,发现是概率.博弈.计数,只能做 H,感觉我已经到点了.队友签了 AJ zsy 说 M 是多项式快速幂并准备开冲,看 ...

  3. Ubuntu16.04使用命令行安装jdk1.8

    在Ubuntu中安装jdk过于麻烦,有时设置不好可能就没有办法使用,卸载也难以卸载干净,所以这篇文章使用相对简单的命令行来安装jdk,只需简单的四个命令,省去许多麻烦,下面是方法. 进入Ubuntu打 ...

  4. 通过 GitHub Actions 实现代码的自动编译和发布

    GitHub Actions 是一个非常强大的工具,可以用来实现各种自动化任务,包括自动编译和发布 release.以下是一个基本的工作流程,展示如何使用 GitHub Actions 实现这一目标: ...

  5. 操作 JAR 文件

    列出 JAR 文件内容 使用 jar 命令来列出 JAR 文件的内容: jar tf myapp.jar -t 选项表示列出文件,-f 表示指定 JAR 文件. 解压 JAR 文件 使用 jar 命令 ...

  6. mvn install 设定下载的依赖保存的地址

    mvn clean install -P jdk-1.8 -Dmaven.repo.local=/xxxx/repository

  7. manim边学边做--带箭头直线

    带箭头的直线就是有方向的直线,既可以用来表示矢量,也可以用来标记某个关键位置.manim中提供了4种常用的带箭头的直线模块: Arrow:单箭头的直线 DoubleArrow:双箭头的直线 Label ...

  8. 牛逼!Vue3.5的useTemplateRef让ref操作DOM更加丝滑

    前言 vue3中想要访问DOM和子组件可以使用ref进行模版引用,但是这个ref有一些让人迷惑的地方.比如定义的ref变量到底是一个响应式数据还是DOM元素?还有template中ref属性的值明明是 ...

  9. SQL查折线图数据

    在做后台管理系统的时候,有很大概率是要与各种图表数据打交道, 那么如何通过SQL查出基本图表的数据呢,以折线图为例, X轴为日期,Y轴为统计数据,那么我们通过SQL如何查询出连续日期下的统计数据呢, ...

  10. 爬虫案例2-爬取视频的三种方式之一:selenium篇(2)

    @ 目录 前言 selenium简介 实战案例 共勉 博客 前言 继使用requests库爬取好看视频的文章后,本文分享使用python第三方库selenium库接着来爬取视频网站,后续也会接着分享使 ...