要部署資源到 Kubernetes 中,最困難的是一開始,因為要定義複雜又要排版的 YAML。但之後通常只需要進行較小的更改,例如更新容器 Image 版本、副本數或新的配置值。一種方法是直接修改原始 YAML 檔案進行變更,但這也讓錯誤可能性提高,任何錯誤,例如修改錯誤的位置、不小心刪除內容、輸入錯誤的空白這些都可能造成災難性的後果。而 Kustomize 可用來設定更改更頻繁的參數。其可以降低配置錯誤的範圍。
安裝
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
接下來一步一步來完轉它。
預設上寫好了 Kubernetes 資源。
/day16/helmchartlab/kubernetes$ tree .
.
├── configmap.yaml
├── deployment.yaml
├── service.yaml
└── serviceaccount.yaml
kustomization 檔案應該聲明要部署至 Kubernete 上的資源,以及要應用於它們的任何自定義,例如添加一個通用標籤(Label)等。以下面範例定義了共用 Label、Annotation。
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources: # 要管理的資源
- configmap.yaml
- deployment.yaml
- service.yaml
- serviceaccount.yaml
namespace: day19
buildMetadata:
- managedByLabel
labels:
app.kubernetes.io/name: quarkus-dns
app.kubernetes.io/version: day16
commonAnnotations:
app.quarkus.io/quarkus-version: 3.14.2
app.quarkus.io/createded-by: quarkus
images:
- name: registry.hub.docker.com/cch0124/quarkus-dns
newName: registry.hub.docker.com/cch0124/quarkus-dns
newTag: day16
namePrefix: cch-
replicas:
- name: quarkus-dns
count: 1
新增後資料結構如下
ithome2024lab/day16/helmchartlab/kubernetes$ tree .
.
├── configmap.yaml
├── deployment.yaml
├── kustomization.yaml
├── service.yaml
└── serviceaccount.yaml
0 directories, 5 files
配置好後,可以使用 kustomize build
產生自訂 YAML。如果正確是可以直接部署。
ithome2024lab/day16/helmchartlab/kubernetes$ kustomize build .
或是使用
$ kubectl apply --dry-run=client -o yaml -k ./
另外,在 resources
欄位中,除了直接設置 YAML 檔案之外,還支援不同的輸入。例如,可以設置一個包含其自己的 kustomization.yaml 和 Kubernetes 資源檔案的 base 目錄,並從另一個放置在另一個目錄中的 kustomization.yaml 檔案中引用它。抑或著參考遠方儲存庫上的 kustomization。
.
├── base
│ ├── kustomization.yaml
│ └── deployment.yaml
├── kustomization.yaml
├── configmap.yaml
#base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
#kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./base
- ./configmap.yaml
是包含 kustomization.yaml 檔案的目錄,其中包含一組資源及其相關的自訂。它可以是本地目錄或來自遠端倉庫的目錄,只要其中存在 kustomization.yaml 檔案即可。
也是一個目錄,其中包含將其他 kustomization 目錄當做 bases 來引用的 kustomization.yaml 檔案。Base 會不了解 Overlays 的存在,且可被多個 Overlays 所使用。它可以有多個 Base 來源,且可針對所有 Base 中的資源執行組織操作,也可以在其上執行自訂。因此 Overlays 應用於不同場景的配置。
下面的操作將基於此概念來演示。因此目錄結構是
ithome2024lab/day16/helmchartlab/kustomize$ tree .
.
├── base
│ ├── configmap.yaml
│ ├── deployment.yaml
│ ├── kustomization.yaml
│ ├── service.yaml
│ └── serviceaccount.yaml
└── overlays
├── dev
│ └── kustomization.yaml
└── prd
4 directories, 6 files
使用 images
的關鍵字,進行配置,上述為
#overlays/dev/kustomization.yaml
images:
- name: registry.hub.docker.com/cch0124/quarkus-dns # 設定要更新的 Image 名稱
newName: registry.hub.docker.com/cch0124/quarkus-dns
newTag: day19-dev # 給 Image 的新版本
Image 更新,在當今軟體開發中是最常用的操作之一,即將應用程式更新到較新的版本,無論是為了修復錯誤還是添加新功能。在 Kubernetes 中,這需要創建一個新的容器 Image,並使用標籤。
使用指令 kustomize edit set image <IMAGE>:<TAG>
也是可行的。
方法上是使用 patch
透過 JsonPath 規範指定欄位上變更。如下針對 revisionHistoryLimit
進行變動。
#kustomize/overlays/dev/kustomization.yaml
...
patches:
- target: # 部分設定需要更改哪個 Kubernetes 物件。這些值與先前建立的部署檔案相符。
version: v1
group: apps
kind: Deployment
name: quarkus-dns
patch: |- # Patch 表達式
- op: replace # 修改的操作
path: /spec/revisionHistoryLimit # 要修改的欄位的路徑
value: 3 # 新的值
- op: add
path: /metadata/labels/enviroment
value: dev
透過以下讀者可以驗證,預設上設定 5,但至 dev 會變成 3。
/day16/helmchartlab/kustomize/overlays/dev$ kustomize build .
上面看到 op
欄位除了 replace
還可以 add
或是 delete
。但是如果對於較複雜的嵌套可以定義一個 YAML 來引用。如下
定義一個要進行修改 YAML 到最後狀態的內容,下面是一個新稱 TEST 環境變數的內容
#deployment-resource-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: quarkus-dns
spec:
template:
spec:
containers:
- name: quarkus-dns
env:
- name: TEST
value: "TEST"
在下面的 kustomization.yaml 使用 path: deployment-resource-patch.yaml
來引用。
#kustomize/overlays/dev/kustomization.yaml
patches:
- target:
version: v1
group: apps
kind: Deployment
name: quarkus-dns
patch: |-
- op: replace
path: /spec/revisionHistoryLimit
value: 3
- op: add
path: /metadata/labels/enviroment
value: dev
- path: deployment-resource-patch.yaml # 外部補丁檔案路徑
到這邊基本上都完成了操作可能。因此到這邊基本上就可以部署資源至 Kubernetes 中。
可使用 ConfigMapGenerator
功能動態產生 Kubernetes ConfigMap 資源。ConfigMapGenerator
會自動將雜湊添加到 ConfigMap
的元數據名稱,並修改部署檔案以包含新的雜湊。這項微小的更改對應用程式的生命週期具有深遠的影響。這影響會是前面討論 hot-reload 部分,一般來說 ConfigMap 資源異動並不會讓應用程式獲取最新的內容。如果 ConfigMapGenerator
管理 ConfigMap
,則配置檔案上的任何更改也會更改部署 Kubernetes 資源。由於部署檔案也已更改,因此在應用資源時會觸發自動滾動更新。
#kustomize/overlays/dev/kustomization.yaml
...
configMapGenerator:
- name: quarkus-dns-config
behavior: replace # 建立測行為。可以是 create、replace 和 merge
files: # 設定要讀取的檔案
- ./application.yaml
當然 files
這是其一個使用範例,還可以使用 literals
等方法。更多方是可參閱官方。
到這邊也知道了 kustomize 這個工具。相較於 Helm Chart 兩者是不衝突的東西,但是需要更彈性的設計會選擇 Helm,不過相對的複雜語法會使你頭痛,但 kustomize 沒有 hook 和 release management 的概念,相對於簡單以及容易。
總而言之,下方的圖代表了 kustomize,使用 patch 方式將一個完整的 YAML 資源呈現出來。