在現代雲端原生架構中,Kubernetes 已成為容器化應用部署的標準,但直接管理其複雜的 YAML 清單檔效率低落。為此,Helm 作為 Kubernetes 的套件管理器,提供了一套標準化的打包與部署機制,簡化應用程式的生命週期管理。企業在實踐 DevOps 流程時,常需將自訂應用封裝為可重複部署的單元。本文從理論基礎出發,探討如何建立客製化 Helm Chart,並將其發布至 Azure Container Registry (ACR) 等私有 OCI 倉庫,確保部署流程的安全性與一致性。同時,也將檢視 Azure Kubernetes Service (AKS) 作為託管平台的角色,分析其如何與 Helm 整合,構成高效的企業級應用交付方案。
自定義 Helm Chart 開發與發布
本節將引導您學習如何創建自己的 Helm Chart,並將其發布到私有的容器註冊中心,例如 Azure Container Registry (ACR)。
創建自定義 Helm Chart
在許多企業環境中,部署自定義應用程式是常見需求,這就需要我們創建自己的 Helm Chart。
- 
初始化 Chart 結構: 首先,在一個新的文件夾中,使用 helm create命令來生成一個基本的 Chart 結構。例如,創建一個名為demobook的 Chart:helm create demobook此命令會創建一個包含標準目錄結構和模板文件的文件夾,為您的 Chart 提供了一個良好的起點。 
- 
自定義 Chart: 接下來,您需要編輯 Chart 中的模板文件(位於 templates目錄下)和values.yaml文件。- templates目錄: 包含 Kubernetes 資源的模板文件,例如 Deployment、Service、Ingress 等。您可以根據應用程式的需求修改這些模板,或添加新的模板。
- values.yaml文件: 定義了 Chart 的可配置參數。用戶在安裝 Chart 時,可以通過覆蓋- values.yaml中的默認值來定制應用程式的部署,例如指定映像標籤、副本數量、資源限制等。
 
- 
本地安裝自定義 Chart: 在完成 Chart 的自定義後,您可以先在本地集群中進行測試安裝。在 Chart 的根目錄下執行: helm install demochart ./demobook其中 demochart是您為此 Release 指定的名稱。
- 
驗證本地安裝: - 檢查 Pod 狀態:
您應該能看到由您的 Chart 創建的 Pod 正在運行。kubectl get pods
- 列出已安裝的 Helm Release:
您將在列表中看到名為helm lsdemochart的 Helm Release。
 
- 檢查 Pod 狀態:
發布 Helm Chart 到私有 Registry (ACR)
雖然公共 Helm Chart 倉庫(如 Artifact Hub)非常適合分享開源應用程式,但對於企業內部應用程式,使用私有 Helm Registry 是更安全、更推薦的做法。Azure Container Registry (ACR) 是其中一個選擇。
假設您已經在 Azure 上創建了一個名為 demobookacr 的 ACR。
- 
打包 Helm Chart: 首先,需要將您的自定義 Chart 打包成一個 .tgz文件。在 Chart 的根目錄下執行:helm package .此命令會在當前目錄下生成一個 Chart 包,例如 demobook-0.1.0.tgz。
- 
認證 ACR: 為了將 Chart 推送到 ACR,您需要先進行身份驗證。這通常涉及使用 Azure CLI。 - 啟用 OCI 支持:
$env:HELM_EXPERIMENTAL_OCI=1
- 設置 ACR 名稱和用戶名:
$ACR_NAME="demobookacr" # 用戶名通常是服務主體 ID 或 Azure AD 用戶 ID,這裡為簡化示例,使用佔位符 $USER_NAME="<your-azure-ad-or-sp-id>"
- 登錄 Azure CLI:
az login
- 獲取 ACR 訪問 Token:
此命令會獲取一個用於訪問 ACR 的 Token。$PASSWORD=$(az acr login --name $ACR_NAME --expose-token --output tsv --query accessToken)
 
