← 返回上一頁
Kubernetes

Helmify 實戰:一鍵把 Kubernetes YAML 轉成 Helm Chart

本頁目錄

手動建 Helm Chart 太累了?

管理 Kubernetes 應用時,如果涉及的資源物件比較多(Deployment、Service、ConfigMap、RBAC……),通常會用 Helm Chart 來統一管理。但從零開始建一個 Chart,把每個 YAML 檔改成 Go template 格式、抽出 values、維護 _helpers.tpl——說實話非常繁瑣。

Helmify 這個小工具可以自動完成這件事:它從標準輸入讀取 K8s 資源定義,直接輸出一個完整的 Helm Chart 目錄結構。

Helmify 支援的資源類型

資源類型 支援
Deployment / DaemonSet
Service / Ingress
PersistentVolumeClaim
ConfigMap / Secret
ServiceAccount / Role / RoleBinding / ClusterRole / ClusterRoleBinding
Webhook 相關(Certificate, Issuer, ValidatingWebhookConfiguration)
CRD

安裝

需要 Helm >= v3.6.0。

# 下載二進制檔(以 Linux x86_64 為例)
wget https://github.com/arttor/helmify/releases/download/v0.3.22/helmify_0.3.22_Linux_64-bit.tar.gz
tar -zxvf helmify_0.3.22_Linux_64-bit.tar.gz
chmod +x helmify
mv helmify /usr/local/bin/

# 驗證
helmify -version

用法一:從 YAML 檔轉成 Helm Chart

假設你有一個 dashboard 的 ServiceAccount + ClusterRoleBinding YAML:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

一行指令轉換:

cat dashboard-adminuser.yaml | helmify mychart

生成的目錄結構:

mychart/
├── Chart.yaml
├── templates/
│   ├── admin-user-rbac.yaml
│   ├── deployment.yaml
│   └── _helpers.tpl
└── values.yaml

helm template 驗證輸出:

helm template ./mychart

你會看到 helmify 自動做了幾件事:

  • 資源名稱加上了 release name 前綴(release-name-mychart-admin-user
  • 自動加上標準的 Helm label(chart、name、instance、version、managed-by)
  • namespace 和其他可變值被抽到 values.yaml

從整個目錄批次轉換

如果有一堆 YAML 散落在某個目錄:

awk 'FNR==1 && NR!=1 {print "---"}{print}' /path/to/yamls/*.yaml | helmify mychart

用法二:從 kustomize 輸出轉成 Helm Chart

很多專案用 kustomize 管理設定,但你可能想要 Helm Chart 的彈性。helmify 可以直接銜接 kustomize 的輸出。

簡單範例:ConfigMap

# kustomization.yaml
namespace: my-namespace
namePrefix: dev-
nameSuffix: "-001"
commonLabels:
  app: my-app
configMapGenerator:
- name: example-configmap
  literals:
  - FOO=Bar
kustomize build ./ | helmify mychart

進階範例:Deployment + ConfigMap

# 用 -v 看詳細過程,-vv 看 debug 級別
kubectl kustomize ./ | helmify -v nginx-web

輸出的 Chart 結構:

nginx-web/
├── Chart.yaml
├── templates/
│   ├── deployment.yaml
│   ├── example-configmap.yaml
│   └── _helpers.tpl
└── values.yaml

helmify 會自動把 Deployment 中引用的 ConfigMap 名稱替換成帶有 release name 的模板變數,確保整個 Chart 內部的參照是一致的。

helmify 的實用價值

從我的使用經驗來看,helmify 最適合這些場景:

  • 快速起步:已有一堆 YAML,想遷移到 Helm 管理,helmify 產出的 Chart 可以當起點,再手動微調
  • kustomize → Helm 遷移:團隊決定從 kustomize 換到 Helm,helmify 省掉大量機械式的改寫工作
  • 學習 Helm template:看看 helmify 把你的 YAML 轉成什麼樣的 template,是理解 Helm 模板化的好方式

不過要注意,自動產出的 Chart 不一定完美:

  • values.yaml 中的變數命名可能不夠直覺,需要手動調整
  • 複雜的條件邏輯(例如「某個元件要不要裝」)需要自己加 if/else
  • 建議把 helmify 的輸出當成草稿,而非最終成品

參考連結

分享這篇
X LinkedIn Facebook Hacker News Reddit

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料