用 Go 從零開(kāi)發(fā)一個(gè) k8s 應(yīng)用管理工具

kustz
的設(shè)計(jì)思想和定義
kustz 的一個(gè)核心理念就是 語(yǔ)義話, 換句話說(shuō)就是具有 可讀性 高, 見(jiàn)名知義。

力求 kustz.yml 之于 應(yīng)用, 就像 域名 至于 IP。

對(duì)于一個(gè)服務(wù)應(yīng)用來(lái)說(shuō), 所有的定義都在同一個(gè)配置文件里面, 不再割裂。

從 kustz 的完整配置 中可以看到, 主要的參數(shù)都進(jìn)行了 語(yǔ)義化 的處理和簡(jiǎn)化, 更貼近生活語(yǔ)言。

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" # 隨機(jī) 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
既然現(xiàn)在的工具滿足不了我們, 我們就自己抽象一層, 自己實(shí)現(xiàn)一個(gè)工具。

使用方式
kustz 使用 cobra 實(shí)現(xiàn)命令功能。

$ kustz -h
快速定義 k8s 應(yīng)用配置

Usage:
  kustz [flags]
  kustz [command]

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  default     在屏幕上打印 kustz 默認(rèn)配置
  help        Help about any command
  render      讀取 kustz 配置, 生成 kustomize 所需文件

Flags:
  -h, --help   help for kustz

Use "kustz [command] --help" for more information about a command.
目前實(shí)現(xiàn)了兩個(gè)子命令

default: 在屏幕上打印 kustz 默認(rèn)配置, 可以通過(guò)重定向符號(hào)保存到文件中。
render: 讀取 kustz.yml 配置文件, 并渲染成對(duì)應(yīng)的 Config API
使用 demo

# 1. 生成配置文件
$ kustz default > myapp.kustz.yml
# 2. 修改配置文件
$ vi myapp.kustz.yml
# 3. 渲染配置文件
$ kustz render -c myapp.kustz.yml
# 4. 使用 kustomize 發(fā)布。
$ kubectl apply -k .
為什么會(huì)有
kustz
你有沒(méi)有想過(guò), 如果要在 kubernetes 集群中 發(fā)布 一個(gè)最基本的 無(wú)狀態(tài)服務(wù), 并 提供 給用戶訪問(wèn), 最少需要配置幾個(gè) K8S Config API ?

Deployment: 管理應(yīng)用本身。
Service: 管理應(yīng)用在集群內(nèi)的訪問(wèn)地址, 也是應(yīng)用在在集群累的負(fù)載均衡器。
Ingress: 管理應(yīng)用對(duì)外暴露的入口, 通俗點(diǎn)說(shuō), 就是 URL。
前三個(gè)是最基本的的 API。

如果還有配置文件或或者其他密鑰管理, 可能你還需要。

Secret / ConfigMap: 管理應(yīng)用配置。
這些配置文件的存在, 本身都獨(dú)立存在, 并沒(méi)什么關(guān)系。

為了讓他們?cè)谝黄穑?你還需要定義 Label 信息, 并且通過(guò) LabelSelector 將他們組合起來(lái)。

只是將這些 Config API 文件組合在一起, 都是一件麻煩事情了。這還不包括各個(gè) Config API 本身的復(fù)雜結(jié)構(gòu), 以及不同版本之間的差別。

社區(qū)也注意到這件事情了, 有很多工具幫我們組合管理, 例如我們今天要說(shuō)的 Kustomize。

除此之外, 還有微軟和阿里云一起搞的 Open Application Model(簡(jiǎn)稱 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
更多參數(shù), 可以到 kustomize 官網(wǎng) 查看。

可以看到 kustomize 也只是幫我們完成了文件的組合, 并沒(méi)有解決 Config API 復(fù)雜結(jié)構(gòu)的問(wèn)題。

開(kāi)源倉(cāng)庫(kù)
所有代碼都已經(jīng)過(guò)開(kāi)源在 Github: https://github.com/tangx/kustz 閱讀過(guò)程中, 可以直接可以參考代碼。

每一章節(jié)都都對(duì)應(yīng)一個(gè) TAG , 如果需要跟著練習(xí)實(shí)現(xiàn), 可以按照每個(gè) TAG 查看變更。


請(qǐng)前往:http://lygongshang.com/TeacherV2.html?id=365