在 kubernetes 官網 中有看到一個用來管理 kubernetes 的工具,叫做 Kustomize,透過 kustomization 檔案來宣告式 ( Declarative) 管理 kubernetes 物件
安裝 Kustomize
從 kubernetes 1.14 之後就有支援 kustomization 檔案
kubectl kustomize DIR [flags] [options]
DIR 目錄下,必須有 kustomization 檔案,名稱可以為下列三個其中一個
kustomization.yaml
kustomization.yml
Kustomization
但是也可以獨立安裝 kustomize-cli,其他安裝方式請看 here
brew install kustomize
Kustomize 工作原理
base 會透過 kustomization 檔案定義使用的哪些 kubernetes 物件
overlays 也會透過 kustomization 檔案定義要使用哪個 base,並在 base 上新增補丁 (Patch),如果在 base 上有該資源的話就複寫,如果沒有的話就新增
資料夾結構如下
.
├── base
│ ├── configMap.yaml
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ └── service.yaml
└── overlays
├── dev
│ ├── index2.html
│ └── kustomization.yaml
└── prod
├── kustomization.yaml
└── replica_count.yaml
部署 Kustomize 資源
有兩種方式部署到 kubernetes 中
使用 kustomize build
會產生 kubernetes 物件,然後在 apply 到 kubernetes 中
kustomize build DIR | kubectl apply -f -
或是使用 kubectl apply
搭配 -k
或 --kustomize
參數即可
kubectl apply -k DIR
Kustomize HelloWorld Example
範例 repo
建立 base
在 base 資料夾中有三個 kubernetes 物件及一個 kustomization 檔案
部署 base 資源
kubectl apply -k base/
查看一下剛部署的資源
kubectl get -k base/
NAME DATA AGE
configmap/index 1 14m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx ClusterIP 10.96.75.87 <none> 8080/TCP 14m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx 1/1 1 1 14m
確認一下功能是否正常
curl 10.96.75.87:8080/index.html
this is index.html
有成功吃到 configMap 的檔案
建立 overlays
overlays 中有兩個版本 (dev 及 prod),在 dev 中會多掛載 index2.html
檔案,在 prod 中會調整 replica 數量
先部署 prod 版本
kubectl apply -k overlays/prod
查看一下剛部署的資源
kubectl get -k overlays/prod
NAME DATA AGE
configmap/prod-index 1 24s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/prod-nginx ClusterIP 10.96.19.201 <none> 8080/TCP 24s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/prod-nginx 3/3 3 3 24s
會看到除了每個資源有 prefix 外,replica 數量從原本 1 變成 3
configmapGenerator & secretGenerator
kustomize 有提供產生 configmap 及 secret 的 kubernetes 物件,叫做 configmapGenerator 及 secretGenerator,這兩個功能是類似的
當中有一個參數 behavior
可以允許 overlays 修改或替換已存在的 configmap 或是 secret,這邊就用 dev 版本演示一下
部署 dev 版本
kubectl apply -k overlays/dev
查看一下剛部署的資源
kubectl get -k overlays/dev
NAME DATA AGE
configmap/dev-index 2 10s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dev-nginx ClusterIP 10.96.133.249 <none> 8080/TCP 10s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/dev-nginx 1/1 1 1 10s
會發現 configmap data 數量變成兩個
確認一下功能是否符合預期
curl 10.96.133.249:8080/index.html
curl 10.96.133.249:8080/index2.html
this is index.html
this is index2.html
想看更多範例,可以參考 kustomize repo 中 範例
後記
用 kustomize 來進行管理感覺還不錯,透過不同的資料夾可以快速知道不同版本的差異
參考資料: