iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0
DevOps

30 天挑戰 CKAD 認證!菜鳥的 Kubernetes 學習日記系列 第 26

【Day26】Kustomize:不用模板也能客製化 Kubernetes 配置 - Part2

  • 分享至 

  • xImage
  •  

前情提要

昨天我們認識了 Kustomize 這個 Kubernetes 原生的配置管理工具。從實際的痛點出發,了解到當需要在多個環境部署相同應用時,複製和維護多份 YAML 檔案會造成管理上的困難。Kustomize 透過 BaseOverlays 的概念解決了這個問題,讓我們能夠重複使用基礎配置,只針對不同環境修改需要變更的部分。

昨天我們只看了 Kustomize 的基礎功能。今天我們將深入研究 Kustomize 真正強大的地方:TransformersPatches。這些進階功能讓我們能夠精確地修改資源配置、管理不同環境的映像檔版本、建立可重用的配置片段,真正發揮 Kustomize 在多環境部署管理上的威力。

根據你的要求,我重新整理 Transformers 的部分,將 Common Transformers 和 Image Transformers 合併成一個章節:

Transformers:統一配置修改

Transformers 是 Kustomize 提供的統一修改機制,讓我們能夠對多個資源進行批次性的配置調整,而不需要逐一修改每個 YAML 檔案。

Common Transformers

當我們需要對所有 Kubernetes 資源進行統一的配置修改時,Common Transformers 就是最佳選擇。比如說,我們想為所有資源加上公司的標籤、統一 Namespace、或是添加共同的前綴後綴,這些都可以透過 Transformers 輕鬆完成。

Kustomize 提供了幾種常用的 Transformers:

  • commonLabels 可以為所有資源添加共同的標籤,這在管理資源和設定網路政策時特別有用
  • namePrefixnameSuffix 讓你能為所有資源名稱加上前綴或後綴,方便區分不同環境的資源。
  • namespace 則能將所有資源統一放入特定的命名空間中。
  • commonAnnotations 可以為所有資源添加註釋,用於記錄元資料或觸發特定的控制器行為。

這些 Transformers 的強大之處在於作用範圍。如果在根目錄的 kustomization.yaml 中定義時,它會影響所有被引入的資源;而如果在子目錄中定義時,則只會影響該目錄下的資源。這種階層式的設計讓配置管理變得非常靈活。

Image Transformers

Image Transformers 專門用來管理容器映像檔的版本和來源。在不同環境中,我們經常需要使用不同版本的映像檔,或是從不同的 Registry 拉取映像檔。

透過指定 namenewName,可以替換所有使用特定映像檔的容器。如果只想更新標籤,可以使用 newTag 屬性。這在升級應用版本或是回滾時特別有用,不需要修改任何 YAML 檔配置,只要在 kustomization.yaml 中調整映像檔設定即可。

值得注意的是,Image Transformer 是根據映像檔名稱來匹配的,而不是容器名稱。它會掃描所有資源,找出使用指定映像檔的容器並進行替換,因此若是在根目錄使用的話需要特別注意。

Patches:精確修改的藝術

Patches 提供了更精確的修改方式。不同於 Common Transformers 的全域修改,Patches 是直接針對特定的資源進行修改。

JSON 6902 Patch

JSON 6902 Patch 遵循 RFC 6902 標準,使用操作指令來修改資源。每個 Patch 需要三個要素:operation(操作類型:add、remove、replace)、target(目標資源的識別條件)、以及 value(要設定的值,remove 操作不需要)。

# 修改 replicas
patches:
  - target:
      kind:: Deployment
      name: api-deployment
    patch: |-
      - op: replace
        path: /spec/replicas
        value: 5
        
# 修改 Container Image
patches:
  - target:
      kind:: Deployment
      name: api-deployment
    patch: |-
      - op: replace
        path: /spec/template/spec/containers/0
        value:
          name: haproxy
          image: haproxy

路徑的指定是關鍵,可以看到上方的 YAML 配置。比如要修改 deployment 中的 replicas,路徑會是 /spec/replicas。對於列表類型的資源,需要使用索引來指定位置,例如 /spec/template/spec/containers/0 代表第一個容器。

Strategic Merge Patch

Strategic Merge Patch 的方式更直觀。你只需要寫出想要修改的部分 YAML,Kustomize 會智慧地將它與原始配置合併。這種方式的好處是可讀性高,因為它就是標準的 Kubernetes YAML。

# 修改 replicas
patches:
  - patch: |-
	  apiVersion: apps/v1
	  kind: Deployment
	  metadata:
	    name: api-deployment
	  spec:
	    replicas: 5

# 修改 Container Image
patches:
  - patch: |-
	  apiVersion: apps/v1
	  kind: Deployment
	  metadata:
	    name: api-deployment
	  spec:
	    template:
	      spec:
	        containers:
		      - name: haproxy
	            image: haproxy

可以參考上方 YAML,對於字典類型的資源,Strategic Merge Patch 會合併鍵值對。如果要刪除某個鍵,需要將值設為 null。對於列表類型的資源,如果要刪除某個項目,需要使用特殊的 $patch: delete 指令。

Overlays:多環境管理的核心

Overlays 是 Kustomize 實現多環境管理的核心機制。透過在不同的 overlay 目錄中定義環境特定的 patches 和額外資源,我們可以從同一個 base 配置衍生出適合不同環境的配置。

每個 overlay 都有自己的 kustomization.yaml,其中透過 bases 屬性引用 base 配置,然後定義該環境特有的修改。這不僅限於 patches,你也可以在 overlay 中加入該環境獨有的資源,如下方 YAML 配置,比如只在生產環境中啟用的監控元件。

bases:
  - ../../base

resources:
  - grafana.deployment.yaml

patch: |-
  - op: replace
    path: /spec/replicas
    value: 5

Components:可重用配置的最佳實踐

Components 是 Kustomize 中較新的功能,它解決了「某些功能只在部分環境中啟用」的問題。比如快取功能只在生產和預發布環境啟用,而開發環境不需要。如果把它放在 base 中,所有環境都會有;如果複製到各個 overlay 中,又違反了 DRY(Don't Repeat Yourself) 原則。

Components 提供了第三種選擇:將這些可選功能打包成獨立的元件,然後在需要的 overlay 中引用。一個 Component 可以包含資源、patches、secrets 等所有相關配置。透過在 overlay 的 kustomization.yaml 中列出需要的 components,就能靈活地組合功能,如下方 YAML。

# components/db/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component
resources:
  - postgres-depl.yaml
secretGenerator:
  - name: postgres-cred
    literals:
      - password=postgres123
patches:
  - deployment-path.yaml
    
# components/db/deployment-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-Deployment
spec:
  template:
    spec:
      containers:
        - name: api
          env:
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-cred
                  key: password

# overlays/prod/kustomization.yaml
bases:
  - ../../base

components:
  - ../../components/db

實戰 🔥

稍後補上,先發文!


上一篇
【Day25】Kustomize:不用模板也能客製化 Kubernetes 配置 - Part1
系列文
30 天挑戰 CKAD 認證!菜鳥的 Kubernetes 學習日記26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言