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 工作原理

主要分成 baseoverlays

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 物件,叫做 configmapGeneratorsecretGenerator,這兩個功能是類似的

當中有一個參數 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 來進行管理感覺還不錯,透過不同的資料夾可以快速知道不同版本的差異


參考資料: