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

2022-03-17 13:44:10 字數 3748 閱讀 3845

helm是kubernetes的乙個軟體包管理器。兩個月前,它發布了第三個主要版本,helm 3。在這一新版本中,有許多重大變化。本文將介紹我認為最關鍵的5個方面。

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 3一直保持不變的是:它應該只是乙個在kubernetes api上執行操作的工具。如此,如果你可以使用純粹的kubectl命令執行某項操作,那麼也可以使用helm執行該操作。

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

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

$ helm2 install --name my-release stable/hazelcast
現在,這個命令不起作用了。你需要先新增遠端倉庫才能進行安裝。這是因為這裡不再存在乙個預定義中心倉庫。要安裝hazelcast集群,你首先需要新增其倉庫然後安裝chart:

$ helm3 repo add hazelcast 

$ 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。

從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測試以及使用者在安裝完每個chart之後執行helm test命令。在helm 3之前,進行測試多少都顯得有些奇怪:

1、 此前測試作為pod執行(好像需要一直執行);現在你可以將其定義為job。

2、 測試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 hazelcast/hazelcast
在helm 3中,需要執行以下命令:

$ helm3 install my-release hazelcast/hazelcast
還有另乙個比較好的改變是,刪除helm版本後,無需新增—purge。簡單地輸入命令helm uninstall即可刪除所有相關的資源。

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

不得不了解的優質幣

林奇簡介 歡迎加入linkey lky 林奇幣目前在bcex的eth交易區進行交易。從私募價0.68元,現在已到達1.6多元左右。未來值得期待!基本資訊 1.linkey基於區塊鏈底層技術支援下的金融一站式服務平台!落地應用正在逐步推進中!2.linkey總量1.95億,前期流通量5000萬,剩下的...

C 之不得不了解的 類模板

與函式模板基本一致 template classt1,class t2 class person include include using namespace std template class t1 string,classt2 int 看這裡 class person int main 請主...

Redis高階不得不了解的記憶體優化細節

宣告 本文內容來自 redis開發與運維 一書第八章。redis所有的資料都在記憶體中,而記憶體又是非常寶貴的資源。對於如何優化記憶體使用一直是redis使用者非常關注的問題。本文讓我們深入到redis細節中,學習記憶體優化的技巧。分為如下幾個部分 一.redisobject物件 二.縮減鍵值物件 ...