很高兴给大家介绍我的两个开源项目:
也会讲述一些我如何把开源与商业化结合的一些有意思的事~
从云原生说起
如果现在你的应用还没有跑在容器里,那确实应该反思一下了,互联网巨头的技术往往是风向标,他们落地容器是有它的道理的。
Docker出现之前,比如你要装个mysql,就需要关心环境是怎么样的,安装工具是啥,依赖工具有哪些以及一系列安装过程,我是真的见过装mysql一个星期装不上的公司,Docker把这一切封装到镜像中,此时不管你安装啥都是docker run ... 细节全部被屏蔽了,就和你的老板告诉你“我只想要结果”一样,你不再需要关心你不想知道的过程。
那为什么还需要kubernetes?Docker很好的解决了单个应用的封装问题,但是如今大部分应用都是分布式的,有非常复杂的组件依赖,组件之间如何协作都是问题。 所以kubernetes像是一个云操作系统,对下抽象计算/存储/网络这些资源,对上管理应用生命周期,帮助应用服务发现,管理应用配置等等。
脚本时代
我之前在一家TOP级的AI上市公司工作,虽然该公司有在用容器的,但是整个公司容器的普及率不到10%。我从事这个领域比较早,当时安装kuberentes非常复杂,一个6k多行的脚本在等着你,而且那时候官方还没有一个高可用教程。
所以我就写了个脚本,解决安装问题,后来一想我用的到别人应该也用的到,就脑洞一开把它放到了阿里云市场上:
一放不得了,发现火了:
image.png
这么个破玩意儿居然有很多人买,多的时候甚至一天有大几十人购买。 但是接着问题就来了,问题一大堆,几乎没有哪个一次性就装成功的,我的维护成本变的极其高。 image.png
我这个时候意识到,把东西做优质的重要性,否则就会完全陷入到无尽的售后答疑问题中,此时我决定彻底优化!
开源ansible版本
只是shell的版本得在每台机器上一通操作,这个体验显然不太好,那当时就想着只需要在主节点上执行一下就能把集群安装上,所以就开始写ansible play book.
然而,依旧还是有很多问题,因为首先sealos的很多用户就卡在了ansible安装上,需要先装python再装ansible再跑play book,还不一定能跑成功,就很烦,问题依旧没减少。
所以我先解决环境问题,把ansible放到了docker里,然而用户就得先装docker。。。 没完没了了。。。
所以必须改变,必须彻底重构,由此我完全用golang写了一个新的版本。
开源golang版本
这个版本在当时确实把安装做到了极致,诠释了什么是大道至简,一个新机器三条命令完全解决:
# 下载并安装sealos, sealos是个golang的二进制工具,直接下载拷贝到bin目录即可, release页面也可下载
$ wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/latest/sealos && \
chmod +x sealos && mv sealos /usr/bin
# 下载离线资源包
$ wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/05a3db657821277f5f3b92d834bbaf98-v1.22.0/kube1.22.0.tar.gz
# 安装一个三master的kubernetes集群
$ sealos init --passwd '123456' \
--master 192.168.0.2 --master 192.168.0.3 --master 192.168.0.4 \
--node 192.168.0.5 \
--pkg-url /root/kube1.22.0.tar.gz \
--version v1.22.0
这种东西哪怕是一个连kubernetes都不会拼写的开发者我相信他也能很快的把集群部署起来,这让我非常满意。
sealos有趣的商业化
很难想象sealos是一个拥有大几千付费用户的,我们把源码与资源包分开,资源包里是各种版本kubernetes依赖的二进制,镜像等东西,我们写了个网站把这些资源包放在上面售卖:
image.png
当然我们会提供一些免费版本供开发者做测试,学习什么的。
这也给各位做开源的朋友提供一种变现思路哈。
并不是广告,不指望这个东西能挣多少钱,但是我觉得开源与商业是左右腿,缺一不可,完美结合往往有意想不到的效果。
取之于民 用之于民
网站的所有收入会反馈给开发者,以形成良性循环,sealos非常有意思的一个事情是给sealos贡献几乎都是有偿的
image.png
我们会给每个issue挂上价格
开发者申请任务后可以提供支付宝账号:
image.png
当代码被成功合并后,机器人会自动转账给开发者:
image.png
从未止步
sealos在安装kubernetes这件事上几乎已经做到了大道至简稳如老狗,但是故事并没有结束,依然还有很多值得我反思的事:
我一度很重视用户是如何使用工具的,如何让用户用的简单,但是没有足够重视用户看不到的那一部分东西, sealos金玉其外,败絮其中
sealos代码现在回过头来看,简直一坨*,虽然它work的很好,但是代码结构之烂让它不重构就很难往下继续发展了。
只是安装个集群?格局小了
sealos取这个名字的时候,seal+os,我本期望它能成为云操作系统发型版,奈何它不够争气,在设计上先天不足,比如对mysql,dashboard等这些东西的支持就不友好。
从内往外看问题,而没有从外网内看问题
sealos显然用户定位是云原生生态开发者,这实际上相比广大的开发者并非一个很大的群体,需要提升自己的格局,从一个圈外视角去定义产品,这样可以有更多的受众服务为更多开发者产生价值。sealos在这点上局限了自己。
大胆重构,sealer诞生
sealer的设计哲学非常牛逼,是我从业以来最得意的作品,不仅在使用视角做了高度抽象,实现上也更优雅,每一行代码我都进行仔细review,是在工匠精神诞生的一个优质项目。
开发者想要什么
sealer的核心思想是封装,屏蔽掉那些你不想关心的东西,如:
- 你想要一个高可用mysql:
sealer run mysql-ha:5.7
你不需要关心它是否跑在k8s上,你可以完全不懂k8s - 客户想要安装一个钉钉企业版:
sealer run dingtalk:latest
这样客户才不需要关心钉钉用的数据库是mysql还是pgsql - 当然如果你想装kubneretes:
sealer run kubernetes:v1.19.9
就像你docker run一个centos一样,给你一个k8s环境
这点上Docker的思想是很精髓的,那sealer就相当于把Docker的能力上升到了集群维度,集群封装的都是分布式软件,所以sealer我们称之为“集群镜像”,通过技术手段把整个集群打包,实现分布式软件的 构建/交付/运行。
比如安装一个kubernetes集群,可以简单到令人发指:
sealer run kubernetes:v1.19.9 \
--masters 192.168.0.2,192.168.0.3,192.168.0.4 \
--nodes 192.168.0.5 \
--passwd xxx # ssh的密码
如何做到优雅的封装
受Docker启发,我们把kubernetes看成云操作系统,也采用了写时复制的分层技术,让用户可以通过一个叫Kubefile的东西自定义整个集群:
sealer build -t all-in-one:latest .
就可以build出一个包含mysql redis等服务的集群镜像出来了。
即使使用者完全不懂kubernetes也可以使用这个镜像把他想要的服务run起来:
sealer run all-in-one:latest -m x.x.x.x -n x.x.x.x -p xxxx
懂Docker的朋友可以对比一下Docker就很容易理解:
image.png
还有哪些有追求的事
- sealer中我们为了性能自己写了对接公有云的driver,把云服务器申请性能从3min降低到了19秒
- 前端我们完全使用rust+wasm去实现,这块目前是个非常新的领域,我们坚定认为wasm是未来趋势未来会有非常广阔的应用场景
- sealer打包镜像时采用了透明的镜像缓存设计,让用户啥也不用修改就可以把docker镜像缓存到集群镜像中到处交付
- 我们可以适配支持systemd的大部分主流linux系统
- 国产化支持只需要使用不同的镜像即可
总结
个人的开源历程就像一次打怪升级,从一个非常low的脚本一路迭代到各方面非常优秀的项目用了三年多时间,中间不断有新的思考和想法,并把这些想法落地。
集群镜像这个词我才提出来的时候有些人觉得比较虚,甚至比较忽悠,我用半年的时间把东西做出来并真的有客户在生产环境中落地,证明我的想法是对的。
sealos至今已经有4k+ star了,保持了快速的增长,sealer目前是个新项目,我坚信它有成为顶尖开源项目的潜力!
网友评论