Go 代码城市上云——KusionStack 实践
导语
KusionStack 是面向 Kubernetes 云原生场景的 IaC 配置代码化实践的开源一站式可编程协议栈。其基本思想是让「应用方+平台方」的同学能够共同基于 IaC 构建的 Konfig 模型库同一平面进行 DevOps 协同工作。今天我们和大家分享一个好玩的 Go 代码城市应用,以及 KusionStack 是如何一键将其部署到 K8s 云原生环境的。
KusionStack 项目主仓库:
https://github.com/KusionStack/kusion
PART. 1
什么是代码城市(CodeCity)
CodeCity 代码城市是瑞典工程师 Richard Wettel 开发的创意应用,可以通过类似数字城市的视觉形式展示和度量代码的复杂性。其效果如图:
在 3D 形式展示的代码城市中的中心地标非常直观——最大、最高的建筑总是容易追踪的焦点。因为这个极具特色的创意,CodeCity 获得了 2008 年的"Riconoscimento ated-ICT Ticino" 一等奖,同时也可以免费用于非商业的科研和学习用途。
今天要展示的 GoCity 是 Go 语言版本的代码城市,我们可以通过这种方式评估 KusionStack 等 Go 语言项目的代码复杂度。也可以通过在线的 GoCity 查看 KusionStack/kusion 仓库的展示效果。
PART. 2
本地执行 GO 代码城市
之前的 GoCity 还是在 2021 年 10 月更新的,在最新的 Docker 和 Go1.18 环境有一些小问题,还好 KusionStack 相关同学为其提交了补丁进行了修复(这也是开源项目的魅力所在,也希望开源社区小伙伴能够参与 KusionStack 的共建),现在可以执行以下命令安装:go install github.com/rodrigo-brito/gocity@latest。然后通过 gocity open 打开 Github 或本地仓库。
- 比如打开本地的 KusionStack/kusion 仓库
- 然后浏览器打开对应页面
本地执行一切正常!
PART. 3
Go 代码城市一键上云
作为一个类似数字城市的应用,在云原生、元宇宙等背景下,部署上云也是一个自然的需求。同时我们也希望通过 GoCity 展示下 KusionStack 的基本用法。在 GoCity 上云之前,我们先尝试如何本地执行该应用。
相应的容器镜像已经推送到 Docker Hub_https://hub.docker.com/r/yuanhao1223/gocity_,运行命令如下:
运行成功后,可打开本地地址_[http://localhost:4000/](http://localhost:4000/)_查看 Go 项目的数字城市 3D 效果。
容器化成功后,现在准备上云。从本地执行容器的方式可以看出,想要在 Kubernetes 部署,至少需要 Deployment 和 Service 两种资源。其中 Deployment 用来部署 Go 代码城市,Service 暴露端口,访问无状态应用。
首先参考安装文档_[https://kusionstack.io/docs/user_docs/getting-started/install/](https://kusionstack.io/docs/user_docs/getting-started/install/)_安装好本地 Kusion 命令,然后通过 kusion init 的在线仓库提供了相应的模板。Kusion 命令支持一键初始化配置: kusion init --online
输出类似以下信息:
为了方便展示,Kusion 模板已经内置了 CodeCity 的例子。其中 code-city 模板依赖 konfig 大库中抽象化的前/后端模型,code-city 模板无依赖,可以自闭环。我们选择后者:
初始化过程中,指定了容器镜像,并且容器端口和 Service 端口均为 4000,现在进入配置目录,目录结构如下:
- 完整的代码可以参考 :
https://github.com/KusionStack/kusion-templates/tree/main/code-city-demo
为了方便本地测试,可以通过 minikube start 本地启动 MiniKube 服务。然后命令行模式切换到 code-city-kcl 目录,然后执行 kusion apply 命令生效配置。到此,开始正式上云: kusion apply main.k
输出类似于:
检查 Deployment 的状态:
输出类似于: NAME READY UP-TO-DATE AVAILABLE AGEgocity 1/1 1 1 85s
使用 kubectl 端口转发: kubectl port-forward svc/gocity 4000:4000
访问本地地址_(https://localhost:4000/)_,点击 Example 处的链接 “KusionStack/kusion”,可以看到和本地执行一样的效果:
至此,完成了 Go 代码城市的一键上云。有兴趣的读者,可以基于模型库 Konfig,选择其他模板,探索 KusionStack 支持的其它运维场景,下面我们将探索代码城市内部的原理。
PART. 4
认识数字城市中的建筑含义
说实话代码城市第一眼看上去更像一个电路板,要理解其中的含义需要了解几个基本的参数映射关系,如预览页面的右下角图所示:
以上的对应关系在其官方文档中也说明,如下图所示:
其中地面的粉红色表示 Go 包对应的目录(因为包的依赖关系可能再产生叠加),灰色表示目录内部的文件,而蓝色表示结构体。其中表示文件的灰色建筑物的大小即文件的大小,表示结构体的蓝色建筑物的高度即方法的数量,建筑物的长宽表示结构体中属性的数量,蓝色颜色的深度表示相关代码行数。
我们可以选择 DiffOptions 结构体对应建筑物查看其相关的属性参数:
可以看到该结构体中有 15 个属性、3 个方法、共 156 行代码。通过点击其中的 “Github 链接” 按钮可以跳转到对应的位置:
因此通过这种方式我们可以很容易查看全局有无特别高大的建筑,从而判断是否存在某些文件和结构体的代码需要改进。可以说 GoCity 是一个很有趣的代码分析工具,甚至可以集成到 Github PR 代码评审流程中。
PART. 5
分析 GoCity 的代码架构
GoCity 代码架构主要分为代码数据提取和前端模型展示两块,如图所示:
首先 Codebase 表示要展示的代码,通过 Git Service 被拉取,然后通过 Parser 和 Position 服务提取得到对应的参数信息,然后通过前端展示。Go 语言代码主要集中在模型数据提取部分,而前端展示主要为 JS 等实现。前端展示资源文件通过 embed.FS 内嵌到程序中,GoCity 命令启动 Web 服务展示页面。代码架构比较清晰,也是一个比较理想可用于 Go 语言学习的开源项目。
PART. 6
展望
我们通过 KusionStack 的方式,配合少量的 KCL 配置代码,完成了 Go 代码城市一键上云的操作。虽然云上的 Go 代码城市和本地的版本看不出什么区别,但是云上程序的整个生命周期管理将大为不同。在后面的例子中我们将展示如何通过 KusionStack 结合 KCL 配置语言进行 IaC 方式的云原生应用的运维操作。感谢关注🙏
参考链接
● https://github.com/KusionStack/kusion
● https://github.com/KusionStack/examples
● https://github.com/rodrigo-brito/gocity
● https://wettel.github.io/codecity.html
了解更多...
KusionStack Star 一下✨:
https://github.com/KusionStack/Kusion
本周推荐阅读
欢迎扫码关注我们的公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
记录一次数据库CPU被打满的排查过程
1 前言 近期随着数据量的增长,数据库CPU使用率100%报警频繁起来。第一个想到的就是慢Sql,我们对未合理运用索引的表加入索引后,问题依然没有得到解决,深入排查时,发现在 order by id asc limit n时,即使where条件已经包含了覆盖索引,优化器还是选择了错误的索引导致。通过查询大量资料,问题得到了解决。这里将解决问题的思路以及排查过程分享出来,如果有错误欢迎指正。 2 正文 2.1 环境介绍 2.2 发现问题 22日开始,收到以下图1报警变得频繁起来,由于数据库中会有大数据推数动作,数据库CPU偶尔报警并没有引起对该问题的重视,直到通过图2对整日监控数据分析时,才发现问题的严重性,从0点开始,数据库CPU频繁被打满。 图1:报警图 图2:整日CPU监控图 2.3 排查问题 发现问题后,开始排查慢Sql,发现很多查询未添加合适的索引,经过一轮修复后,问题依然没有得到解决,在深入排查时发现了一个奇怪现象,SQL代码如下(表名已经替换),比较简单的一个单表查询语句。 SELECT * FROM test WHERE is_delete = 0 AND b...
- 下一篇
开源交流丨任务or实例 详解大数据DAG调度系统Taier任务调度
课件获取:关注公众号 “数栈研习社”,后台私信 “Taier” 获得直播课件 视频回放:点击这里 ChunJun 开源项目地址:github 丨 gitee 喜欢我们的项目给我们点个__ STAR!STAR!!STAR!!!(重要的事情说三遍)__ 技术交流钉钉 qun:30537511 前言 在分享之前,先为大家介绍一下任务和实例的关系。任务指的是我们在任务开发界面上去创建的任务,比如Spark任务、SparkSQL任务、数据同步任务等,这些任务在开发过程中是静态的脚本,当被提交到计算节点去执行时,被执行的过程我们把它抽象成实例。举一个简单的例子来说明:比如我们写完一个Java的类然后把它打包成Jar包,其实这个Jar包就是一个静态类,当我们执行Jar包时,这个过程我们会把它抽象成一个实例,这就是任务与实例的关系。 Taier实例生成 1、Taier实例类型 首先我们来看一下Taier实例的类型,在Taier中实例主要有3种类型: 周期实例:T+1生成,完整依赖 补数据实例:立即生成,局部依赖 临时运行实例:立即生成,无依赖 ● 周期实例 周期实例是指在前一天生成的当天实例(T+1)...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装