k8s编程operator实战之云编码平台——①架构设计

news2024/11/16 7:45:59

文章目录

    • 1、想法来源
    • 2、初步设想
      • 2.1 通过反向代理的方式访问后端Pod
    • 3、架构设计
      • 3.1 技术栈
      • 3.2 架构设计

k8s编程operator系列:
k8s编程operator——(1) client-go基础部分
k8s编程operator——(2) client-go中的informer
k8s编程operator——(3) 自定义资源CRD
k8s编程operator——(4) kubebuilder & controller-runtime
k8s编程operator实战之云编码平台——①架构设计
k8s编程operator实战之云编码平台——②controller初步实现
 

1、想法来源

之前偶然接触到了腾讯的Cloud Studio平台,使用这个平台我们可以创建一个云上的IDE,我们在本地使用浏览器即可打开vscode来写代码。里面含有多种编程环境的模板,比如Java模板、Go模板等,如下图所示,使用Go模板我们可以创建一个含有Go环境的云空间,即开即用,无需我们自己配置环境,非常的方便。

在这里插入图片描述

启动后的工作空间如下图所示,而且当我们在云空间中启动一个http服务后,还可以在浏览器中访问到我们在云空间中启动的服务。

在这里插入图片描述

之后,我发现了更多这样的平台,包括CSDN的开发云、Github的codespaces等。

之后我就一直在想,这样一个平台是怎么样实现的?

 

2、初步设想

        使用这些平台打开的IDE都是vscode,而code-server是vscode浏览器版本,那么它们的实现肯定用到了code-server,关于code-server的搭建可以参考我之前的一篇博客:云vscode搭建–使用容器化部署
        那么部署code-server除了使用Docker还可以使用Kubernetes,如果使用Docker显然是不太现实的,因为容器的管理是个问题,毕竟单台机器怎么能支持的了那么多容器呢?使用Kubernetes就可以管理这些运行着code-server的容器,解决了code-server的部署问题,接下来就是code-server的访问问题了,用户如何才能访问到自己的容器呢?

关于如何访问到Pod中的Code-Server,我想到了两种实现思路:

  1. 使用NodePort的方式做端口映射:使用kubernetes的service,将运行用户code-server的Pod以NodePort的方式暴露出来,用户可以通过服务器IP:port的方式访问。

    优点:实现简单

    缺点:整个集群端口数量有限:65535,最多只能支撑6万多个用户同时使用

  2. 使用反向代理的方式:运行在集群中的Pod可以在集群内通过PodIP来访问到,但是在外部访问不到,那么可以通过反向代理的方式来实现,在集群内运行反向代理服务器,根据用户信息获取用户的code-server运行的Pod的IP,然后将请求反向代理到Pod中。

    优点:不会过多占用集群的端口,没有最大用户使用的限制,更加灵活

    缺点:实现复杂

 

2.1 通过反向代理的方式访问后端Pod

        说到反向代理,那我们通常能想到的软件就是nginx,nginx的性能非常强悍。但是通常我们在使用nginx做反向的代理的时候,后端IP都是写死的。一般用来做反向代理和负载均衡时,对于一个服务,后端的服务器都是一样的,根据负载均衡策略选择一个服务,如下所示:

在这里插入图片描述

        但是我们现在的一个思路是,将不同的用户代理到属于他的工作空间:

在这里插入图片描述

        那么我们就需要一个动态的反向代理。如果用户在创建用户空间时,我们就在nginx的配置文件中添加一条规则,然后重启nginx,是可以实现的。但是这样的方式显然很不合理,虽然nginx提供了热加载的功能,但是它本质也是启动了新的进程来替换旧的进程,所以频繁的重启nginx显示是不行的。

        后来,我查询了很多资料包括通过网页的方式DEBUG其它云平台,我发现他们应该是通过openresty来实现的。

        openresty是国人的一个项目,它是基于nginx的,使用openresty我们可以通过lua脚本来进行动态的反向代理。

实现的思路如下:

  1. 在为用户创建Pod时,获取到Pod的Ip地址。
  2. 然后生成UID,将UID和IP以键值对的方式存储到redis中。
  3. 在访问工作空间时,在路径中带上UID。
  4. nginx在获取到请求后,使用lua脚本从路径中取出UID,然后从redis中查询出Pod的IP。
  5. 最后,将用户请求代理到Pod中。

那么如何针对不同的用户访问到自己的工作空间的问题也解决了,如果访问用户在工作空间中启动的服务也可以通过这样的方式来解决。

 

3、架构设计

3.1 技术栈

整个云编码平台的技术栈为:golang + gin + grpc + mysql + redis + kubebuilder + openresty + code-server + vue

整个平台的后端语言选择为go语言

  • web开发使用的框架为gin
  • kubebuilder用来开发k8s的controller
  • grcp实现web调用controller来对Pod进行CRUD
  • openresty用来做反向代理
  • vue用来写前端页面
  • mysql用来存储用户数据
  • redis用来存储用户启动的工作空间信息
  • code-server作为IDE

云编码平台的名称就为:Cloud Code

 

3.2 架构设计

Cloud Code的架构设计如下:

用户从创建工作空间到访问工作空间的流程如下:

  1. 用户访问web服务器来创建工作空间
  2. web服务器生成工作空间Space的信息,包括工作空间的名称、所属用户、创建使用的模板、规格(可以使用的资源大小,CPU、内存、存储)、SID(space id)
  3. 然后调用Cloud Code Controller的rpc来创建Pod
  4. Cloud Code Controller是用kubebuilder编写的一个K8S controller,用来实现对工作空间的Pod的CRUD以及状态的维护。
  5. 创建Pod后,获取Pod的IP,将SID(UID)以及Pod IP保存到redis中
  6. 用户访问工作空间
  7. 首先到openresty中,openresty根据url中的UID从redis中查询Pod的IP地址
  8. 使用Pod的IP将请求代理到用户的Code-Server中

在这里插入图片描述

要实现的几个程序如下:

Cloud Code Controller:用来实现工作空间也就是Code-Server的Pod的CRUD,以及状态的维护。

Openresty lua动态反向代理脚本:将用户的请求反向代理到其创建的Code-Server中。

Web服务器:云编码平台的Web后端

前端页面:页面展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/83293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringSecurity管理接口权限

使用SpringSecurity管理具体接口访问权限。 需要先有授权服务器和资源服务器 Springboot利用Security做OAuth2授权验证_LO嘉嘉VE的博客-CSDN博客 Springboot利用Security做OAuth2资源服务器_LO嘉嘉VE的博客-CSDN博客 配置接口具体访问权限再有以上两个的基础上就比较简单了…

antd-vue 累加表单编辑和删除(完善版)

一、业务场景&#xff1a; 最近在使用Antd-Vue组件库的时候&#xff0c;发现在累加表单 时没有直接可以用的&#xff0c;必须自己在官网上手动合并几个才能实现&#xff0c;为了大家后面遇到和我一样的问题&#xff0c;给大家分享一下 二、具体实现步骤&#xff1a; <temp…

新一代最强开源UI自动化测试神器Playwright(Java版)环境搭建

Playwright 是专门为满足端到端测试的需要而创建的。Playwright 支持所有现代渲染引擎&#xff0c;包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行本地测试或在 CI 上进行测试&#xff0c;无外设或带本机移动仿真。 一.安装 在JAVA中&#xff0c;使用…

嵌入式技术之IAP,自从有了它老板再也不担心我的代码了!(上)

1.惨痛的教训 那是一个严寒的冬日&#xff0c;客户在现场使用我们公司新研发的设备&#xff0c;设备最初设计可以允许最多连接20个温湿度传感器&#xff0c;但是由于现场空间非常大&#xff0c;客户要求连接30个温湿度传感器。这个需求修改非常简单&#xff0c;只用修改程序中…

帮公司面试了个要25K的测试,我问了他这些问题...

深耕IT行业多年&#xff0c;我们发现&#xff0c;对于一个程序员而言&#xff0c;能去到一线互联网公司&#xff0c;会给我们以后的发展带来多大的影响。 很多人想说&#xff0c;这个我也知道&#xff0c;但是进大厂实在是太难了&#xff0c;简历投出去基本石沉大海&#xff0…

spring security安全认证登录全流程分析

文章目录前言一、登录时序图二、配置与代码1.引入库2.代码文件参考文档前言 本文章主要从spring security安全认证登录内部调用流程来流程分析登录过程。 一、登录时序图 时序原图 二、配置与代码 1.引入库 pom.xml&#xff1a; <!-- Spring框架基本的核心工具 -->&…

截至到2022年12月12日,知网最新改进 YOLO 核心论文合集 | 22篇创新点速览

截至到2022年12月12日&#xff0c;知网最新改进YOLO核心论文合集 本篇博文仅供学习交流&#xff0c;不对文章质量进行评价&#xff0c;请尊重每一位同学的科研成果&#x1f91d;。 文章目录截至到2022年12月12日&#xff0c;知网最新改进YOLO核心论文合集引言&#x1f4a1;0. 什…

