Chuyển đến nội dung chính

第4課: Helm 與 Kustomize

Helm 架構與核心概念: chart、release、values。常用 helm 指令。Kustomize 的 base/overlay 結構。Helm vs Kustomize 比較與使用場景。

Helm 與 Kustomize — 套件管理與組態客製化

1. Helm — Kubernetes 的套件管理工具

Helm 架構:
┌──────────────────────────────────────────────────┐
│  Chart Repository (如 ArtifactHub)               │
│  ┌──────────────┐  ┌──────────────┐              │
│  │ nginx-chart  │  │ postgres-chart│  ...         │
│  └──────┬───────┘  └──────────────┘              │
│         │ helm install                            │
│         ▼                                         │
│  ┌──────────────────────────────────────┐        │
│  │  Release(已安裝的 chart 實例)       │        │
│  │  templates/ + values.yaml → K8s YAML │        │
│  └──────────────────────────────────────┘        │
└──────────────────────────────────────────────────┘
術語說明
ChartHelm 套件(template + values + metadata)
Releasechart 的已安裝實例(可多次安裝同一 chart)
Repository儲存 chart 的倉庫(如 ArtifactHub)
Values自訂參數(覆蓋 chart 預設值)
Template帶有 Go template 語法的 K8s manifest 模板

2. 常用 Helm 指令

# 搜尋與新增 Repository
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo nginx
helm search hub wordpress     # 搜尋 ArtifactHub

# 安裝
helm install my-release bitnami/nginx
helm install my-release bitnami/nginx -f custom-values.yaml
helm install my-release bitnami/nginx --set replicaCount=3

# 查看
helm list                     # 列出所有 releases
helm status my-release        # 查看 release 狀態
helm get values my-release    # 查看實際使用的 values
helm get manifest my-release  # 查看產生的 K8s YAML

# 升級與回滾
helm upgrade my-release bitnami/nginx --set replicaCount=5
helm rollback my-release 1    # 回滾到 revision 1
helm history my-release       # 查看修訂歷史

# 移除
helm uninstall my-release

考試重點: CKAD 考試中 Helm 題目通常包含:安裝 chart、設定自訂 values(--set 或 -f)、升級 release、回滾到特定版本。考試環境可參考 helm.sh/docs。記住 helm install 的語法是 helm install RELEASE_NAME CHART。

3. Kustomize

Kustomize 使用 overlay 方式,無需模板語法即可客製化 K8s YAML。

目錄結構:
base/
├── kustomization.yaml
├── deployment.yaml
└── service.yaml

overlays/
├── dev/
│   ├── kustomization.yaml    # 參照 base,套用 dev 修改
│   └── replica-patch.yaml
└── prod/
    ├── kustomization.yaml    # 參照 base,套用 prod 修改
    └── replica-patch.yaml
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml

# overlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namePrefix: dev-
commonLabels:
  environment: dev
patches:
- path: replica-patch.yaml

# overlays/dev/replica-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
# 預覽產生的 YAML
kubectl kustomize overlays/dev/

# 套用
kubectl apply -k overlays/dev/

# 或直接套用目錄
kubectl apply -k base/

4. Helm vs Kustomize 比較

面向HelmKustomize
方法模板化(Go templates)Overlay / Patch(純 YAML)
學習曲線中等(需學模板語法)低(純 YAML)
打包分發支援(chart repository)不支援(依賴 Git)
版本管理Release 版本歷史依賴 Git 版本控制
kubectl 整合需要 helm CLI內建(kubectl -k)
適用場景複雜套件、多環境部署簡單覆蓋、無需額外工具

5. 速查表

任務指令
安裝 charthelm install name repo/chart
自訂 values 安裝helm install name repo/chart --set k=v
升級 releasehelm upgrade name repo/chart
回滾到版本 Nhelm rollback name N
查看所有 releaseshelm list -A(所有 namespace)
Kustomize 預覽kubectl kustomize dir/
Kustomize 套用kubectl apply -k dir/

6. 練習題

Q1: 您需要安裝 bitnami/nginx chart 作為名為 "web" 的 release,並設定 replicaCount 為 3。正確的指令是什麼?

  • A) helm install bitnami/nginx --name web --set replicaCount=3
  • B) helm install web bitnami/nginx --set replicaCount=3 ✓
  • C) helm create web bitnami/nginx --values replicaCount=3
  • D) helm deploy web --chart bitnami/nginx --set replicaCount=3

解析: Helm 3 的語法是 helm install RELEASE_NAME CHART [flags]。--name 是 Helm 2 的語法(已棄用)。--set 用於設定單一 value;多個 values 可用 -f values.yaml。

Q2: 下列哪個指令可以預覽 Kustomize 產生的 YAML 而不實際套用?

  • A) kubectl apply -k overlays/dev/ --dry-run
  • B) kubectl kustomize overlays/dev/ ✓
  • C) kustomize build overlays/dev/ | kubectl apply -f -
  • D) kubectl diff -k overlays/dev/

解析: kubectl kustomize 僅渲染最終的 YAML 輸出到 stdout,不會套用任何變更到叢集。這是預覽和檢查的最佳方式。kubectl diff -k 也能比較差異但需要叢集存取。

Q3: 您安裝了一個 Helm release,但發現設定有誤。您想回滾到 revision 2。正確的指令是什麼?

  • A) helm undo my-release --to-revision=2
  • B) helm rollback my-release 2 ✓
  • C) helm downgrade my-release --revision 2
  • D) helm restore my-release 2

解析: helm rollback RELEASE_NAME REVISION 是回滾到特定版本的正確語法。先用 helm history my-release 查看可用的修訂版本。回滾本身也會建立新的修訂版本。