- 啟用 OCI 支持:
- 
登錄 Helm 到 ACR: 使用獲取的 Token 和 ACR 名稱,讓 Helm 客戶端能夠連接到 ACR: helm registry login $ACR_NAME --username $USER_NAME --password $PASSWORD
- 
推送 Chart 到 ACR: 現在,您可以將打包好的 Chart 推送到 ACR。Chart 的 OCI 格式為 <acr_name>.azurecr.io/<chart_name>:<version>。helm push demobook-0.1.0.tgz $ACR_NAME.azurecr.io/demobook這會將 demobook-0.1.0.tgz文件推送到您的 ACR 中,並在 ACR 中創建一個名為demobook的 Helm Chart 倉庫。
- 
在本地添加 ACR Chart 倉庫: 在本地 Helm 配置中添加您的私有 ACR Chart 倉庫,以便能夠搜索和安裝其中的 Chart: helm repo add myacr $ACR_NAME.azurecr.io/demobook helm repo update
- 
從私有 Registry 安裝 Chart: 現在,您可以像從公共倉庫安裝 Chart 一樣,從您的私有 ACR 安裝 Chart: helm install mydemochart myacr/demobook
視覺化自定義 Chart 開發與發布流程
以下圖示展示了創建自定義 Helm Chart 並將其發布到 ACR 的流程。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
title Custom Helm Chart Development and Publishing to ACR
component "Local Machine" {
  artifact "Terminal" as TERMINAL
  artifact "Helm Client" as HELM
  artifact "Azure CLI" as AZCLI
  artifact "Chart Files" as CHART_FILES
  artifact "Chart Package (.tgz)" as CHART_TGZ
}
component "Azure Container Registry (ACR)" {
  artifact "ACR Instance (demobookacr)" as ACR_INSTANCE
  artifact "Helm Chart Repository" as ACR_HELM_REPO
}
component "Kubernetes Cluster" {
  artifact "API Server" as APISERVER
  artifact "Nodes" as NODES
}
TERMINAL --> HELM : `helm create demobook`
HELM --> CHART_FILES : Generates Chart Structure
CHART_FILES --> TERMINAL : User Customization (templates/, values.yaml)
TERMINAL --> HELM : `helm package .`
HELM --> CHART_TGZ : Creates Chart Package
TERMINAL --> AZCLI : `az login`
AZCLI --> Azure : Authenticates User
TERMINAL --> AZCLI : `az acr login ...`
AZCLI --> ACR_INSTANCE : Obtains Access Token
TERMINAL --> HELM : `helm registry login ...`
HELM --> ACR_INSTANCE : Authenticates Helm Client
TERMINAL --> HELM : `helm push ...`
HELM --> ACR_HELM_REPO : Pushes Chart Package to ACR
TERMINAL --> HELM : `helm repo add myacr ...`
HELM --> K8S : Adds ACR Repo to Helm Config
TERMINAL --> HELM : `helm install mydemochart myacr/demobook`
HELM --> APISERVER : Deploys Chart to Kubernetes Cluster
APISERVER --> NODES : Runs Application Pods
@enduml看圖說話:
此圖示詳細說明了創建自定義 Helm Chart 並將其發布到 Azure Container Registry (ACR) 的整個流程。
首先,在本地機器上,用戶使用 helm create 命令生成 Chart 的基本結構,然後對模板文件和 values.yaml 文件進行自定義。完成後,helm package 命令將 Chart 打包成一個 .tgz 文件。
接下來,流程轉向 Azure。用戶通過 Azure CLI 登錄 Azure (az login),然後獲取訪問 ACR 的 Token (az acr login)。隨後,Helm 客戶端使用此 Token 登錄到 ACR (helm registry login)。
一旦 Helm 客戶端成功連接到 ACR,就可以使用 helm push 命令將打包好的 Chart 文件推送到 ACR 中,這會在 ACR 中創建一個私有的 Helm Chart 倉庫。
最後,用戶在本地通過 helm repo add 命令將這個 ACR Chart 倉庫添加到 Helm 的配置中,並執行 helm install 命令,從私有倉庫中拉取並部署 Chart 到 Kubernetes 集群。這個流程確保了企業內部應用程式的 Chart 可以被安全地管理和分發。
Helm Chart 發布與 Azure Kubernetes Service (AKS) 概覽
本節將完成 Helm Chart 的發布流程,並介紹 Azure Kubernetes Service (AKS) 的概念及其優勢。
Helm Chart 推送至 ACR 詳情
在上一節中,我們學習了如何創建並打包自定義 Helm Chart。現在,我們將詳細說明如何將這個 Chart 推送到 Azure Container Registry (ACR)。
- 
推送 Chart 到 ACR: 使用 helm push命令將打包好的 Chart 文件推送到 ACR。命令格式為helm push <chart-package.tgz> oci://<acr_name>.azurecr.io/<repository_path>。helm push .\demobook-0.1.0.tgz oci://$ACR_NAME.azurecr.io/helm/demobook執行此命令後, demobook-0.1.0.tgz文件將被上傳到 ACR,並存儲在helm/demobook路徑下。
- 
驗證 Chart 是否成功推送: 為了確認 Chart 已正確上傳,可以使用 Azure CLI 查詢 ACR 中的倉庫信息: az acr repository show --name $ACR_NAME --repository helm/demobook此命令會顯示 helm/demobook倉庫的詳細信息,包括其標籤(版本)。您也可以在 Azure 入口網站中直接查看 ACR,找到名為 helm/demobook的倉庫,其中包含您剛才推送的 Helm Chart。
Azure Kubernetes Service (AKS) 概覽
在生產環境中,自行安裝和管理 Kubernetes 集群可能非常複雜,需要投入大量的伺服器資源、具備專業技能的人力,並實施嚴格的安全策略。為了解決這些挑戰,雲端服務提供者紛紛推出了託管式 Kubernetes 服務。
Azure Kubernetes Service (AKS) 是 Azure 提供的託管 Kubernetes 服務,它極大地簡化了 Kubernetes 集群的創建和管理過程。
AKS 的主要優勢:
- 託管控制平面: AKS 負責管理 Kubernetes 控制平面的基礎設施(Master 節點的虛擬機)。用戶無需擔心其硬件安裝、配置和維護。
- 免費的 Kubernetes 服務: AKS 本身不收取 Kubernetes 服務的費用。用戶僅需支付運行工作節點(Worker Nodes)的虛擬機的費用。
- 集成與安全性: AKS 與 Azure 的其他服務(如 Azure Monitor、Azure Policy、Azure Active Directory)緊密集成,提供了增強的安全性和可觀測性。
- 自動化升級與縮放: AKS 支持 Kubernetes 集群的自動化升級和節點自動縮放,幫助您保持集群的最新狀態並根據工作負載需求進行調整。
創建 AKS 服務
在 Azure 中創建 AKS 集群有幾種主要方式:
- 
通過 Azure 入口網站 (Azure Portal): 這是最直觀的方式。用戶可以通過 Azure 入口網站的圖形界面,配置 AKS 集群的基本屬性,包括節點數量、節點類型、網絡配置等。 
- 
通過 Azure CLI 腳本: 對於需要自動化部署的場景,可以使用 Azure CLI 腳本來創建 AKS 集群。例如: # 創建資源組 az group create --name Rg-AKS --location westeurope # 創建 AKS 資源 az aks create --resource-group Rg-AKS --name demoBookAKS \ --node-count 2 --generate-ssh-keys --enable-addons monitoring此腳本首先創建一個名為 Rg-AKS的資源組,然後在其中創建一個名為demoBookAKS的 AKS 集群,配置了 2 個節點,自動生成 SSH 密鑰,並啟用了監控附加組件。
- 
通過 Terraform: 對於基礎設施即代碼 (IaC) 的實踐,可以使用 Terraform 來聲明式地創建 AKS 集群。Terraform 腳本可以詳細定義集群的各種配置,並實現可重複、可版本化的基礎設施部署。 
創建 AKS 集群後,您就可以配置集群並開始部署應用程式了。
視覺化 Helm Chart 推送與 AKS 創建流程
以下圖示展示了 Helm Chart 推送到 ACR 的過程,以及 AKS 集群的創建方式。
@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_
skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100
title Helm Chart Push to ACR & AKS Creation Overview
package "Helm Chart Publishing" {
  component "Local Machine" {
    artifact "Helm Client" as HELM_LOCAL
    artifact "Chart Package (.tgz)" as CHART_TGZ
  }
  component "Azure Cloud" {
    artifact "Azure CLI" as AZCLI_LOCAL
    artifact "Azure Container Registry (ACR)" as ACR_INSTANCE
    artifact "Helm Repository in ACR" as ACR_HELM_REPO
  }
  HELM_LOCAL --> CHART_TGZ : Package Chart
  AZCLI_LOCAL --> ACR_INSTANCE : Authenticate & Get Token
  HELM_LOCAL --> ACR_INSTANCE : `helm registry login`
  HELM_LOCAL --> ACR_HELM_REPO : `helm push ...`
}
package "AKS Cluster Creation" {
  component "Azure Cloud" {
    artifact "Azure Portal" as AZ_PORTAL
    artifact "Azure CLI" as AZCLI_CLUSTER
    artifact "Terraform" as TERRAFORM
    artifact "Azure Kubernetes Service (AKS)" as AKS_CLUSTER
  }
  AZ_PORTAL --> AKS_CLUSTER : Manual Configuration
  AZCLI_CLUSTER --> AKS_CLUSTER : `az aks create ...` (Scripted)
  TERRAFORM --> AKS_CLUSTER : IaC Configuration
}
@enduml看圖說話:
此圖示將 Helm Chart 的發布流程和 AKS 集群的創建方式進行了視覺化呈現。
在 Helm Chart 發布部分,流程從本地機器開始,Helm 客戶端打包 Chart 文件,然後通過 Azure CLI 進行身份驗證,Helm 客戶端登錄到 ACR。最後,helm push 命令將打包好的 Chart 文件上傳到 ACR 中,形成一個私有的 Helm Chart 倉庫。
在 AKS 集群創建部分,圖示展示了三種不同的創建途徑:
- Azure 入口網站: 用戶通過圖形界面手動配置和創建 AKS 集群。
- Azure CLI 腳本: 使用命令行腳本自動化 AKS 集群的創建過程,適合 CI/CD 流程。
- Terraform: 通過基礎設施即代碼工具,以聲明式的方式定義和創建 AKS 集群。
無論哪種方式,最終目標都是在 Azure 雲端創建一個託管的 Kubernetes 集群(AKS),用戶無需管理底層基礎設施,即可專注於應用程式的部署和管理。
結論:從工具精通到平台化思維的躍升
縱觀現代雲原生架構的演進,掌握自定義 Helm Chart 的開發與發布流程,其意義已遠超單純的技術操作。這不僅是將零散的部署腳本標準化,更是組織內部平台工程(Platform Engineering)實踐的基石,為加速應用交付與確保環境一致性提供了可規模化的解決方案。
深入剖析此流程可以發現,真正的挑戰並非 helm create 或 helm push 等指令的執行,而是 Chart 設計本身的策略性思考:如何在靈活性與標準化之間取得平衡?如何將安全規範與維運心法內建於模板之中?這正是從「工具使用者」轉變為「價值創造者」的關鍵瓶頸。相較於直接使用開源 Chart,自建私有倉庫雖增加了初期治理成本,卻換來了長期的技術資產沉澱與核心競爭力。
展望未來 2-3 年,企業內部私有 Chart 倉庫的成熟度,將成為衡量其 DevOps 文化與工程實踐水平的關鍵指標。它將從一個被動的儲存庫,演化為主動的、可信賴的內部應用市集,大幅降低新專案的啟動門檻與創新成本。
玄貓認為,精通 Helm Chart 的完整生命週期管理,已不僅是技術能力的精進,更是將 DevOps 理念內化為組織核心競爭力的策略性實踐。高階管理者應將其視為一項提升團隊工程文化與創新動能的基礎建設投資,而非單純的工具導入,唯有如此,方能在激烈的市場競爭中,構築起堅實的技術護城河。
 
            