iT邦幫忙

2026 iThome 鐵人賽

DAY 23
0

前言

經過 Day 21~22,我們已經能從零建立 Helm Chart,並透過 _helpers.tpl、多環境 values、功能開關等技巧,讓 Chart 更容易維護與調整。

但接下來會遇到另一個問題:

如果應用程式還需要 Redis、PostgreSQL、Prometheus 等元件,難道每一個都要自己從零寫 Chart 嗎?

當然不用。

就像開發程式時會引用現成的 Library 或 Package,Helm 也可以直接使用其他人已經建立好的 Chart。

這裡會用到兩個重要概念:

  • Helm Repository:存放與分享 Chart 的地方
  • Chart Dependencies:讓一個 Chart 宣告並引用其他 Chart 作為依賴

例如,我們可以讓自己的應用 Chart 依賴 Redis Chart,Helm 會協助管理所需要的依賴版本與 Chart 套件。

今天內容包含:

  1. Helm Repository 是什麼 —— 認識 Repository 與基本使用流程
  2. Repository 基本操作 —— repo addrepo updatesearch
  3. 安裝現成 Chart —— 以 Redis 為例使用第三方 Chart
  4. Chart Dependencies —— 讓自己的 Chart 引用 Subchart
  5. 加入 Redis Dependency —— 在 Chart.yaml 宣告依賴
  6. Subchart Values 覆寫 —— 從 Parent Chart 調整 Redis 設定
  7. condition 依賴開關 —— 控制 Subchart 是否啟用
  8. 完整驗證與部署 —— dependency listlinttemplateupgrade --install
  9. 常見問題與注意事項 —— 整理 Dependency 常見踩坑點

以下操作延續 Day 21-22 的 my-chart,皆在 master 節點執行。


一、Helm Repository 是什麼?

Helm Repository 就是一個存放與提供打包後 Chart 的位置

可以把它類比成:

  • npm Registry 之於 Node.js
  • PyPI 之於 Python
  • apt Repository 之於 Linux

Helm 可以透過 Repository 搜尋與取得其他人已經建立好的 Chart,基本流程通常是:

加入 Repository → 更新索引 → 搜尋 Chart → 安裝

這篇實戰會使用 Bitnami Repository,安裝現成的 Redis Chart。

💡 補充

除了傳統 Helm Repository,現在很多 Chart 也會透過 OCI Registry 發布。

OCI Registry 可以用來儲存與散佈 Helm Chart,概念上和存放 Container Image 很類似。


二、Repository 基本操作

Step 1:加入 Repository

先加入 Bitnami Repository:

helm repo add bitnami https://charts.bitnami.com/bitnami

接著更新本機的 Repository 索引:

helm repo update

可以把它理解成類似:

apt update

Helm 會重新取得已加入 Repository 的最新 Chart 索引。

Step 2:搜尋 Chart

搜尋目前已加入的 Repository 中,和 Redis 相關的 Chart:

helm search repo redis

會看到類似:

https://ithelp.ithome.com.tw/upload/images/20260820/2018192851UHAfh354.png

其中:

  • NAME:Chart 名稱
  • CHART VERSION:Chart 本身的版本
  • APP VERSION:Chart 所部署應用程式的版本資訊

常用 Repository 指令

指令 用途
helm repo add <name> <url> 加入新的 Repository
helm repo update 更新已加入 Repository 的索引
helm repo list 列出目前已加入的 Repository
helm repo remove <name> 移除 Repository
helm search repo <keyword> 搜尋已加入 Repository 中的 Chart
helm search hub <keyword> 到 Artifact Hub 搜尋 Chart

三、用 Repository 安裝現成 Chart

Step 3:查看 Chart 可調參數

安裝前,可以先查看這個 Chart 提供哪些可調整的 values:

helm show values bitnami/redis

這個指令會顯示 Chart 的預設 values.yaml,通常內容會很長。

💡 小技巧

可以搭配 less 分頁瀏覽:

helm show values bitnami/redis | less

或搜尋特定設定,例如:

helm show values bitnami/redis | grep -A5 "auth:"

Step 4:安裝 Redis

這次練習使用 Standalone 架構,並暫時關閉密碼驗證:

helm install my-redis bitnami/redis \
  --set architecture=standalone \
  --set auth.enabled=false

其中:

  • architecture=standalone:使用單一 Redis 實例
  • auth.enabled=false:關閉 Redis 密碼驗證

⚠️ 注意

關閉 Redis 驗證只適合 Lab 或學習環境。

正式環境應保留驗證機制,並妥善管理 Redis 的密碼或 Secret。

Step 5:確認部署結果

# 查看目前 Namespace 中的 Helm Release
helm list

# 查看 Redis 相關的常見 Kubernetes 資源
kubectl get all -l app.kubernetes.io/name=redis

# 測試 Redis 連線
kubectl run redis-test \
  --rm -it \
  --image=redis:7-alpine \
  --restart=Never \
  -- redis-cli -h my-redis-master ping

如果連線成功,會看到:

https://ithelp.ithome.com.tw/upload/images/20260820/20181928jv8YFb5ynT.png

💡 重點回顧

使用現成 Chart 的基本流程可以記成:

repo add → repo update → search → install

不需要自己從零撰寫 Kubernetes YAML,只要透過 --set-f 覆寫需要調整的 values,就能快速部署現成應用。


四、Chart Dependencies — 依賴管理

剛才我們是獨立安裝 Redis,但實務上更常見的情境是:

「我的應用需要搭配 Redis,我希望執行一次 helm install,就能把應用 + Redis 一起部署。」

這就是 Chart Dependencies 的用途 —— 讓自己的 Chart 引用其他 Chart 作為依賴。

核心概念

可以用程式語言的套件管理來類比:

程式語言 Helm
package.json Chart.yaml 裡的 dependencies
node_modules/ charts/ 目錄
package-lock.json Chart.lock
npm install helm dependency update

簡單來說:

  • Chart.yaml:宣告「我需要哪些 Chart」
  • helm dependency update:解析並下載依賴
  • charts/:存放下載下來的 Dependency Chart
  • Chart.lock:記錄解析後的依賴版本與來源

這樣你的 Chart 就可以把 Redis、PostgreSQL 等元件當成 Subchart 一起管理。


五、實戰:為 my-chart 加入 Redis 依賴

Step 7:在 Chart.yaml 宣告依賴

編輯:

vim my-chart/Chart.yaml

Chart.yaml 中加入 dependencies

apiVersion: v2
name: my-chart
description: A Helm chart for learning
type: application
version: 0.2.0
appVersion: "1.27.0"

dependencies:
  - name: redis
    version: "25.3.2"
    repository: https://charts.bitnami.com/bitnami
    condition: redis.enabled

https://ithelp.ithome.com.tw/upload/images/20260820/20181928ec9fzWc1EQ.png

每個欄位的用途:

  • name:Dependency Chart 的名稱
  • version:Redis Chart Version
  • repository:Redis Chart 所在的 Repository
  • condition:透過 parent chart 的 values 控制是否啟用 Redis

⚠️ 注意 Chart Version

這裡的 version 指的是 Redis Chart 本身的版本,不是 Redis 的 App Version。

可以先查詢目前 Repository 中的版本:

helm search repo bitnami/redis

Helm 也支援 SemVer 版本範圍,但指定精確版本會比較容易讓不同時間操作的結果保持一致。

Step 8:下載依賴

# 下載依賴的 Chart 到 charts/ 目錄
helm dependency update ./my-chart

執行後會看到:

https://ithelp.ithome.com.tw/upload/images/20260820/20181928Mg3zpG4PmX.png

觀察目錄變化

ls my-chart/charts/
# → redis-25.x.x.tgz  (下載的子 Chart 壓縮包)

cat my-chart/Chart.lock
# → 記錄了依賴的精確版本與 hash(類似 lock file)

https://ithelp.ithome.com.tw/upload/images/20260820/20181928ageCPATMpB.png

