Kubernetes kustomize 模板化處理

Gary Ng
7 min readDec 11, 2024

--

我們在撰寫公司 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

參考資源:

--

--

Gary Ng
Gary Ng

Written by Gary Ng

軟體工程師、後端工程師

No responses yet