Vue.use()的用法详解

目录 &#x1f53d; 前言 &#x1f53d; 官方解释 &#x1f53d; Demo演示 &#x1f388; Object对象 &#x1f449; 创建项目 &#x1f449; 创建组件 &#x1f449; 使用组件 &#x1f388; function函数 &#x1f449; 创建函数 &#x1f449; 引入 &#x1f449…

机器人与视觉,基于坐标系的运动偏移

基于可移动坐标系的机器人坐标偏移 在生产过程中&#xff0c;当需要建造多个坐标系的时候&#xff0c;我们可以采用基于坐标系偏移&#xff0c;可以实现使用机器人坐标系直接完成多个坐标系的联动。 由于实现多个坐标系的联动情况&#xff0c;那么通常都会伴随着坐标系的移动和…

力扣1781. 子字符串的美丽值之和(cpp实现+解析)

文章目录1781.子字符串的美丽值之和完整代码1781.子字符串的美丽值之和 力扣传送门&#xff1a; https://leetcode.cn/problems/sum-of-beauty-of-all-substrings/description/ 题目描述&#xff1a; 一个字符串的 美丽值 定义为&#xff1a;出现频率最高字符与出现频率最低字…

CMake中add_compile_options/target_compile_options的使用

CMake中的add_compile_options命令用于向源文件的编译添加选项&#xff0c;其格式如下&#xff1a; add_compile_options(<option> ...) 将选项添加到COMPILE_OPTIONS目录属性。从当前目录及以下目录编译target时&#xff0c;将使用这些选项。 add_compile_option…

48-90-Scala-函数式编程基础特性等

48-Scala-函数式编程&#xff1a; 函数式编程 1、完全面向对象编程 2、函数式编程&#xff0c;万物皆函数&#xff0c;程序语句的集合&#xff0c;称为函数。类中的函数称之方法。函数无重载重写概念&#xff0c;方法可以。函数可以嵌套 3、函数的定义def test3(s:String):…

电子书资源:分享10个非常好用的免费书籍资源网站

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Qt扫盲-QCheckBox 理论总结

QCheckBox 理论总结1. 简述2. 分组3. 状态&信号4. 外观&快捷键1. 简述 QCheckBox是一个选项按钮&#xff0c;可以 选中 或 未选中。复选框通常用于表示应用程序中可以启用或禁用的功能&#xff0c;而不会影响其他功能。可以实现不同类型的行为。一般是很多个联用的。 …

Cookie、Session、Token比较

1 Cookie cookie 指的就是浏览器里面能永久存储的一种数据&#xff0c;仅仅是浏览器实现的一种数据存储功能。 cookie由服务器生成&#xff0c;发送给浏览器&#xff0c;浏览器把cookie以 key-value 形式保存到某个目录下的文本文件内&#xff0c;下一次请求同一网站时会把该…

基于适应度-距离平衡的人工生态系统优化算法解决瞬态稳定性约束最优潮流问题(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

Awaitility同步异步工具介绍与RocketMQ中实战

在编写测试用例的时候遇到有异步或者队列处理的时候经常会用到 Thread.sleep() 等待来进行测试。例如&#xff1a;DLedger 测试选举的过程。当DLedger Leader下线。此时DLedger会重新发起选举&#xff0c;这个选举的过程是需要一定时间。很多时候在测试代码中就会使用 Thread.s…

b站黑马的Vue4小时快速入门案例代码——计数器

目录 目标效果&#xff1a; 重点原理&#xff1a; 1.创建Vue实例的时候&#xff1a; 2.v-on——为元素绑定事件 3.v-text——【解析文本用】设置标签的文本值 v-text【简写】为{{}} 实现步骤&#xff1a; 代码部分&#xff1a; 1.计数器模板.html(全是重点&#xf…

m基于粒子群算法的分布式电源DG的优化配置

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 随着科技的发展&#xff0c;人民生活水平的不断提高&#xff0c;使得当今社会的发展对能源环保性和供电的可靠性的要求也不断提高。集中式供电系统由于污染大、可靠性差及操作难度大等缺陷越来越…

MySQL数据库基础知识7,查询的执行过程

目录一、拆分查询二、分解关联查询三、查询的执行过程四、优化器的一些优化手段1、重新定义关联表的顺序2、将外连接转化为内连接3、使用增加变换规则4、优化count()、max()、min()5、预估并转化为常量表达式6、覆盖索引扫描7、提前终止查询五、MySQL如何执行关联查询六、查询执…