💡 charts/ 目錄

charts/ 用來存放目前 Chart 的 Dependency Charts。

執行:

helm dependency update ./my-chart

或:

helm dependency build ./my-chart

Helm 會把需要的 Dependency Chart 下載到 charts/

之後執行 helm installhelm template 時,Helm 會連同這些 Subcharts 一起渲染。

一般不需要手動解壓或直接修改 charts/ 裡的 Dependency Chart。

依賴管理常用指令

指令 用途
helm dependency update <chart> 根據 Chart.yaml 解析並下載依賴,同時更新 Chart.lock
helm dependency build <chart> 根據 Chart.lock 重新下載鎖定的依賴
helm dependency list <chart> 查看 Chart 宣告的依賴與目前狀態

💡 update vs build

  • update:讀取 Chart.yamldependencies,解析符合版本條件的依賴,下載到 charts/,並產生或更新 Chart.lock
  • build:依照現有的 Chart.lock 重新建立 charts/,不重新解析新的 Dependency Version

團隊協作時,通常會將 Chart.lock 加入 Git,讓不同開發者或 CI 環境使用相同的 Dependency Version。


六、子 Chart 的 Values 覆寫

子 Chart 有自己的 values.yaml,但你可以在父 Chart 的 values 裡覆寫它。

Step 9:在父 Chart 的 values.yaml 覆寫子 Chart 參數

vim my-chart/values.yaml

在最後面加上:

# === 子 Chart: Redis 設定 ===
redis:
  enabled: true
  architecture: standalone
  auth:
    enabled: false
  master:
    persistence:
      enabled: false

https://ithelp.ithome.com.tw/upload/images/20260820/20181928lrf1O34dHh.png

覆寫規則

Parent Chart 可以用 Subchart 名稱作為 key,覆寫子 Chart 的 values。

例如 Redis Subchart 原本:

auth:
  enabled: true

Parent Chart 可以這樣覆寫:

redis:
  auth:
    enabled: false

也就是:

redis.auth.enabled

會覆寫 Redis Subchart 裡的:

auth.enabled

Global Values

如果某些參數需要讓 Parent Chart 和 Subchart 共用,可以放在 global 底下:

global:
  storageClass: standard

之後在 Parent Chart 或 Subchart 中,都可以透過:

{{ .Values.global.storageClass }}

取得這個值。

💡 什麼時候適合使用 global

當多個 Chart 需要共享相同設定時,可以考慮放在 global,例如:

  • StorageClass
  • Image Registry
  • Domain Name

這樣可以避免在不同 Subchart 底下重複設定相同的值。


七、condition — 依賴開關

還記得 Day 22 學過的功能開關嗎?

當時我們用 if 控制自己寫的模板,例如 Ingress 是否要產生。

現在同樣的概念也可以套用到 Subchart,透過 condition 控制某個 Dependency 是否啟用。

📌 這一節不需要修改任何檔案

以下設定在前面的 Step 7 和 Step 9 已經完成,這裡只是說明它們如何搭配運作。

回顧 Chart.yaml

dependencies:
  - name: redis
    version: "25.3.2"
    repository: https://charts.bitnami.com/bitnami
    condition: redis.enabled

搭配 values.yaml

redis:
  enabled: true

其中:

condition: redis.enabled

會讀取 Parent Chart 的:

redis.enabled

來決定 Redis Subchart 是否啟用。

效果

當:

redis:
  enabled: true

執行:

helm template my-release ./my-chart

會一起渲染 Redis Subchart 的資源。

如果關閉 Redis:

helm template my-release ./my-chart \
  --set redis.enabled=false

Redis Subchart 的資源就不會被渲染。

這在不同環境很實用,例如:

  • 開發環境:redis.enabled: false
  • 正式環境:redis.enabled: true

同一份 Chart 就可以依不同環境決定是否包含 Redis。


八、完整驗證

Step 10:驗證依賴與渲染結果

# 1. 確認 Dependency 狀態
helm dependency list ./my-chart

