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