用 Go 从零开发一个 k8s 应用管理工具
kustz
的设计思想和定义
kustz 的一个核心理念就是 语义话, 换句话说就是具有 可读性 高, 见名知义。
力求 kustz.yml 之于 应用, 就像 域名 至于 IP。
对于一个服务应用来说, 所有的定义都在同一个配置文件里面, 不再割裂。
从 kustz 的完整配置 中可以看到, 主要的参数都进行了 语义化 的处理和简化, 更贴近生活语言。
Deployment API 定义
## 1. k8s Deployment API 定义
name: nginx
image: docker.io/library/nginx:alpine
replicas: 2
envs:
pairs:
key1: value1
configmaps:
- srv-webapp-demo-envs:true
resources:
cpu: 10m/20m
memory: 10Mi/20Mi
nvidia.com/gpu: 1/1
probes:
liveness:
action: http://:8080/healthy
Service API 定义
## 2. k8s Service API 定义
ports:
- "80:8080" # cluster ip
- "udp://!9998:8889" # 随机 nodeport
# - "!20080:80:8080" # 指定 nodeport
k8s Ingress API 定义
## 3. k8s Ingress API 定义
ingress:
rules:
- http://api.example.com/ping?tls=star-example-com&svc=srv-webapp-demo:8080
既然现在的工具满足不了我们, 我们就自己抽象一层, 自己实现一个工具。
使用方式
kustz 使用 cobra 实现命令功能。
$ kustz -h
快速定义 k8s 应用配置
Usage:
kustz [flags]
kustz [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
default 在屏幕上打印 kustz 默认配置
help Help about any command
render 读取 kustz 配置, 生成 kustomize 所需文件
Flags:
-h, --help help for kustz
Use "kustz [command] --help" for more information about a command.
目前实现了两个子命令
default: 在屏幕上打印 kustz 默认配置, 可以通过重定向符号保存到文件中。
render: 读取 kustz.yml 配置文件, 并渲染成对应的 Config API
使用 demo
# 1. 生成配置文件
$ kustz default > myapp.kustz.yml
# 2. 修改配置文件
$ vi myapp.kustz.yml
# 3. 渲染配置文件
$ kustz render -c myapp.kustz.yml
# 4. 使用 kustomize 发布。
$ kubectl apply -k .
为什么会有
kustz
你有没有想过, 如果要在 kubernetes 集群中 发布 一个最基本的 无状态服务, 并 提供 给用户访问, 最少需要配置几个 K8S Config API ?
Deployment: 管理应用本身。
Service: 管理应用在集群内的访问地址, 也是应用在在集群累的负载均衡器。
Ingress: 管理应用对外暴露的入口, 通俗点说, 就是 URL。
前三个是最基本的的 API。
如果还有配置文件或或者其他密钥管理, 可能你还需要。
Secret / ConfigMap: 管理应用配置。
这些配置文件的存在, 本身都独立存在, 并没什么关系。
为了让他们在一起, 你还需要定义 Label 信息, 并且通过 LabelSelector 将他们组合起来。
只是将这些 Config API 文件组合在一起, 都是一件麻烦事情了。这还不包括各个 Config API 本身的复杂结构, 以及不同版本之间的差别。
社区也注意到这件事情了, 有很多工具帮我们组合管理, 例如我们今天要说的 Kustomize。
除此之外, 还有微软和阿里云一起搞的 Open Application Model(简称 OAM)。
Kustomize
下面是 kustomize 最基本的配置文件 kustomization.yaml
# kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: demo-demo
resources:
- deployment.yml
- service.yml
- ingress.yml
configMapGenerator:
- name: my-application-properties
files:
- application.properties
更多参数, 可以到 kustomize 官网 查看。
可以看到 kustomize 也只是帮我们完成了文件的组合, 并没有解决 Config API 复杂结构的问题。
开源仓库
所有代码都已经过开源在 Github: https://github.com/tangx/kustz 阅读过程中, 可以直接可以参考代码。
每一章节都都对应一个 TAG , 如果需要跟着练习实现, 可以按照每个 TAG 查看变更。