用 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 查看变更。


请前往:http://www.mark-to-win.com/TeacherV2.html?id=365