我們在撰寫公司 application 的 Kubernets yaml file 的時候,有時可能需要建立 dev, test, prod 等多個不同的環境,且不同的環境所使用的 yaml file 又大同小異,通常最直接的做法就是在每個環境重新撰寫一份 yaml file,但是這樣同時要維護多份,且要有一個環境要修改的時候也有可能連同其他環境的配置也需要修改,導致維護的成本過高,為了避免這個問題發生因此誕生了今天的主題 kustomize,他的主要目的就是避免我上述所說的問題發生。
Kustomize 的組成通常為 Base + Overlay 且有點類似 Linux 的 sed 做 configuration 的 replace。
現在 kustomize command 已經跟 kubectl 綁在一起了,可以透過以下指令查看 kustomize 的版本
kubectl version
所以要下指令的話如下:
kubectl kustomize ....
也可以直接安裝 kustomize 指令
brew install kustomize
指令安裝完畢後接著我們來開始實作一個 base + overlay 的簡單練習,首先 kustomize 結構看起來會像這樣,只是我以下目前尚未建立 overlay
base/deployment.yaml 檔案如下:
以下為建立一個簡單的 nginx deployment 且 replica 數量為 1
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
app: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
service.yaml 如下
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- targetPort: 80
protocol: TCP
port: 80
kustomization.yaml 如下
注意: 假如 kustomization 配置 commonLables 的話則 service 以及 deployment 有關 label 的部分都會變成 commonLabels 所設定的值
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
metadata:
name: app-kustomize
namespace: test-helm
resources:
- deployment.yaml
- service.yaml
執行以下指令可以看到 kustomize 的輸出,但是還不會套用
kubectl kustomize ./webapp/base
overlay 資料夾結構如下, 裡面會存放各個不同的環境設定
develop/kustomization.yaml 如下
以下目標為修改名叫 nginx-deployment 的資源,且使用 deployment.yaml 最 replace
# 名稱的 prefix
namePrefix: develop-
resources:
- ../../base
patches:
- target:
kind: Deployment
name: nginx-deployment
path: deployment.yaml
develop/deployment.yaml 如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2
查看 kustomize 產生出來的內容
kubectl kustomize ./webapp/overlays/develop
發現 develop 的 deployment 的 replicas 數量為 2
參考資源:
kustomization 額外介紹
kustomization 也可以產生 configMap 以及 secret ,可以透過以下產生
secretGenerator:
- name: test-helm-secret
behavior: merge
type: Opaque
literals:
- a=b
name: secret 的名稱
behavior: 當假如 overlay 跟 base 的 secret name 有衝突時,就要指定行為,有 merge、replace 等設定
merge: 將 base 跟 overlay 做合併,主要用於將 base 的某個資料做修改,例如 replica
replace: 使用 overlay 的資料,而 base 的 key 假如在 overlay 不存在的話則會被刪除
helm 與 kustomization 組合技
kustomization 可以再搭配我們前陣子學習的 helm ,可以透過 kustomization 去 patch helm chart 的設定。
常用參數介紹
helmCharts:
- name: <chart name>
repo: <repo url>
releaseName: <release name>
namespace: <namespace>
valuesFile: <value file>
name: helm 的 chart name
repo: helm 所要使用的 repo url
releaseName: helm install 所設定的 release name
namespace: helm install 的時候所指定的 namespace
valuesFile: helm upgrade 的時候配置的 value file
參考資源: