Z.S.K.'s Records

Kubernetes学习(k8s的资源模板生成工具-boilr)

相信在使用k8s的过程中,对于各种资源的操作一定是最多的,社区包括kubernetes本身出了多种模板生成工具,比如helm, kustomize这两种是最常用的,本人也一直在用,但有的场景依然会觉得这两个工具相对较重,helm使用的是gotemplate,而kustomize则又依赖于kubectl,两者都有一定的学习成本且没有交互能力,最近在做的一个小需求是: 如何快速地让开发同学以最简单的方式根据提供的模板生成部署文件,github上发现了个boilr的工具,虽然工具老了点,但是足够地小,功能足够简单,重要的是有交互功能,比较贴合需求

boilr已经很久很久没更新了,很功能上看,boilr也引用了仓库的概念,本人相信boilr的作者是想把这个工具做的很NB

当然,从Readme看,也非常简洁,用法也相对简单

安装

根据readme直接下载二进制文件即可使用

使用

几乎所有的模板系统的生成思路都一样的,根据给定的k-v去替换相应的占位符,boilr也不例外

在使用前,先下载个模板文件,这里就使用官方的例子:

使用之前需要先初始化boilr的相关目录, 默认情况下,会生成/root/.config/boilr/templates目录,这个可以从源代码看到(configuration.go)[https://github.com/zhoushuke/boilr/blob/master/pkg/boilr/configuration.go]

1
boilr init .

然后就可以下载模板目录了

1
boilr template download littlemanco/boilr-k8sservice k8sservice

注意: 因为boilr很久都没有维护了,在download时可能会遇到pkt-line 3: invalid capabilities,这是由于boilr代码里使用的go-git相对于现在来说,版本太旧了,所以可以直接通过git clone 把模板下下来,是一样的效果

通过git clone下载下来后需要把boilr-k8sservice放到/root/.config/boilr/templates目录下

这里最主要的是有个project.json文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{
"Namespace": "product",
"Service": "product",
"Application": "nginx",
"Role": "webserver",
"ApplicationPortProtocol": [
"TCP",
"UDP"
],
"ApplicationPortName": "http",
"ApplicationPort": 80,
"Type": [
"ClusterIP",
"NodePort",
"LoadBalancer"
],
"UsePrometheus": [
"true",
"false"
]
}

通过解析这个文件里的字段进行模板文件的替换,文件中的value都是默认值,如果是列表的话,在交互时可提供选择,还是很方便的

使用以下命令指定使用该模板

1
boilr template use k8sservice /tmp/deploy

后面的/tmp/deploy是最终生成的模板文件保存的目录,我这里修改了点东西

详细的交互输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
以下是详细输出内容:
​```bash
[?] Please choose a value for "module_name" [default: "test-frontend"]: product
[?] Please choose a value for "config_name" [default: "config.yml"]:
[✔] Created deploy/base/configmap.yml.j2
[?] Please choose a value for "registry_host" [default: "{{registry_host}}"]:
[?] Please choose a value for "registry_project" [default: "{{registry_project}}"]:
[?] Please choose a value for "registry_image" [default: "{{registry_image}}"]:
[?] Please choose a value for "registry_tag" [default: "{{registry_tag}}"]:
[?] Please choose a value for "port_number" [default: 8080]:
[?] Please choose a value for "config_path" [default: "/app/services"]:
[✔] Created deploy/base/deployment.yml.j2
[?] Please choose an option for "port_name"
1 - "http"
2 - "grpc"
Choose from 1..2 [default: 1]:
[?] Please choose a value for "port_protocol" [default: "TCP"]:
[?] Please choose a value for "service_type" [default: "ClusterIP"]:
[✔] Created deploy/base/service.yml.j2
[?] Please choose a value for "namespace_name" [default: "prod"]:
[✔] Created deploy/vars/main.yml
[✔] Successfully executed the project template sensespring in /tmp/xpath

dockerfile

通过上面的使用,为了减少对环境的依赖,可以将模板文件打包到镜像中,这样开发同学就可以直接使用镜像进行生成,还是很方便的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM alpine:latest

RUN apk add --no-cache tzdata bash ca-certificates

ADD boilr /usr/local/bin/boilr

RUN mkdir -p /root/.config/boilr && \
chmod +x /usr/local/bin/boilr

ADD templates /root/.config/boilr/templates

WORKDIR /tmp

ENTRYPOINT [ "boilr", "template", "use", "your-template", "/tmp/xpath" ]

# docker build
# docker build --no-cache -t xgenerator:v0.1 .

# docker run
# docker run -it -v /tmp/xpath:/tmp/xpath --rm 1f6d7ed63c0a

通过这种方式,如果模板后续有变动,也可以通过调整镜像的方式推送到开发同学手中,很容易维护,在CI/CD中又打通了一环

源码分析

boilr的源码还是非常清楚的,可能是因为逻辑相对比较简单,本人不是专业开发,理解起来也不是很难.

参考文章:

转载请注明原作者: 周淑科(https://izsk.me)

 wechat
Scan Me To Read on Phone
I know you won't do this,but what if you did?