掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
在上一篇文章當(dāng)中我們了解了 kubebuilder 的基本使用方法,通過 kubebuilder 實(shí)現(xiàn)了一個簡單的 operator 并運(yùn)行了起來。雖然整個程序跑起來了,但是還是存在著一些疑惑,除了上篇文章有提到過的 controller-gen 之外,makefile當(dāng)中還大量存在了 kustomize 這樣的命令,kustomize是什么,有什么用,怎么用?今天我們就一起來學(xué)習(xí)一下,在后續(xù)的文章當(dāng)中,我們還會用到一些 kustomize 特性來部署不同的環(huán)境。

kustomize 是一個通過 kustomization 文件定制 kubernetes 對象的工具,它可以通過一些資源生成一些新的資源,也可以定制不同的資源的集合。
一個比較典型的場景是我們有一個應(yīng)用,在不同的環(huán)境例如生產(chǎn)環(huán)境和測試環(huán)境,它的 yaml 配置絕大部分都是相同的,只有個別的字段不同,這時候就可以利用 kustomize 來解決,kustomize 也比較適合用于 gitops 工作流。
bespoke config workflow image
如上圖所示,有一個 ldap 的應(yīng)用,/base目錄保存的是基本的配置,/overlays里放置的不同環(huán)境的配置,例如 /dev、/staging,/prod這些就是不同環(huán)境的配置,/base等文件夾下都有一個 kustomization .yml 文件,用于配置。
執(zhí)行 kustomize build dir的方式就可以生成我們最后用于部署的 yaml 文件,也就是進(jìn)行到了我們上圖的第四步,然后通過 kubectl apply -f命令進(jìn)行部署。
使用 kubebuilder 我們不需要額外進(jìn)行安裝,因?yàn)樵趫?zhí)行相關(guān) make 命令的時候,會自動下載可執(zhí)行文件到 bin/ 目錄下
如果本地有 go 環(huán)境,可以執(zhí)行下列命令進(jìn)行安裝
- GOBIN=$(pwd)/ GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3
除此之外也可以使用對應(yīng)操作系統(tǒng)的包管理器進(jìn)行安裝,例如 mac 可以使用 brew 進(jìn)行安裝
除了直接使用 kustomize 命令外,kubernetes 自 v1.14 之后也可以使用 kubectl kustomize的方式執(zhí)行 kustomize
- ├── base
- │ ├── deployment.yaml
- │ ├── kustomization.yaml
- │ └── service.yaml
- └── overlays
- ├── dev
- │ ├── kustomization.yaml
- │ └── patch.yaml
- ├── prod
- │ ├── kustomization.yaml
- │ └── patch.yaml
- └── staging
- ├── kustomization.yaml
- └── patch.yaml
一個常見的項(xiàng)目 kustomize 項(xiàng)目布局如上所示,可以看到每個環(huán)境文件夾里面都有一個 kustomization.yaml 文件,這個文件里面就類似配置文件,里面指定源文件以及對應(yīng)的一些轉(zhuǎn)換文件,例如 patch 等
一個常見的 kustomization.yml 如下所示,一般包含 apiVsersion 和 kind 兩個固定字段
- apiVersion: kustomize.config.k8s.io/v1beta1
- kind: Kustomization
- resources:
- - manager.yaml
- configMapGenerator:
- - files:
- - controller_manager_config.yaml
- name: manager-config
kustomize 提供了比較豐富的字段選擇,除此之外還可以自定義插件,下面會大概列舉一下每個字段的含義,當(dāng)我們需要用到的時候知道有這么個能力,然后再去 Kustomize 官方文檔 查找對應(yīng)的 API 文檔就行了
- commonAnnotations:
- app.lailin.xyz/inject: agent
- resources:
- - deploy.yaml
- apiVersion: kustomize.config.k8s.io/v1beta1
- kind: Kustomization
- commonLabels:
- app: bingo
看到 Kustomize 我的第一反應(yīng)是這個東西和 helm 有什么區(qū)別,Kustomize 沒有模板語法,只需要一個二進(jìn)制命令就可以生成對應(yīng)的 yaml 文件非常的輕量,而 helm 支持 GoTemplate,組件上也要多一些,并且 helm 通過 chart 包來進(jìn)行發(fā)布相對來說還是要重量級一些。個人覺得 Kustomize 更適合做 gitops 而 helm 更合適做應(yīng)用包的分發(fā)。
[^1]: Kustomize 官方文檔 https://kubectl.docs.kubernetes.io/zh/guides/
[^2]: 使用 Kustomize 對 Kubernetes 對象進(jìn)行聲明式管理https://kubernetes.io/zh/docs/tasks/manage-kubernetes-objects/kustomization/

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流