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

K8S学习指南(65)-Operator介绍 Kubernetes Operator 是一种以自定义资源(Custom Resource,CR)为基础的自动化控制器。它的设计初衷是为了更好地支持应用程序的生命周期管理,使得开发者能够在 Kubernetes 上更轻松、更自动地部署、更新和管理应用。Operator 的工作方式类似于一个 K8S 控制器,但是它不仅仅关注于基本的资源管理,还关心应用程序的特定需求。通过引入 Operator,我们可以将关于应用的操作和管理逻辑进行抽象,以实现更高级的自动化。首先,我们需要定义Database。 阅读详情


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初步实现
k8s编程operator实战之云编码平台——③Code-Server Pod访问实现
k8s编程operator实战之云编码平台——④web后端实现
k8s编程operator实战之云编码平台——⑤项目完成、部署
 

1、想法来源

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

在这里插入图片描述

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

在这里插入图片描述

之后,我发现了更多这样的平台,包括优快云的开发云、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后端

前端页面:页面展示

K8S Operator 定义:K8S Operator是一种基于Kubernetes自定义资源(CR)和控制器概念的扩展软件,用于管理特定应用的生命周期和配置。功能自动化管理:通过定义自定义资源和Operator来自动管理应用程序的生命周期和配置。与K8S原生组件集成:Operator可与K8S原生的Controller、Scheduler等组件进行协同工作,提供更加灵活和可靠的管理方式。扩展K8S:借助Operator,可以在K8S集群上扩展新的资源类型,满足更多定制化的需求。 阅读详情

相关推荐

kubernetes operator解析

简而言之,控制器循环是控制器动作的基础。想象一下,有一个非终止过程(在 Kubernetes 中称为协调循环)一遍又一遍地发生,如下图所示:此过程至少观察一个 Kubernetes 对象,其中包含有关所需状态的信息。对象如…ServicesSecretsIngress…由配置文件定义,配置文件由 JSON 或 YAML 中的清单组成。然后控制器根据内置逻辑通过 Kubernetes API 进行持续调整以模仿所需状态,直到当前状态变为所需状态。

从大数据到人工智能的博客 2618

K8s系列之:K8s OPERATOR是什么

Kubernetes 的 Operator 模式概念允许你在不修改 Kubernetes 自身代码的情况下, 通过为一个或多个自定义资源关联控制器来扩展集群的能力。Operator 是 Kubernetes API 的客户端, 充当自定义资源的控制器。部署 Operator 最常见的方法是将自定义资源及其关联的控制器添加到你的集群中。Operator 模式会封装你编写的(Kubernetes 本身提供功能以外的)任务自动化代码。如果生态系统中没有可以实现你目标的 Operator,你可以自己编写代码。

zhengzaifeidelushang的博客 5487

(k8s)Kubernetes上部署MinIO Operator 对接MinIO

随之产品逐步完善,增加了这两个对象,而官方并完善底层PV创建的资料,从而导致pod/minio-tenant-1-log-0、minio-tenant-1-log-search-api-xxxxx、minio-tenant-1-prometheus-0这部分对象异常,下面就对问题进行临时处理,非最佳方案。当前未使用Helm Chart、krew等部署MinIO,直接使用kubectl进行部署,官方使用kubectl部署目前不是很完善,官方默认创建审计日志和监控时会失败,文中已将其完善。

Richardlygo的博客 2410

来了解一下 k8s 的 Operator 模式

在 `Kubernetes` 生态中还有一种更灵活、编程友好的解决方案 -- `Operator`, 它能让使用者根据自己应用的特性定义应用对象和管理对象的控制器。

ChaITSimpleLove的博客 5334

7.1 Kubernetes Operator实战指南:从Controller到Operator的技术跃迁

本文深入探讨了Kubernetes Operator的技术演进与实践指南。首先介绍了Kubernetes Controller模式的工作原理,包括监控资源、状态对比和执行操作的核心流程。然后阐述了Operator模式的诞生背景及其与Controller的区别,强调Operator通过编码领域知识实现复杂应用的自动化管理。文章详细解析了Operator的架构,包括自定义资源定义(CRD)和控制器逻辑的实现,展示了如何将运维知识转化为代码来降低复杂度、提高可靠性并标准化运维流程。

yonggeit的博客 3733

运维加薪技术之K8s Operator(K8s Operator for Salary Increase Technology in Operation and Maintenance)

