使用 Helm 管理應(yīng)用的一些 Tips
背景
Helm 是一個 Kubernetes 的包管理工具,有點(diǎn)類似于 Mac 上的 brew,Python 中的 PIP;可以很方便的幫我們直接在 kubernetes 中安裝某個應(yīng)用。
比如我們可以直接使用以下命令方便的在 k8s 集群安裝和卸載 MySQL:
helm install my-sql oci://registry-1.docker.io/bitnamicharts/mysql -n mysql
helm uninstall my-mysql -n mysql
對于一些復(fù)雜的應(yīng)用使用 Helm 一鍵安裝會更簡單,以 Pulsar 舉例:
圖片
它有著多個組件,比如 bookkeeper、zookeeper、broker、proxy 等,各個組件還有著依賴關(guān)系。
如果我們手動安裝流程會比較繁瑣,而使用 Helm 時便非常簡單:
helm repo add apache https://pulsar.apache.org/charts
helm install my-pulsar apache/pulsar --version 3.0.0 -n pulsar
當(dāng)然他也只是幫我們生成了部署所需要的 yaml 文件,也沒有太多黑科技。
升級
看似簡單的工具我在實(shí)際線上使用的時候也踩過一個坑,最大的一個問題就是某次升級 Pulsar 的時候生成的 yaml 文件是空的,導(dǎo)致整個集群被刪除了??。
還好最后使用 helm rollback version 將集群恢復(fù)過來了,我們的持久化數(shù)據(jù)也還在。
而出現(xiàn)這個問題的原因是我執(zhí)行了下面這個命令:
helm upgrade pulsar ./charts/pulsar --version 2.9.2 -f charts/pulsar/values-2.10.3.yaml -n pulsar
我們是將 pulsar 的 Helm-Chart 源碼下載到本地,然后修改 value.yaml 的方式執(zhí)行升級的。
當(dāng)時執(zhí)行命令的時候沒有注意,在一個沒有 values-2.10.3.yaml 文件的目錄下執(zhí)行的,導(dǎo)致生成的 yaml 文件是空的,也就導(dǎo)致 k8s 在 pulsar 這個 namespace 下刪除了所有的資源。
模擬升級
為了避免今后再次出現(xiàn)類似的問題,需要在升級前先模擬升級:
helm upgrade pulsar ./charts/pulsar --version 2.9.2 -f charts/pulsar/values-2.10.3.yaml -n pulsar --dry-run --debug > debug.yaml
其中關(guān)鍵的 dry-run 和 debug 參數(shù)可以指定模擬升級和輸出詳細(xì)的內(nèi)容。
這樣我們就可以在升級前先查看 debug.yaml 里的內(nèi)容是不是符合我們的預(yù)期。
對比升級
但這樣并不能直觀的看出哪些地方是我們修改的,還好社區(qū)已經(jīng)有了相關(guān)的插件,可以幫我們高亮顯示修改的地方。
helm plugin install https://github.com/databus23/helm-diff
我們先安裝好這個 helm 插件。
然后在升級前先使用該插件:
helm diff upgrade pulsar ./charts/pulsar --version 2.9.2 -f charts/pulsar/values-2.10.3.yaml -n pulsar
圖片
這樣就可以高亮顯示出修改的內(nèi)容。
不用擔(dān)心這個命令會直接升級,它會自動加上 --dry-run --debug 參數(shù)。
更多命令可以參考官方文檔:https://github.com/databus23/helm-diff
Helm 功能很強(qiáng),在操作生產(chǎn)環(huán)境的時候必須得謹(jǐn)慎,都是血淋淋的教訓(xùn)啊。