Helm 是一款針對 Kubernetes 的「包管理器」,雖說稱它為包管理器,其實與應用開發過程中使用的包管理器略有不同,後者管理的是應用開發過程中的依賴,Helm 則管理著 Kubernetes 中應用部署時各項資源的依賴。
如果你對 Kubernetes 有一定了解,相信你已經對 Deployment、Service、Ingress 等資源有了一定認識,大多數 Web 應用在部署到 K8s 叢集上時需要大量不同型別的資源。你可以將這些資源宣告的 YAML 檔案放在同一個資料夾下管理,但是隨著數量的增加,如何複用這些 YAML、如何靈活又不繁瑣地調整配置以適應不同環境、如何將這些 YAML 作為一個整體管理,成了一個不小的問題。
於是,像 Helm、Ksonnet 這樣的專案出現了。它們的思路大多可以分為兩類 — 模板渲染派和程式碼配置派。Helm 屬於前者。
儘管我個人不是很喜歡 Go template 的語法,以及考慮到 YAML 的縮排層級,可能不太適合使用模板引擎渲染。但不可否認:
- Helm 是目前 Kubernetes 圈內應用最廣泛的資源管理器,擁有強大的社群和生態。從官方前期推廣的 chart 倉庫提交記錄就可以看得出來:github.com/helm/charts/commits/mas...。
- 最近推出的 Helm 3.0 解決了不少上一個大版本中存在的設計問題(例如 Tiller)。
因此我認為 Helm 仍然是目前的最佳選擇之一。
為了讓讀者有更加直觀的感受,接下來我將簡單介紹一下使用 Helm 部署應用到 Kubernetes 的工作流。
部署社群提供的 Chart
charts 是 Helm 的核心概念之一,包含著 Kubernetes 應用所需的資源模板。在安裝 chart 時修改 values 的值即可調整配置引數。
首先你可以在 hub.helm.sh/ 查詢社群提供的 charts。在安裝之前需要新增 chart repo,repo 內包含 chart 的宣告。例如 bitnami 提供的 chart repo:
helm repo add bitnami https://charts.bitnami.com/bitnami
以 Redis chart 為例,我們可以使用以下命令安裝它,說白了就是部署 chart 內的資源到 Kubernetes 叢集:
helm install my-release bitnami/redis
安裝成功後會出現類似這樣的提示:
NAME: my-release
LAST DEPLOYED: Mon Mar 23 22:24:12 2020
NAMESPACE: staging
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
Redis can be accessed via port 6379 on the following DNS name from within your cluster:
...
其中,my-release
是 release 名稱。Releases 也是 Helm 的概念之一。每次安裝都會產生新的 release,更新時則會產生新的 release revision。你可以使用 helm list
命令檢視當前名稱空間下的所有 releases:
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-release staging 1 2020-03-23 22:24:12.345011 +0800 CST deployed redis-10.5.11 5.0.8
另外,在執行 helm install
命令時,
升級、回滾與刪除
使用 helm upgrade
命令可用於更新 releases,例如當修改了某個 value 的值,需要重新部署應用:
helm upgrade my-release bitnami/redis --set cluster.enabled=false
這裡的 --set
或 --values
選項可以修改特定 value 或指定 YAML 格式的 values 配置檔案。這兩個選項同樣適用於 helm install
命令。
通過 helm history
命令即可檢視某個 release 部署過的歷史 revisons,輸出類似於:
REVISION UPDATED STATUS chart APP VERSION DESCRIPTION
1 Mon Mar 23 22:24:12 2020 superseded redis-10.5.11 5.0.8 Install complete
2 Tue Mar 24 00:17:34 2020 deployed redis-10.5.11 5.0.8 Upgrade complete
Helm 在部署時會將使用 values 渲染出來的資源宣告儲存到 release revison 中。也就是說我們每次安裝、升級 chart 都可回退。當應用因為某些原因需要回滾時,使用 helm rollback
可將所有相關資源回滾到特定 revison 的狀態:
helm rollback my-release # 回滾到上一個 revision
helm rollback my-release n # 回滾到第 n 個 revision
最後,在需要解除安裝應用時使用 helm delete
命令刪除 release 即可:
helm delete my-release
小結
以上是使用 Helm 管理 Kubernetes 資源的大致工作流。可以看出,大多數流程仍然是「程式導向」,而不是「宣告式」的,需要由人工輸入命令、判斷是 install 還是 upgrade。理想的工作流應當將這些過程編寫成配置檔案,並且能夠良好地整合 CI/CD。這一部分我們已經有了相對比較完善的解決方案,我會在下一篇文章為大家詳細介紹。
本作品採用《CC 協議》,轉載必須註明作者和本文連結