你不得不瞭解 Helm 3 中的 5 個關鍵新特性

作者 | Rafal 

導讀:Helm 是 Kubernetes 的一個軟件包管理器。兩個月前,它發佈了第三個主要版本,Helm 3。在這一新版本中,有許多重大變化。本文作者將介紹自己認爲最關鍵的 5 個方面。

移除了 Tiller

Helm 最終移除了其服務器端組件,Tiller。現在,它完全沒有代理。Tiller 之前是一個運行在 Kubernetes 上的小型應用程序,它用於監聽 Helm 命令並處理設置 Kubernetes 資源的實際工作。

這是 Helm3 中最重大的更改。爲什麼 Tiller 的移除備受關注呢?首先,Helm 應該是一種在 Kubernetes 配置上的模板機制。那麼,爲什麼需要在服務器上運行某些代理呢?

Tiller 本身也存在一些問題,因爲它需要集羣管理員的 ClusterRole 才能創建。因此,假設你要在 Google Cloud Platform 中啓動的 Kubernetes 集羣上運行 Helm 應用程序。首先,你需要啓動一個新的 GKE 集羣,然後使用 helm init 初始化 Helm,然後…發現它失敗了。

這種情況之所以會發生是因爲,在默認狀態下,你沒有給你的 kubectl 上下文分配管理員權限。現在你瞭解到了這一點,開始搜索爲分配管理員權限的 magic 命令。這一系列操作下來,也許你已經開始懷疑 Helm 是否真的是一個不錯的選擇。

此外,由於 Tiller 使用的訪問權限與你在 kubectl 上下文中配置的訪問權限不同。因此,你也許可以使用 Helm 創建應用程序,但你可能無法使用 kubectl 創建該程序。這一情況如果沒排查出來,看起來感覺像是安全漏洞。

幸運的是,現在 Tiller 已經被完全移除,Helm 現在是一個客戶端工具。這一更改會導致以下結果:

  • Helm 使用與 kubectl 上下文相同的訪問權限;
  • 你無需再使用 helm init 來初始化 Helm;
  • Release Name 位於命名空間中。

Helm 3 一直保持不變的是:它應該只是一個在 Kubernetes API 上執行操作的工具。如此,如果你可以使用純粹的 kubectl 命令執行某項操作,那麼也可以使用 helm 執行該操作。

分佈式倉庫以及 Helm Hub

Helm 命令可以從遠程倉庫安裝 Chart。在 Helm 3 之前,它通常使用預定義的中心倉庫,但你也能夠添加其他倉庫。但是從現在開始,Helm 將其倉庫模型從集中式遷移到分佈式。這意味着兩個重要的改變:

  • 預定義的中心倉庫被移除;
  • Helm Hub(一個發現分佈式 chart 倉庫的平臺)被添加到 helm search。

爲了能夠更好地理解這一改變,我給你們一個示例。在 Helm 3 之前,如果你想要安裝一個 Hazelcast 集羣,你需要執行以下命令:

$ helm2 install --name my-release stable/hazelcast

現在,這個命令不起作用了。你需要先添加遠程倉庫才能進行安裝。這是因爲這裏不再存在一個預定義中心倉庫。要安裝 Hazelcast 集羣,你首先需要添加其倉庫然後安裝 chart:

$ helm3 repo add hazelcast https://hazelcast.github.io/charts/
$ helm3 repo update
$ helm3 install my-release hazelcast/hazelcast

好消息是現在 Helm 命令可以直接在 Helm Hub 中尋找 Chart。例如,如果你想知道在哪個倉庫中可以找到 Hazelcast,你只需執行以下命令即可:

$ helm3 search hub hazelcast

以上命令列出在 Helm Hub 中所有分佈式倉庫中名稱中包含 “hazelcast” 的 Chart。

現在,我來問你一個問題。移除掉中心倉庫是進步還是退步?這有兩種觀點。第一種是 chart 維護者的觀點。例如,我們維護 Hazelcast Helm Chart,而 Chart 中的每個更改都需要我們將其傳播到中心倉庫中。這項額外的工作使得中心倉庫中的許多 Helm Chart 沒有得到很好地維護。這一情況與我們在 Ubuntu/Debian 包倉庫中所經歷的很相似。你可以使用默認倉庫,但它常常只有舊的軟件包版本。

