背景
最近需要部署一个 pig 到 k3s 环境,想尝试用最近很火的 Helm chart 包的方式部署。粗浅的看了一下 Helm 官方文档制作 Helm chart 包,真是倒吸了一口凉气,k8s 都还没玩明白呢,还得编 yaml 、建模版,这不为难人嘛。想到 helm 既然这么火了,会不会有什么工具可以实现生成 Helm Chart 包,于是就换个思路 --- "找工具",功夫不负有心人,这样的工具还真有一个,那就是 Rainbond。
项目简介
Rainbond 本身是一个云原生应用管理平台,使用简单,上手容易,不需要懂容器、只需要提供源代码或者镜像就能将自己的业务部署在集群中 ;而且我们现在只需要把 Pig 部署到 Rainbond 上,就能快速导出一个 Helm Chart 包。不仅如此,还能导出Docker Compose、非容器包等,在别的环境部署也很方便。下面简单了解下如何利用 Rainbond 导出 Helm Chart 包吧。
安装平台
官网首页提供了一个快速安装的方案,五分钟便可搭建出一个 Rainbond 平台,快速安装的工作方式是将k3s 和控制台同时封装在一个dind的镜像里,让你以最简单最快捷的方式部署一套可视化集群环境;因为我需要对接我自己的 k3s 集群,所以我是按照基于 k3s 安装对接的文档进行部署的。
部署 Pig
平台部署很快,基本用 helm install 就能快速部署完,按照使用文档,我发现 Rainbond 提供了一个开源应用商店,包含了上百个开源应用,甚至我在里面找到了 Pig 这个应用,安装之前需要对接应用商店,之所以需要对接是因为应用商店支持把自己的应用发布上去给别人使用,这个还是蛮有意思的,感兴趣的可以去了解一下Rainbond 应用商店。
对接完应用商店后,只需要找到 Pig 应用,点击安装。便将其部署到了我的k3s集群中。这个部署体验很友好,和我在手机上安装应用一样,不需要任何额外的配置,安装完就能访问。我甚至不需要再去了解 service、ingress 等怎么配置了,而且各个微服务的状态和相互之间的依赖关系也很明确。下面是安装完成后的效果。
如果应用商店找不到你的应用也没关系,平台提供的部署方式有很多,可以通过源码、镜像、yaml、helm 等方式部署你的业务,即使你不懂 Docker、不会写 Dockerfile、不会 k8s 、不会打包镜像,你只需要提供你的源码,照样可以让你的服务上云。
到这里我好像已经达成了我最初的目标,只是点了下安装就部署完了 Pig,而且也可以使用了。不过我今天主要的目标还是制作出一个 Helm Chart 包,以便于在其他 K8s 环境中快速部署。毕竟不是所有的环境我都可以先装一个 Rainbond 的,相对而言,Helm Chart 在所有的 K8s 环境中会更加通用。下面我将会详细介绍如何利用 Rainbond 导出对应的 Helm Chart 包。
导出 Helm Chart 包
在 Rainbond 中,导出 Chart 包的前提条件是应用必须正常在 Rainbond 上运行,相当于我们在部署业务的同时,就是在写这个应用的模版,而且还验证了这个应用的可用性,不会存在说 Chart 包写完了,结果再一测试,各种报错的问题。
而要把业务部署到 Rainbond 上,也比较简单,除了我刚刚直接从应用市场安装的体验,它还支持源代码不写 Dockerfile 直接部署运行起来。而运行起来后,需要把应用发布成 Rainbond 的应用模版,这个模版可以简单的理解为记录了有哪些业务模块,之间关系是什么,但是它不包含具体实现,相当于一个中间层。它往前衔接了应用的基础信息和元数据,往后可以通过这些信息导出不同格式的包。下面是我整理的一个完整的导出流程图:
发布应用模版
所以在我刚刚部署好的 Pig 应用下,我可以将其发布成 Rainbond 的应用模版,这个发布也都是可视化页面进行配置。在发布模版页面我们可以看到应用的所有服务以及服务之间的依赖信息,还可以对这些配置的默认值进行调整。这里发布完成后,就会将 Rainbond 应用模版存到它的一个本地仓库中,后续都可以基于这个模版安装或导出各种格式的包。
生成 Helm Chart 包
接下来在我的本地组件库中,就能看到 pig 应用模版,然后选择导出 Helm Chart 包,导出按键的位置在右边三个点那里。导出成功后直接下载即可,至此,一个完整的 Helm Chart 包便制作完成。
Chart 包结构与配置
pig-1.0-helm
├── pig
│ ├── Chart.yaml
│ ├── templates
│ │ ├── Deployment.yaml
│ │ ├── Secret.yaml
│ │ ├── ...
│ │ ├── StatefulSet.yaml
│ │ └── Service.yaml
│ └── values.yaml
├── plugin-images.tar
└── component-images.tar
接下来我们可以看看这个自动生成的 Helm Chart 的结构和参数。
-
第一层目录存放的依次是 Helm 的 Chart 包,插件镜像包,workloads 类型资源镜像包,这也太细节了,离线环境也可用。
-
应用中包含的所有资源都会存放在 Helm Chart 包的 templates 目录下(除 ingress 资源)。
-
values.yaml 的默认有两个配置,一个是 imageDomain 用于存放镜像仓库地址;另一个是 storageClass 存放存储所用的 storageClass ,其他可配置组可通过配置组进行添加设置。
测试安装
按照官网的导出文档,将镜像 tar 包解压到我的环境中,然后通过 Helm 安装。
安装命令:
helm install pig ./ -n pig-ns
-------------------
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
NAME: pig
LAST DEPLOYED: Wed Jul 26 14:31:03 2023
NAMESPACE: pig-ns
STATUS: deployed
REVISION: 1
TEST SUITE: None
同时,安装下来的应用会自动将对外服务通过 NodePort 的方式暴露出来,不过需要通过命令查看一下暴露的端口,例如下面的 30589 便是对外暴露的服务端口。
kubectl get svc -n pig-ns|grep NodePort
----------
grf67d69-27-80out NodePort xxx 80:30589/TCP 5m37s
通过ip + 端口访问便可以看到页面了,非常Nice!
结尾
本次分享到这里也就结束了,祝大家用得开心,有问题可以去 GitHub 提 Issues,也可以在他们官网加交流群沟通。