確認 Redis 的 STATUS 顯示:

ok

接著執行:

# 2. 檢查 Chart
helm lint ./my-chart

# 3. 渲染完整 Manifest
helm template my-release ./my-chart

檢查重點

  • 是否同時渲染 Parent Chart 的 Nginx 資源與 Redis Subchart 資源
  • Redis 的 values 是否正確套用,例如 Standalone 架構與關閉驗證
  • redis.enabled: false 時,Redis Subchart 的資源是否不再被渲染

可以再測一次:

helm template my-release ./my-chart \
  --set redis.enabled=false

如果設定正確,輸出中就不會再出現 Redis Subchart 的資源。

Step 11:實際部署

如果之前的 Release 還存在,可以先移除:

helm uninstall my-release 2>/dev/null

接著部署 Parent Chart,Redis Dependency 也會一起安裝:

helm upgrade --install my-release ./my-chart

https://ithelp.ithome.com.tw/upload/images/20260820/20181928K0jXDXluZH.png

安裝成功後,可以分別確認 Parent Chart 與 Redis Subchart 的資源:

# 查看我們自己建立的 Nginx 資源
kubectl get all -l release=my-release

# 查看 Redis Subchart 的資源
kubectl get all -l app.kubernetes.io/instance=my-release

應該可以看到:

Nginx
├── Deployment
├── Pod
└── Service

https://ithelp.ithome.com.tw/upload/images/20260820/201819283Nav8jbmRb.png

Redis Subchart 使用不同的 Label,因此需要另外查:

kubectl get all -l app.kubernetes.io/instance=my-release

📝 為什麼要用兩種 Label?

我們自己建立的 Nginx Chart 使用:

release=my-release

Bitnami Redis Chart 則使用:

app.kubernetes.io/instance=my-release

不同 Chart 的 Label 設計可能不同,因此驗證第三方 Subchart 時,要先確認它實際使用的 Labels。


九、常見問題與注意事項

問題 原因與解法
Error: no repository definition for https://... 先確認對應的 Repository 已透過 helm repo add 加入,再執行 helm dependency update
charts/ 裡面是空的 可能尚未執行 helm dependency update,或 Dependency 版本 / Repository 設定有誤
Subchart 參數沒生效 覆寫時要用 Subchart 名稱當作 key,例如 redis.auth.enabled,而不是直接寫 auth.enabled
Chart.lock 要不要 commit? 建議要。 團隊或 CI 可以透過 helm dependency build 使用相同的 Dependency Version
想用本地 Chart 當 Dependency 可以使用相對路徑,例如 repository: file://../my-other-chart

小結

今天我們學會了如何善用現成的 Chart,透過 Repository 與 Dependencies,把自己的應用和其他元件組合在一起。

學到的東西 一句話總結
Helm Repository repo addrepo updatesearchinstall,快速使用現成 Chart
helm show values 安裝前先查看 Chart 提供哪些可調整參數
Chart Dependencies Chart.yaml 宣告依賴,再用 helm dependency update 下載到 charts/
Subchart Values 覆寫 用 Subchart 名稱作為 key,在 Parent Chart 中調整子 Chart 的 values
Global Values 讓 Parent Chart 與 Subchart 共用部分參數
condition 依賴開關 condition: redis.enabled 控制 Subchart 是否啟用
Chart.lock 鎖定依賴版本,讓團隊與 CI 使用一致的 Dependency Version

到這裡,Helm 這一系列就告一段落了。

我們已經從 使用現成 Chart → 自己建立 Chart → 進階模板 → Repository 與 Dependency 管理,走完一套完整的 Helm 基礎流程。

下一篇要切換到 Kubernetes 安全性的核心主題 —— RBAC(Role-Based Access Control),學習如何控制「誰可以對哪些資源執行哪些操作」!


參考資源


上一篇
Day 22|Helm 進階模板與 `_helpers.tpl` — 讓 Chart 更靈活、更好維護
系列文
從零到 CKA:30 天掌握 Kubernetes 核心觀念與實作23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言