第二種觀點來自 Chart 的使用者。對於他們來說,雖然現在安裝一個 chart 比之前稍微困難了一些,但另一方面,他們能夠從主要的倉庫中安裝到最新的 chart。

JSON Schema 驗證

從 Helm 3 開始,chart 維護者可以爲輸入值定義 JSON Schema。這一功能的完善十分重要,因爲迄今爲止你可以在 values.yaml 中放入任何你所需的內容,但是安裝的最終結果可能不正確或出現一些難以理解的錯誤消息。
例如,你在 port 參數中輸入字符串而不是數字。那麼你會收到以下錯誤:

$ helm2 install --name my-release --set service.port=string-name hazelcast/hazelcast
Error: release my-release failed: Service in version "v1" cannot be handled as a Service:
v1.Service.Spec: v1.ServiceSpec.Ports: []v1.ServicePort: v1.ServicePort.Port: readUint32:
unexpected character: �, error found in #10 byte of ...|","port":"wrong-name|..., bigger
context ...|fault"},"spec":{"ports":[{"name":"hzport","port":"wrong-name","protocol":
"TCP","targetPort":"hazelca|...

你不得不承認這個問題難以分析和理解。

此外,Helm 3 默認添加了針對 Kubernetes 對象的 OpenAPI 驗證,這意味着發送到 Kubernetes API 的請求將會被檢查是否正確。這對於 Chart 維護者來說,是一項重大利好。

Helm 測試

Helm 測試是一個小小的優化。儘管微小,但它也許實際上鼓勵了維護者來寫 Helm 測試以及用戶在安裝完每個 chart 之後執行 helm test 命令。在 Helm 3 之前,進行測試多少都顯得有些奇怪:

  • 此前測試作爲 Pod 執行(好像需要一直運行);現在你可以將其定義爲 Job;<br />
  • 測試 Pod 不會自動被移除(除非你使用 magic flag –cleanup),所以默認狀態下,沒有任何技巧,對於既定的版本你不能多次執行 helm test。但幸運的是,現在可以自動刪除測試資源(Pod、Job)。

當然舊的測試版本也並非不能使用,只需要使用 Pod 並始終記得執行 helm test –cleanup。但也不得不承認,這一改進有助於提升測試體驗。

命令行語法

最後一點是,Helm 命令語法有所改變。從積極的一面來看,我認爲所有的改變都是爲了讓體驗更好;從消極的方面看,這一語法不與之前的版本兼容。因此,現在編寫有關如何使用 Helm 安裝東西的步驟時,需要明確指出所使用的命令是用於 Helm 2 還是用於 Helm 3。

舉個例子,從 helm install 開始說起。現在版本名稱已經成爲必填參數,儘管在 Helm 2 中你可以忽略它,名稱也能夠自動生成。如果在 Helm3 中要達成相同的效果,你需要添加參數 --generate-name。所以,使用 Helm 2 進行標準的安裝應該如下:

$ helm2 install --name my-release --set service.port=string-
$ helm2 install --name my-release hazelcast/hazelcast

在 Helm 3 中,需要執行以下命令:

$ helm3 install my-release hazelcast/hazelcast

還有另一個比較好的改變是,刪除 Helm 版本後,無需添加— purge。簡單地輸入命令 helm uninstall <release-name> 即可刪除所有相關的資源。

還有一些其他改變,如一些命令被重命名(不過使用舊的名稱作爲別名),有一些命令則被刪除(如 helm init)。如果你還想了解更多關於 Helm 命令語法更改的信息,請參考官方文檔:https://helm.sh/docs/faq/#cli-command-renames

結  論

Helm 3 的發佈,使得這一工具邁向一個新的階段。作爲用戶,我十分喜歡 Helm 現在只是一個單純的客戶端工具。作爲 Chart 維護者,Helm Hub 以及分佈式倉庫的方法深得我心。我希望能在未來看到更多更有意思的改變。

如果你想了解 Helm 3 中的所有變化,請查看官方文檔:https://helm.sh/docs/faq/#changes-since-helm-2

本文轉載自:RancherLabs,點擊查看原文

阿里巴巴雲原生關注微服務、Serverless、容器、Service Mesh 等技術領域、聚焦雲原生流行技術趨勢、雲原生大規模的落地實踐,做最懂雲原生開發者的技術圈。”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章