4- kustomize 簡明教程

在上一篇文章當中我們瞭解了 kubebuilder 的基本使用方法,通過 kubebuilder 實現了一個簡單的 operator 並運行了起來。雖然整個程序跑起來了,但是還是存在着一些疑惑,除了上篇文章有提到過的 controller-gen 之外,makefile當中還大量存在了 kustomize 這樣的命令,kustomize是什麼,有什麼用,怎麼用?今天我們就一起來學習一下,在後續的文章當中,我們還會用到一些 kustomize 特性來部署不同的環境。

簡介

kustomize 是一個通過 kustomization 文件定製 kubernetes 對象的工具,它可以通過一些資源生成一些新的資源,也可以定製不同的資源的集合。

一個比較典型的場景是我們有一個應用,在不同的環境例如生產環境和測試環境,它的 yaml 配置絕大部分都是相同的,只有個別的字段不同,這時候就可以利用 kustomize 來解決,kustomize 也比較適合用於 gitops 工作流。

bespoke config workflow image

如上圖所示,有一個 ldap 的應用,/base目錄保存的是基本的配置,/overlays裏放置的不同環境的配置,例如 /dev/staging/prod這些就是不同環境的配置,/base等文件夾下都有一個 kustomization .yml 文件,用於配置。

執行 kustomize build dir的方式就可以生成我們最後用於部署的 yaml 文件,也就是進行到了我們上圖的第四步,然後通過 kubectl apply -f命令進行部署。

安裝

使用 kubebuilder 我們不需要額外進行安裝,因爲在執行相關 make 命令的時候,會自動下載可執行文件到 bin/ 目錄下

如果本地有 go 環境,可以執行下列命令進行安裝

GOBIN=$(pwd)GO111MODULE=on go get sigs.k8s.io/kustomize/kustomize/v3

除此之外也可以使用對應操作系統的包管理器進行安裝,例如 mac 可以使用 brew 進行安裝

除了直接使用 kustomize 命令外,kubernetes 自 v1.14 之後也可以使用 kubectl kustomize的方式執行 kustomize

佈局

├── base
│   ├── deployment.yaml
│   ├── kustomization.yaml
│   └── service.yaml
└── overlays
    ├── dev
    │   ├── kustomization.yaml
    │   └── patch.yaml
    ├── prod
    │   ├── kustomization.yaml
    │   └── patch.yaml
    └── staging
        ├── kustomization.yaml
        └── patch.yaml

一個常見的項目 kustomize 項目佈局如上所示,可以看到每個環境文件夾裏面都有一個 kustomization.yaml 文件,這個文件裏面就類似配置文件,裏面指定源文件以及對應的一些轉換文件,例如 patch 等

kustomization.yml

一個常見的 kustomization.yml 如下所示,一般包含 apiVsersionkind 兩個固定字段

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- manager.yaml

configMapGenerator:
- files:
  - controller_manager_config.yaml
  name: manager-config

kustomize 提供了比較豐富的字段選擇,除此之外還可以自定義插件,下面會大概列舉一下每個字段的含義,當我們需要用到的時候知道有這麼個能力,然後再去 Kustomize 官方文檔 查找對應的 API 文檔就行了

總結

看到 Kustomize 我的第一反應是這個東西和 helm 有什麼區別,Kustomize 沒有模板語法,只需要一個二進制命令就可以生成對應的 yaml 文件非常的輕量,而 helm 支持 GoTemplate,組件上也要多一些,並且 helm 通過 chart 包來進行發佈相對來說還是要重量級一些。個人覺得 Kustomize  更適合做 gitops 而 helm 更合適做應用包的分發。

參考文獻

[^1]: Kustomize 官方文檔 https://kubectl.docs.kubernetes.io/zh/guides/

[^2]: 使用 Kustomize 對 Kubernetes 對象進行聲明式管理 https://kubernetes.io/zh/docs/tasks/manage-kubernetes-objects/kustomization/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/JDsDOYaACgyt97-Nz5ScDw