你不得不了解 Helm 3 中的 5 个关键新特性
作者?|?Rafal
導(dǎo)讀:Helm 是 Kubernetes 的一個(gè)軟件包管理器。兩個(gè)月前,它發(fā)布了第三個(gè)主要版本,Helm 3。在這一新版本中,有許多重大變化。本文作者將介紹自己認(rèn)為最關(guān)鍵的 5 個(gè)方面。
移除了 Tiller
Helm 最終移除了其服務(wù)器端組件,Tiller。現(xiàn)在,它完全沒有代理。Tiller 之前是一個(gè)運(yùn)行在 Kubernetes 上的小型應(yīng)用程序,它用于監(jiān)聽 Helm 命令并處理設(shè)置 Kubernetes 資源的實(shí)際工作。
這是 Helm3 中最重大的更改。為什么 Tiller 的移除備受關(guān)注呢?首先,Helm 應(yīng)該是一種在 Kubernetes 配置上的模板機(jī)制。那么,為什么需要在服務(wù)器上運(yùn)行某些代理呢?
Tiller 本身也存在一些問題,因?yàn)樗枰汗芾韱T的 ClusterRole 才能創(chuàng)建。因此,假設(shè)你要在 Google Cloud Platform 中啟動(dòng)的 Kubernetes 集群上運(yùn)行 Helm 應(yīng)用程序。首先,你需要啟動(dòng)一個(gè)新的 GKE 集群,然后使用 helm init 初始化 Helm,然后…發(fā)現(xiàn)它失敗了。
這種情況之所以會(huì)發(fā)生是因?yàn)?#xff0c;在默認(rèn)狀態(tài)下,你沒有給你的 kubectl 上下文分配管理員權(quán)限。現(xiàn)在你了解到了這一點(diǎn),開始搜索為分配管理員權(quán)限的 magic 命令。這一系列操作下來,也許你已經(jīng)開始懷疑 Helm 是否真的是一個(gè)不錯(cuò)的選擇。
此外,由于 Tiller 使用的訪問權(quán)限與你在 kubectl 上下文中配置的訪問權(quán)限不同。因此,你也許可以使用 Helm 創(chuàng)建應(yīng)用程序,但你可能無法使用 kubectl 創(chuàng)建該程序。這一情況如果沒排查出來,看起來感覺像是安全漏洞。
幸運(yùn)的是,現(xiàn)在 Tiller 已經(jīng)被完全移除,Helm 現(xiàn)在是一個(gè)客戶端工具。這一更改會(huì)導(dǎo)致以下結(jié)果:
- Helm 使用與 kubectl 上下文相同的訪問權(quán)限;
- 你無需再使用 helm init 來初始化 Helm;
- Release Name 位于命名空間中。
Helm 3 一直保持不變的是:它應(yīng)該只是一個(gè)在 Kubernetes API 上執(zhí)行操作的工具。如此,如果你可以使用純粹的 kubectl 命令執(zhí)行某項(xiàng)操作,那么也可以使用 helm 執(zhí)行該操作。
分布式倉庫以及 Helm Hub
Helm 命令可以從遠(yuǎn)程倉庫安裝 Chart。在 Helm 3 之前,它通常使用預(yù)定義的中心倉庫,但你也能夠添加其他倉庫。但是從現(xiàn)在開始,Helm 將其倉庫模型從集中式遷移到分布式。這意味著兩個(gè)重要的改變:
- 預(yù)定義的中心倉庫被移除;
- Helm Hub(一個(gè)發(fā)現(xiàn)分布式 chart 倉庫的平臺(tái))被添加到 helm search。
為了能夠更好地理解這一改變,我給你們一個(gè)示例。在 Helm 3 之前,如果你想要安裝一個(gè) Hazelcast 集群,你需要執(zhí)行以下命令:
$ helm2 install --name my-release stable/hazelcast現(xiàn)在,這個(gè)命令不起作用了。你需要先添加遠(yuǎn)程倉庫才能進(jìn)行安裝。這是因?yàn)檫@里不再存在一個(gè)預(yù)定義中心倉庫。要安裝 Hazelcast 集群,你首先需要添加其倉庫然后安裝 chart:
$ helm3 repo add hazelcast https://hazelcast.github.io/charts/ $ helm3 repo update $ helm3 install my-release hazelcast/hazelcast好消息是現(xiàn)在 Helm 命令可以直接在 Helm Hub 中尋找 Chart。例如,如果你想知道在哪個(gè)倉庫中可以找到 Hazelcast,你只需執(zhí)行以下命令即可:
$ helm3 search hub hazelcast以上命令列出在 Helm Hub 中所有分布式倉庫中名稱中包含 “hazelcast” 的 Chart。
現(xiàn)在,我來問你一個(gè)問題。移除掉中心倉庫是進(jìn)步還是退步?這有兩種觀點(diǎn)。第一種是 chart 維護(hù)者的觀點(diǎn)。例如,我們維護(hù) Hazelcast Helm Chart,而 Chart 中的每個(gè)更改都需要我們將其傳播到中心倉庫中。這項(xiàng)額外的工作使得中心倉庫中的許多 Helm Chart 沒有得到很好地維護(hù)。這一情況與我們?cè)?Ubuntu/Debian 包倉庫中所經(jīng)歷的很相似。你可以使用默認(rèn)倉庫,但它常常只有舊的軟件包版本。
第二種觀點(diǎn)來自 Chart 的使用者。對(duì)于他們來說,雖然現(xiàn)在安裝一個(gè) chart 比之前稍微困難了一些,但另一方面,他們能夠從主要的倉庫中安裝到最新的 chart。
JSON Schema 驗(yàn)證
從 Helm 3 開始,chart 維護(hù)者可以為輸入值定義 JSON Schema。這一功能的完善十分重要,因?yàn)槠駷橹鼓憧梢栽?values.yaml 中放入任何你所需的內(nèi)容,但是安裝的最終結(jié)果可能不正確或出現(xiàn)一些難以理解的錯(cuò)誤消息。
例如,你在 port 參數(shù)中輸入字符串而不是數(shù)字。那么你會(huì)收到以下錯(cuò)誤:
你不得不承認(rèn)這個(gè)問題難以分析和理解。
此外,Helm 3 默認(rèn)添加了針對(duì) Kubernetes 對(duì)象的 OpenAPI 驗(yàn)證,這意味著發(fā)送到 Kubernetes API 的請(qǐng)求將會(huì)被檢查是否正確。這對(duì)于 Chart 維護(hù)者來說,是一項(xiàng)重大利好。
Helm 測試
Helm 測試是一個(gè)小小的優(yōu)化。盡管微小,但它也許實(shí)際上鼓勵(lì)了維護(hù)者來寫 Helm 測試以及用戶在安裝完每個(gè) chart 之后執(zhí)行 helm test 命令。在 Helm 3 之前,進(jìn)行測試多少都顯得有些奇怪:
- 此前測試作為 Pod 執(zhí)行(好像需要一直運(yùn)行);現(xiàn)在你可以將其定義為 Job;
- 測試 Pod 不會(huì)自動(dòng)被移除(除非你使用 magic flag –cleanup),所以默認(rèn)狀態(tài)下,沒有任何技巧,對(duì)于既定的版本你不能多次執(zhí)行 helm test。但幸運(yùn)的是,現(xiàn)在可以自動(dòng)刪除測試資源(Pod、Job)。
當(dāng)然舊的測試版本也并非不能使用,只需要使用 Pod 并始終記得執(zhí)行 helm test –cleanup。但也不得不承認(rèn),這一改進(jìn)有助于提升測試體驗(yàn)。
命令行語法
最后一點(diǎn)是,Helm 命令語法有所改變。從積極的一面來看,我認(rèn)為所有的改變都是為了讓體驗(yàn)更好;從消極的方面看,這一語法不與之前的版本兼容。因此,現(xiàn)在編寫有關(guān)如何使用 Helm 安裝東西的步驟時(shí),需要明確指出所使用的命令是用于 Helm 2 還是用于 Helm 3。
舉個(gè)例子,從 helm install 開始說起。現(xiàn)在版本名稱已經(jīng)成為必填參數(shù),盡管在 Helm 2 中你可以忽略它,名稱也能夠自動(dòng)生成。如果在 Helm3 中要達(dá)成相同的效果,你需要添加參數(shù) --generate-name。所以,使用 Helm 2 進(jìn)行標(biāo)準(zhǔn)的安裝應(yīng)該如下:
$ helm2 install --name my-release --set service.port=string- $ helm2 install --name my-release hazelcast/hazelcast在 Helm 3 中,需要執(zhí)行以下命令:
$ helm3 install my-release hazelcast/hazelcast還有另一個(gè)比較好的改變是,刪除 Helm 版本后,無需添加— purge。簡單地輸入命令 helm uninstall 即可刪除所有相關(guān)的資源。
還有一些其他改變,如一些命令被重命名(不過使用舊的名稱作為別名),有一些命令則被刪除(如 helm init)。如果你還想了解更多關(guān)于 Helm 命令語法更改的信息,請(qǐng)參考官方文檔:https://helm.sh/docs/faq/#cli-command-renames
結(jié)? 論
Helm 3 的發(fā)布,使得這一工具邁向一個(gè)新的階段。作為用戶,我十分喜歡 Helm 現(xiàn)在只是一個(gè)單純的客戶端工具。作為 Chart 維護(hù)者,Helm Hub 以及分布式倉庫的方法深得我心。我希望能在未來看到更多更有意思的改變。
如果你想了解 Helm 3 中的所有變化,請(qǐng)查看官方文檔:https://helm.sh/docs/faq/#changes-since-helm-2
本文轉(zhuǎn)載自:RancherLabs,點(diǎn)擊查看原文。
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢(shì)、云原生大規(guī)模的落地實(shí)踐,做最懂云原生開發(fā)者的技術(shù)圈。”
總結(jié)
以上是生活随笔為你收集整理的你不得不了解 Helm 3 中的 5 个关键新特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调度系统设计精要
- 下一篇: 从零开始入门 K8s | 有状态应用编排