特别篇 :从 0 开始创作云原生应用 (殷达)
本節內容的分享主要圍繞以下兩方面
一、 云原生應用是什么?
首先我們來思考一個問題:云原生應用是什么?
在生活中我們會和各種各樣的應用打交道,有時候會在移動端上使用淘寶購物、使用高德導航,在 PC 端使用 word 編輯文稿、使用 Photoshop 處理相片······這些在各類平臺上的應用程序對用戶而言,大多數都只需要用戶點擊安裝就可以使用了。那么對于云上的應用,或者說在我們今天的云上、在 Kubernetes 上的應用,是什么樣子的呢?
想象一下,如果我們要把一個應用程序部署到云上都需要做什么呢?
首先我們要準備好它所需的環境,打包成一個 docker 鏡像,把這個鏡像放到 deployment 中。部署服務、應用所需要的賬戶、權限、匿名空間、秘鑰信息,還有可持久化存儲,這些 Kubernetes 的資源,簡而言之就是要把一堆 yaml 配置文件布置在 Kubernetes 上。
雖然應用的開發者可以把這些鏡像存放在公共的倉庫中,然后把部署所需要的 yaml 的資源文件提供給用戶,當然用戶仍然需要自己去尋找這些資源文件在哪里,并把它們一一部署起來。倘若用戶希望修改開發者提供的默認資源,比如說想使用更多的副本數,或者是修改服務端口,那他還需要自己去查:在這些資源文件中,哪些地方需要相應的修改。同時版本更替和維護,也會給開發者和用戶造成很大的麻煩,所以可以看到最原始的這種 Kubernetes 的應用形態并不是非常的便利。
二、Helm 與 Helm Chart
Helm 是什么?
我們今天的主角:Helm,就在這樣的環境下應用而生。開發者安裝 Helm Chart 的格式,將應用所需要的資源文件都包裝起來,通過模板化的方法,將一些可變的字段,比如說我們之前提到的要暴露哪一個端口、使用多少副本數量,把這些信息都暴露給用戶,最后將封裝好的應用包,也就是我們所說的 Helm Chart 集中存放在統一的倉庫里面供用戶瀏覽下載。
那么對于用戶而言,使用 Helm 一條簡單的命令就可以完成應用的安裝、卸載和升級,我們可以在安裝完成之后使用 kubectl 來查看一下應用安裝后的 pod 的運行狀態。需要注意的是,我們證明使用的是 Helm v3 的一個命令,與目前相對較為成熟的 Helm v2 是有一定的區別的。我們推薦大家在進行學習嘗鮮的過程中使用這個最新的 v3 版本。
如何去創作一個 Helm 應用
站在開發者的角度上,我們應該如何去創作一個 Helm 應用呢?首先我們需要一個準備部署的鏡像,這個鏡像可以是一個 JAVA 程序、一個 Python 腳本,甚至是一個空的 Linux 鏡像,跑幾條命令。
編寫 Golang 程序
如上圖所示,這里我們是用 Golang 編寫一個非常簡單的 Hello World 的 http 服務,并且使用 docker 進行一個打包。Golang 的程序大致是長這個樣子的,包括從環境變量中讀取 pod、username 兩個參數,在指定的端口上提取 http 服務,并返回相應的響應信息。
構建 Docker 鏡像
打包用的 Dockerfile 是長這個樣子的。在這里面,我們首先對 Golang 代碼進行編譯,然后將編譯后的程序放到 03:53 的一個鏡像中來縮小鏡像的體積。我們看到上文所說的兩個環境變量只有 port 在這里面進行一個設置,username 將會在后續作為應用的一個參數報告給用戶,所以在這里面我們先不做設置,在 docker 構建好鏡像之后,我們把這個鏡像上傳到倉庫中,比如說我們可以上傳到 Docker Helm,或者是阿里云鏡像倉庫中。
創建空白應用
準備工作都做完之后,我們可以開始今天的重頭戲,也就是構建這個 Helm Chart 了。首先我們先運行 helm create 的命令,創建一個空白的應用,那么在 create 命令運行完之后,可以看到在這個 Charts 的文件夾下出現了一系列文件和文件夾。
- Charts.yaml 的文件包含了 Helm Chart 的一些基本信息;
- templates 文件夾內則是存放了這個應用所需要的各種 Kubernetes 的資源;
- values.yaml 則是提供了一個默認的參數配置。
Chart 配置
接下來一個一個看:
在根目錄下這個 Charts.yaml 文件內聲明了當前 Chart 的名稱和版本和一些基本信息,那么這些信息會在 chart 被放入倉庫之后,供用戶瀏覽和檢索,比如我們在這里面可以把 chart 的 description 改成 My first hello world helm chart。
在 Charts.yaml 里面,有兩個和版本相關的字段,其中 version 指的是我們當前這個 chart 應用包的版本,而另外一個 appVersion 則指的是我們內部所使用的,比如說在這里面就是我們內部所使用的 Golang 這個程序,我們給它打一個 tag 這個版本。
template 文件夾
在 templates 這個文件夾下,則是存放各種部署應用所需要的 yaml 文件,比如說我們看到的 deployment 和 service。
我們當前的應用實際上只需要一個 deployment,但是有的應用可能包含多個組件,此時就需要在這個 templates 文件夾下放 deploymentA、deploymentB 等多個 yaml 文件。有時候我們還需要去配置一些 service account secret volume 的內容,也是在這里面去添加相應的內容。
在 templates 文件夾下,這個配置文件可以只是單純的 Kubernetes.yaml 配置文件,也可以是配置文件的模板,比如說在這看到 deployment.yaml 文件里面,有很多以 {{ }} 包裹起來的變量,這些以 values 或者是 chart 開頭的這些變量,都是從根目錄下的 chart.yaml 以及 values.yaml 中獲取出來的。
如上圖所示,看到 replicaCount 實際上就是我們所要部署的副本數量,而 repository 則是指定了鏡像的位置。我們之前在 docker 鏡像構建中并沒有設置 username 的環境變量,這里也是通過類似的方式暴露在了 values.yaml 里面。
Helm 在安裝應用的時候,實際上會先去渲染 templates 這個文件夾下的模板文件,將所需要的變量都填入進去,然后再使用渲染后的 kubernetes.yaml 文件進行一個部署,而我們在創建這個 Helm Chart 的過程中,實際上并不需要考慮太多如何去渲染,因為 Helm 已經在客戶端安裝應用的時候幫我們把這些事情都完成了。
校驗與打包
在我們準備好這些應用后,就可以使用 helm lint 命令,來粗略檢查一下我們制作的這個 chart 有沒有語法上的錯誤,如果沒有問題的話,就可以使用 Helm package 命令,對我們的 chart 文件包進行一個打包。打包之后,我們就可以得到一個 tar 的應用包了,這個就是我們所要發布的一個應用。
安裝測試
我們可以使用 Helm install 這個命令來嘗試安裝一下剛剛做好的應用包,然后使用 kubectl 來查看一下 pod 的運行狀態,同樣可以通過 port-forward 命令來把這個 pod 的端口映射到本地的端口上,這樣就可以通過本地的這個 localhost 來訪問到剛剛部署好的這個應用了。
參數覆蓋
有的同學可能會有疑惑:雖然我們應用開發者把這些可配置的信息都暴露在了 values.yanl 里面,用戶使用應用的時候,如果想要修改該怎么辦呢?這個答案其實也很簡單,用戶只需要在 install 的時候使用這個 set 參數設置,把想要設置的參數覆蓋掉就行了。
同樣,如果用戶編寫自己的 my-values.yaml 文件,也可以把這個文件在 install 的時候設置起來,這樣的話,文件中的參數會覆蓋掉原有的一些參數。如果用戶不想重新去 install 一個新的 app,而是想要升級原來的 app,他也只需要用這個 helm upgrade 的命令把這個 Helm install 這個命令替換掉就可以了。
修改 NOTES.txt
細心的同學可能會注意到,之前在執行 Helm install 的命令后,這個提示信息其實是有一些問題的,我們看一下之前所寫的 deployment.yaml 這個文件,里面可以看到,兩個 label 其實是有一定出入的,這個提示信息其實就是在 templates 的 notes 文件下,所以我們只需要到這個文件里面去把這里面的相應信息修改一下就可以了。
升級版本
接下來我們回到 chart.yaml 的文件中,更新一下這個 version 字段,重新做一個打包,這樣我們就可以對原來部署好的應用做這樣一個版本升級了。
應用上傳
制作完成的這個應用應該如何和其他人做分享呢?
Helm 官方是通過了 CHARTMUSEUM 這樣一個工具,用這個工具,大家可以來構建自己的 chart 倉庫,但是自己維護一個 chart 成本會比較高,另外對于使用戶而言,如果它使用每一個應用的開發者都有自己的一個倉庫的話,那這個用戶他就需要去把這些所有的倉庫都加入到自己的檢索列表里面,這個非常麻煩,非常不利于應用的傳播和分享。
三、開放云原生應用中心
應用來源
我們團隊最近推出了一個開放云原生應用中心:Cloud Native App Hub。在這里面,我們同步了各種非常流行的應用,同時還提供了一個開發者上傳自己應用的一個渠道。
提交應用
在開放云原生應用中心,應用主要是來自兩個渠道:
- 一方面我們會定期從一些國外知名的 Helm 倉庫同步 chart 資源,同時將其內部使用的一些 docker 鏡像也一并做這樣的替換。
- 另一方面,我們和 Helm 官方庫一樣,在 GitHub 上,也接受開發者通過 push request 的形式提交自己的應用。
感興趣的同學可以移步我們的云原生應用中心位于 GitHub 上的 chart 倉庫,仿照剛才所講的 chart 制作流程創作自己的 chart,然后提交 push request。
結束語
最后歡迎大家使用 Helm 和阿里云來進行云原生應用的開發。如果有問題或者希望深入交流討論的同學,可以掃碼加入我們的 Kubernetes 釘釘技術大群,和大牛們一起探索技術。今天的介紹就到這里,謝謝大家。
總結
以上是生活随笔為你收集整理的特别篇 :从 0 开始创作云原生应用 (殷达)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes 网络概念及策略控制
- 下一篇: 课时 14 自测题