K8s 下的應用管理 — 瞭解 Helm

Wi1dcard發表於2020-04-28

Helm 是一款針對 Kubernetes 的「包管理器」,雖說稱它為包管理器,其實與應用開發過程中使用的包管理器略有不同,後者管理的是應用開發過程中的依賴,Helm 則管理著 Kubernetes 中應用部署時各項資源的依賴。

如果你對 Kubernetes 有一定了解,相信你已經對 Deployment、Service、Ingress 等資源有了一定認識,大多數 Web 應用在部署到 K8s 叢集上時需要大量不同型別的資源。你可以將這些資源宣告的 YAML 檔案放在同一個資料夾下管理,但是隨著數量的增加,如何複用這些 YAML、如何靈活又不繁瑣地調整配置以適應不同環境、如何將這些 YAML 作為一個整體管理,成了一個不小的問題。

於是,像 Helm、Ksonnet 這樣的專案出現了。它們的思路大多可以分為兩類 — 模板渲染派和程式碼配置派。Helm 屬於前者。

儘管我個人不是很喜歡 Go template 的語法,以及考慮到 YAML 的縮排層級,可能不太適合使用模板引擎渲染。但不可否認:

  1. Helm 是目前 Kubernetes 圈內應用最廣泛的資源管理器,擁有強大的社群和生態。從官方前期推廣的 chart 倉庫提交記錄就可以看得出來:github.com/helm/charts/commits/mas...
  2. 最近推出的 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 協議》,轉載必須註明作者和本文連結

Former WinForm and PHP engineer. Now prefer Golang and Rust, and mainly working on DevSecOps and Kubernetes.

相關文章