‌K8s Operator‌是一种用于封装、部署和管理Kubernetes应用的方法。它通过使用Kubernetes API和kubectl工具在Kubernetes上部署和管理应用。是一种特定于应用的控制器,可以扩展Kubernetes API的功能,代表用户创建、配置和管理复杂应用的实例‌。 基本概念和工作原理K8s Operator基于Kubernetes的基本资源和控制器概念构建,但涵盖了特定于应用的知识,用于实现应用生命周期的自动化。它通过自定义资源(CR)管理

Linux运维老纪的博客 1097

k8s编程operator实战之云编码平台——⑤项目完成、部署

截至目前,云编码平台的基本功能已经实现了。使用该平台,我们可以根据空间模板来创建出一个云开发环境。对于每个用户来说,允许存在的工作空间最大数量为20个,允许同时启动的工作空间数量为1个。用户的代码数据以及安装的插件都是可以保存下来的。

Peerless__的博客 3421

AI编码工具在K8s Operator开发中的局限与人机协同实践

在云原生和容器化技术普及的背景下,Kubernetes(K8s)已成为现代应用部署和管理的核心平台。其声明式API和控制器模式通过持续调和期望状态与实际状态,实现了资源的自动化管理。这种模式的技术价值在于为复杂分布式系统提供了强大的编排与自愈能力,广泛应用于微服务治理、CI/CD流水线及混合云管理等场景。然而,当结合AI编码工具进行K8s Operator等深度开发时,工具在理解**最终一致性**、**资源生命周期**等复杂原理时存在局限,生成的代码可能仅语法正确,却隐含生产环境风险。因此,需要建立以人类经

weixin_30875157的博客 431

k8s编程operator实战之云编码平台——②controller初步实现

在上一章中介绍了整个云编码平台的架构设计,本章中将实现架构中的controller。需要使用的技术:k8s二次开发kubebuilder、grpc

Peerless__的博客 2788

k8s-fdb-configurator

Kubernetes FoundationDB配置器

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)

Steger算法(Line_Gauss)-光条中心线提取(基于Hessian矩阵)算法背景介绍Hessian 矩阵与泰勒多项式关于求t导数与中心点、亚像素点高斯函数作用文献 算法背景介绍 在线结构光视觉传感器中,由线激光器发射出的线结构光,在本质上为一个连续且具有一定厚度的空间光平面,而在目标表面上所形成的具有一定宽度的光条特征,即为该光平面与目标表面相交而成的交线。在该空间光平面的厚度方向上,光强近似服从高斯分布,因而在摄像机采集到的光条图像中,在沿着光条宽度的方向或光条的法线方向上,其灰度也会呈现出类似

jiangxing11的博客 1万+

k8s编程operator实战之云编码平台——④web后端实现

在前两章中分别实现了k8s controller和后端pod的访问。通过controller可以实现code-server容器的创建、删除以及状态维护等,通过openresty可以实现后端pod的动态反向代理。接下来将会实现web后端,使用的`web框架为Gin`;`mysql驱动为sqlx`;`redis驱动为go-redis`;`以及grpc`。

Peerless__的博客 1951

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

TestFlight分发测试app,提示无法安装 所请求的App不可用或者不存在

天穹云原生 9170

初识Kubernetes Operator

Operator模式是Kubernetes声明式API和控制器模式的强大延伸。对于运维复杂的有状态应用来说,它是一个极具价值的工具。从使用开始:先熟练使用OperatorHub上的成熟Operator,理解其行为。选择合适框架:当需要自研时,(或功能相似的)是你的首选。核心是调和循环:编写Operator的关键在于理解并实现好Reconcile函数,不断对比"期望状态"和"实际状态",并驱动系统向期望状态收敛。本文来源于我的微信公众号Linux运维小白,我会持续更新文章,欢迎大家关注,互相交流学习。

xgysimida的博客 1212

Flowable前端可视化配置动态审批人:告别硬编码,实现部门领导、项目经理自动分配

本文详细介绍了Flowable前端可视化配置动态审批人的全栈解决方案,通过表达式分配、监听器分配等动态审批人机制,实现从硬编码到智能分配的转变。文章提供了前端扩展bpmn-js设计器、后端动态解析实现方案及性能优化建议,帮助企业应对组织架构变动,提升审批流程的灵活性和效率。

weixin_30352645的博客 473

【技术拆解】Illumina边合成边测序(SBS)核心流程全解析 | 从文库构建到数据分析

本文深入解析了Illumina边合成边测序(SBS)技术的完整流程。从DNA样本的文库构建(片段化、加接头、扩增),到Flowcell上的簇生成(桥式PCR),再到核心的边合成边测序(SBS)循环(荧光标记、可逆终止),最后简述了从原始数据到生物学洞见的数据分析步骤,为理解这一主流高通量测序技术提供了清晰的框架。

