Helm 从入门到实践 | 从 0 开始制作一个 Helm Charts
本周 Helm 官方發布博客,指導用戶從 v2 遷移到 v3,這標志 Helm 逐漸走向成熟。早在今年 6 月,阿里云就正式發布了國內首個 Helm Hub 中國鏡像站:開放云原生應用中心 - Cloud Native App Hub。
歷經三個月的成長和沉淀, Helm Hub 中國鏡像站目前已經實時全量同步了 Helm Hub 的所有內容,同時還精選同步了比如 GitLab 等多個熱門的第三方 Charts Repo,截止今日已總計上線了 859 個 Charts,并且還在不斷增加中。
為了鼓勵和普及 Helm Charts 在國內的使用,幫助國內開發者通過云原生的方式打包和分發自己的應用,從而更好的借助云原生的浪潮,讓自己的軟件在云時代發揮出最大的能量,阿里云舉辦了首屆云原生應用開發大賽,歷經 42 天、最終評選出 33 個 Helm Charts 獲得最受歡迎獎,1 個 Helm Charts 獲得評委選擇獎。所有提交的 Chart 都會經過評委嚴格的測試和評估。
評委選擇獎
? 獲獎作品:etcd-manage
? 作者 GitHub ID:shiguanghuxian
etcd-manage 是一個用 Go 編寫的 etcd 管理工具,具有友好的界面(類似阿里云后臺),管理 key 就像管理本地文件一樣方便。支持簡單權限管理區分只讀和讀寫權限。
? 評委點評
etcd-manage 是一個簡潔的 etcd 管理工具,提供了很不錯的可視化界面,原創性好,實用性強,貼近社區云原生理念。
另一方面可以看到作者在用戶體驗上做的也很到位,對于依賴的數據庫提供了自動安裝和導入外部數據庫兩種選項,文檔也寫的比較全面。
最受歡迎獎
經過幾位評委從技術角度和實用性角度綜合考量,最終有 33 個作品收獲“最受歡迎獎”。
數據截止到 9 月 2 日 10:00
參賽選手的話
? 獲獎作品:redis-operator
? 作者 GitHub ID:SataQiu
云原生是未來!很高興參加本次云原生應用大賽,感謝評委的耐心指導,讓我對云原生有了更為深入的理解,希望以后還能舉辦類似的比賽和活動,我很樂意參加!
? 獲獎作品:etcd-manage
? 作者 GitHub ID:shiguanghuxian
語言表達能力有限,希望 App Hub 中國站能為更多公司和開發者提供便捷的應用發布和服務中間件的部署能力,隨著 K8s 這類服務部署和開發模式的流行 Helm 的應用前景肯定會很美好。
這次參賽加班加點搞定自己應用 2.0 的首版,目標是做一個大家的實用工具,從不知道 Helm 到學習打包應用,從中學到了很多,未來還會開發一些應用,另外希望能借助 Helm 開發一些便捷應用部署的工具。
? 獲獎作品:nvidia-gpu-exporter
? 作者 GitHub ID:wikiios
App Hub 需要更多實用 Helm,云原生應用是不可阻擋的趨勢!
? 獲獎作品:hugo
? 作者 GitHub ID:sunny0826
參加本次云原生應用大賽,不僅使得平時掌握的 Helm 技巧得以施展,同時在與其他參賽者的交流中獲得了很多提升,找到了很多有意思的 charts,受益良多。希望App Hub 不斷地發展,在不久的將來在 K8s 集群上部署云原生應用能像在 CentOS 上使用 yum 安裝一樣方便!
……
如何制作自己的 Helm Charts
我們平時在日常生活中會經常在不同的平臺上與各種各樣的應用打交道,比如從蘋果的 App Store 里下載的淘寶、高德、支付寶等應用,或者是在 PC 端安裝的Word、Photoshop、Steam。這些各類平臺上的應用程序,對用戶而言,大多只需要點擊安裝就可使用。
然而,在云(Kubernetes)上,部署一個應用往往卻不是那么簡單。如果想要部署一個應用程序到云上,首先要準備好它所需要的環境,打包成 Docker 鏡像。進而把鏡像放在部署文件(Deployment)中、配置服務(Service)、應用所需的賬戶(ServiceAccount)及權限(Role)、命名空間(Namespace)、密鑰信息(Secret)、可持久化存儲(PersistentVolumes)等資源。也就是編寫一系列互相相關的 YAML 配置文件,將它們部署在 Kubernetes 集群上。
但是即便應用的開發者可以把這些Docker鏡像存放在公共倉庫中,并且將部署所需的 YAML 資源文件提供給用戶,用戶仍然需要自己去尋找這些資源文件,并把它們一一部署。倘若用戶希望修改開發者提供的默認資源,比如使用更多的副本(Replicas)或是修改服務端口(Port),他還需要自己去查應該在這些資源文件的哪些地方修改,更不用提版本變更與維護會給開發者和用戶造成多少麻煩了。可見最原始的 Kubernetes 應用形態并不便利。
Helm 與 Helm Chart
在這樣的大環境下,有一系列基于 Kubernetes 的應用包管理工具橫空出世。而我們今天的主角 Helm,就是這其中最受歡迎的選擇之一。
開發者按照 Helm Chart 的格式,將應用所需的資源文件包裝起來,通過模版化(Templating)的方式將一些可變字段(比如我們之前提到的暴露哪個端口,使用多少副本)暴露給用戶,最后將封裝好的應用包,也就是 Helm Chart,集中存放在統一的倉庫中供用戶瀏覽下載。
站在用戶角度,用戶只需要一行簡單的命令就可以完成應用的安裝、卸載與升級。對于安裝之后狀態,也可以通過 helm list 或者是原生的 kubectl 進行查詢。
創作 Helm Chart
那么站在開發者的角度上,我們應該如何去創作一個 Helm 應用包呢?
準備工作
首先我們需要一個準備部署的鏡像。這個鏡像可以是一個 Java 程序、一個 Python 腳本、甚至是一個空的 linux 鏡像跑幾條命令。
這里我們使用一個簡單的基于 golang 的。該服務通過讀取環境變量 USERNAME 獲得用戶自己定義的名稱,然后監聽 80 端口。對于任意 HTTP 請求,返回 Hello ${USERNAME}。比如如果設置 USERNAME=world(默認場景),該服務會返回 Hello world。
然后我們使用 對鏡像進行打包。先對 Golang 代碼進行編譯,然后將編譯后的程序放在基于 alpine 的鏡像中,以縮小鏡像體積。
在 Docker 構建好鏡像之后,我們把鏡像上傳到倉庫中,比如 Docker Hub 或是阿里云容器鏡像倉庫。準備工作做好之后,我們就可以開始創作 Helm Chart 了。
開始創作
運行 helm create my-hello-world,會得到一個 helm 自動生成的空 chart。這個 chart 里的名稱是my-hello-world。需要注意的是,Chart 里面的 my-hello-world 名稱需要和生成的 Chart 文件夾名稱一致。如果修改 my-hello-world,則需要做一致的修改。 現在,我們看到 Chart 的文件夾目錄如下:
在根目錄下的 Chart.yaml 文件內,聲明了當前 Chart 的名稱、版本等基本信息,這些信息會在該 Chart 被放入倉庫后,供用戶瀏覽檢索。比如我們可以把 Chart 的 Description 改成 “My first hello world helm chart”。在 Chart.yaml 里有兩個跟版本相關的字段,其中 version 指明的是 Chart 的版本,也就是我們應用包的版本;而 appVersion 指明的是內部實際使用的應用版本。
在 templates 文件夾內存放了各類應用部署所需要使用的 YAML 文件,比如 Deployment 和 Service。在我們當前的應用內,我們只需要一個 deployment,而有的應用可能包含不同組件,需要多個 deployments,那么我們就可以在 templates 文件夾下放置 deploymentA、deploymentB 等。同樣的,如果我們需要配置 serviceaccount、secret、volumes 等內容,也可以在里面添加相應的配置文件。
Helm Chart 對于應用的打包,不僅僅是將 Deployment 和 Service 以及其它資源整合在一起。我們看到 deployment.yaml 和 service.yaml 文件被放在 templates/ 文件夾下,相較于原生的 Kubernetes 配置,多了很多渲染所用的可注入字段。比如在 deployment.yaml 的spec.replicas 中,使用的是 .Values.replicaCount 而不是 Kubernetes 本身的靜態數值。這個用來控制應用在 Kubernetes 上應該有多少運行副本的字段,在不同的應用部署環境下可以有不同的數值,而這個數值便是由注入的 Values 提供。
在根目錄下我們看到有一個 values.yaml 文件,這個文件提供了應用在安裝時的默認參數。在默認的 Values 中,我們看到 replicaCount: 1 說明該應用在默認部署的狀態下只有一個副本。
為了使用我們要部署應用的鏡像,我們看到 deployment.yaml 里在 spec.template.spec.containers 里,image 和 imagePullPolicy 都使用了 Values 中的值。
其中 image 字段由 .Values.image.repository 和 .Chart.AppVersion 組成??吹竭@里,同學們應該就知道我們需要變更的字段了:一個是位于 values.yaml 內的 image.repository,另一個是位于 Chart.yaml 里的 AppVersion。我們將它們與我們需要部署應用的 docker 鏡像匹配起來。這里我們把 values.yaml 里的 image.repository 置成 somefive/hello-world,把 Chart.yaml 里的 AppVersion設置成 1.0.0 即可。
類似的,我們可以查看 service.yaml 內我們要部署的服務,其中的主要配置也在 values.yaml 中。默認生成的服務將 80 端口暴露在 Kubernetes 集群內部。我們暫時不需要對這一部分進行修改。
由于部署的 hello-world 服務會從環境變量中讀取 USERNAME 環境變量,我們將這個配置加入 deployment.yaml。
現在我們的 deployment.yaml 模版會從 values.yaml 中加載 Username 字段,因此相應的,我們也在 values.yaml 中添加 Username: AppHub。現在,我們的應用就會從 values.yaml 中讀取 Username 把它放入鏡像的環境變量中啟動了。
校驗打包
在準備好我們的應用后,我們可以使用 Helm lint 來粗略地檢查一下制作的 Chart 有沒有什么語法上的錯誤。如果沒有問題的話,我們就可以使用 helm package 命令對我們的 Chart 文件夾進行打包,打包后我們可以得到一個 my-hello-world-0.1.0.tgz 的應用包。這個便是我們完成的應用了。
我們可以使用 helm install 命令嘗試安裝一下剛剛做好的應用包,然后用 kubectl 查看一下運行 pod 的狀態。我們可以通過 port-forward 命令將該 pod 的端口映射到本地端口上,這個時候我們就可以通過訪問 localhost 來訪問部署好的應用了。
參數重載
有的同學可能會有疑惑,雖然我們應用開發者把可配置的信息暴露在的 values.yaml 中,用戶使用應用時想要修改該怎么辦呢?答案很簡單,用戶只需要在 install 時使用 set 參數設置想要覆蓋的參數即可。
應用開發者在 Chart 的 values 配置中只是提供了默認的安裝參數,用戶也可以在安裝時指定自己的配置。類似的,如果用戶可以用 upgrade 命令替代 install,實現在原有部署好的應用的基礎上變更配置。
修改提示信息
我們注意到在安裝 Chart 指令運行后,屏幕的輸出會出現:
這里的注釋是由 Chart 中的 templates/NOTES.txt 提供的。我們注意到原始的 NOTES 中,所寫的 "app={{ template "my-hello-world.name" . }},release={{ .Release.Name }}" 和我們的 deployment.yaml 中所寫的配置不太一樣。我們可以把它改成"app.kubernetes.io/name={{ template "my-hello-world.name" . }},app.kubernetes.io/instance={{ .Release.Name }}",將 values.yaml 中的version 更新成 0.1.1。然后重新打包 Chart(運行 helm package)。得到新的 my-hello-world-0.1.1.tgz 之后,升級原有 Chart(運行 helm upgrade my-hello-world-chart-test2 my-hello-world-0.1.1.tgz --set Username="New Chart"),就能看到更新過后的 NOTES 了。
應用分享
那么制作完成的應用如何和其他人分享呢?Helm 官方推出的 ChartMuseum 提供了 Chart 倉庫的構建方法,使用它可以創建自己的 Chart 倉庫。然而自行維護一個倉庫本身成本不小,而且對于用戶而言如果每一個開發者都是自己的倉庫,他就需要將所需應用對應的倉庫都加入自己的檢索列表中,很不利于應用的傳播與分享。
開放云原生應用中心 Cloud Native App Hub,同步了各類應用,同時還提供了開發者上傳應用的渠道。
在我們的開放云原生應用中心中,應用來自兩個渠道。一方面,我們定期從一些國外的知名 Helm 倉庫同步 Chart 資源,在同步的過程中,會對 Chart 內部使用的一部分 Docker 鏡像進行同步替換(例如 gcr.io 或者 quay.io 的鏡像),方便國內用戶訪問使用;另一方面,我們和 Helm 官方庫一樣在 上接受開發者通過 Pull Request 的形式提交自己的應用。提交成功的應用會在短期內同步至云原生應用中心,和其他官方應用展示在一起供其他用戶使用。
希望大家共同參與,讓開放云原生應用中心更加豐富,惠及更多人!
作者簡介:
殷達,清華大學與卡內基梅隆大學計算機專業在讀研究生,于阿里云容器平臺部實習,主要參與ACK容器服務多云技術及云原生應用開發。
掃描下方二維碼添加小助手,與 8000 位云原生愛好者討論技術趨勢,實戰進階!
進群暗號:公司-崗位-城市
總結
以上是生活随笔為你收集整理的Helm 从入门到实践 | 从 0 开始制作一个 Helm Charts的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云原生生态周报 Vol. 19 | He
- 下一篇: 8 分钟了解 Kubernetes