weixin_29201859的博客 538

从源码到部署:flink-on-k8s-operator开发者指南与贡献实践

flink-on-k8s-operator是一款用于管理Apache Flink和Beam应用生命周期的Kubernetes Operator,本指南将带你从源码构建到部署实践,掌握完整开发流程与贡献方法。 ## 项目架构概览 flink-on-k8s-operator基于Kubernetes [controller-runtime](https://github.com/kubernetes

gitblog_00524的博客 1069

SOC设计必看!Tessent DRC检查中最容易踩的5个坑(附解决方案)

本文针对SOC设计中Tessent DRC检查的常见问题,详细分析了5个最易忽视的陷阱,包括时钟域交叉、扫描链虚连、多电压域规则等,并提供专业解决方案。特别针对芯片设计中的DFT验证难点,分享了经过验证的调试方法和Tessent工具使用技巧,帮助工程师提升DRC检查效率。

weixin_29280657的博客 496

万字长文 | 面向k8s编程,如何写一个Operator

新钛云服已为您服务1489天概述随着我们对 Kubernetes 的逐步了解,可能就会发现 Kubernetes 中内置的对象定义,比如 Deployment、StatefulSet、ConfigMap,可能已经不能满足我们的需求。我们希望在 Kubernetes 定义一些自己的对象,一是可以通过 kube-apiserver 提供统一的访问入口,二是可以像其他内置对象一...

NewTyun的博客 4945

【HYSPLIT 教程第二期】Inline WRF-HYSPLIT 耦合

【HYSPLIT 教程第二期】Inline WRF-HYSPLIT 耦合

WW、forever的博客 811

Python 爬虫实战:在房天下抓取房产信息,分析房价走势

通过本次 Python 爬虫实战,我们成功地从房天下爬取了房产信息,并进行了存储、处理、分析和可视化展示。在这个过程中,我们不仅掌握了爬虫技术的基本应用,还学会了如何对动态加载的数据进行处理和分析。然而,本次爬虫任务也存在一些局限性,例如仅爬取了部分区域的房产数据,且未对房产的图片和视频内容进行分析。在未来的工作中,我们可以进一步优化爬虫程序,爬取更多区域的房产数据,并深入分析房产的多媒体内容、用户行为模式等,为购房者和房地产从业者提供更有价值的数据支持。

u014481728的博客 1368

Kubernetes operator(五)api 和 apimachinery 篇

本文是 Kubernetes operator学习 系列第五篇,主要对 k8s.io/api 和 k8s.io/apimachinery 两个项目 进行学习

a1369760658的博客 1834

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

k8s编程operator实战之云编码平台——③Code-Server Pod访问实现

在上一节中实现了controller的逻辑,可以通过grpc来创建、删除工作空间以及查询信息。接下来要实现的就是如何访问到工作空间,我们就采用反向代理的方式,反向代理服务器就使用nginx。 openresty是一个基于nginx和luajit的web平台,我们可以通过它来实现动态的反向代理。接下来将会逐步实现。

Peerless__的博客 1631

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【K8S】深入讲解 Kubernetes Operator 设计模式

Operator 架构与设计模式 Operator 是将复杂应用的运维知识编码为 Kubernetes 控制器的技术方案,通过声明式 API(CRD)自动化操作流程。其核心架构包含 CRD、Controller、Webhook 等组件,由 Manager 协调运行。关键设计模式包括: 调和循环:通过 Reconcile 函数对齐期望状态与实际状态 资源管理:使用 CreateOrUpdate 确保子资源符合声明 Finalizer 机制:实现资源删除前的优雅清理 状态管理:通过 Conditions 记录运

NeoLshu的博客 1482

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

k8s编程operator——(1) client-go基础部分

client-go是一个golang的client,我们可以通过client-go与K8S apiServer进行交互,对k8s集群中资源对象,包括内置资源(例如:Pod、Deployment、Service等)和CRD进行增删改查等操作。client-go地址目录结构:该包包含了可以访问kubernetes集群的api,通过这些API可以与apiServer进行通信,对集群的资源对象进行增删改查。

Peerless__的博客 5871
上一篇: k8s编程operator——(4) kubebuilder & controller-runtime源码分析
下一篇: k8s编程operator实战之云编码平台——②controller初步实现
CoreDump丶
博客等级 码龄8年 451粉丝 70原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值