天天看點

初探雲原生應用管理(一): Helm 與 App HubHelm:  K8s 應用部署與打包工具AppHub:  Helm Hub 的中國小站執行個體:用最快的速度部署 GuestbookAppHub 6 個月内的 Roadmap ,都在 Github 上開源!

系列介紹:初探雲原生應用管理系列是介紹如何用雲原生技術來建構、測試、部署、和管理應用的内容專輯。做這個系列的初衷是為了推廣雲原生應用管理的最佳實踐,以及傳播開源标準和知識。通過這個系列,希望幫助大家學到 Kubernetes、Helm、Gitops、Kustomize 等新知識。

這是大廠程式員小張普普通通的一個早晨,大家好像在讨論着什麼:

“什麼?聽說隔壁公司在用 K8s 釋出應用了?”

“據說在用 Helm !”

像往常,小張根本不關心這些無聊的讨論。他穩穩的坐在辦公桌前,打開公司内部自研的、魔改 Gitlab  打造的項目管理系統,點選了好幾個 Button 之後,開始一天辛勤的勞作。

但這一次不知道為何,小張的内心居然有點慌:

“ Helm?啥是 Helm ?”

------ 分割線 ------

Helm:  K8s 應用部署與打包工具

如果一個使用者想要部署起來一個K8s 應用,最快捷的方法是什麼呢?

我們知道,Kubernetes (簡稱 k8s ) 是一個能夠部署和管理容器的平台。然而,在 k8s 裡還沒有抽象到“應用”這一層概念。一個應用往往由多個 k8s 資源 ( Deployment、Service、ConfigMap )組成。是以,我們需要一個工具在 k8s 之上來部署和管理一個應用所包含的資源( K8s API Resource ),這就是 Helm 所做的事情。

除此以外,Helm 定義了一套 Chart 格式來描述一個應用。怎麼了解 Chart 呢?打個比方,一個安卓程式打包成 APK 格式,就可以安裝到任意一台運作安卓系統的手機上。如果我們把 k8s 比做安卓系統,K8s 應用比做安卓程式,那麼 Chart 就可以比做 APK。這也意味着,K8s 應用隻要打包成 Chart ,就可以通過 Helm 部署到任意一個 k8s 叢集上。

通常來說,我們可以直接使用别人已經做好的 Helm Chart ,就跟使用 Docker 鏡像一樣。是以,Helm 社群已經維護了一個官方

Helm Hub

,這個 Hub 裡包含的應用非常豐富,是目前雲原生開發者搜尋和下載下傳應用的主要站點。

AppHub:  Helm Hub 的中國小站

不過,遺憾的是,在國内使用 Helm Hub,對于絕大多數開發者來說都是很痛苦的一件事情。

原因很簡單,随便打開一個 Charts 檔案,你就會看到這個檔案裡充斥着大量的不可通路的鏡像 URL :

初探雲原生應用管理(一): Helm 與 App HubHelm:  K8s 應用部署與打包工具AppHub:  Helm Hub 的中國小站執行個體:用最快的速度部署 GuestbookAppHub 6 個月内的 Roadmap ,都在 Github 上開源!
初探雲原生應用管理(一): Helm 與 App HubHelm:  K8s 應用部署與打包工具AppHub:  Helm Hub 的中國小站執行個體:用最快的速度部署 GuestbookAppHub 6 個月内的 Roadmap ,都在 Github 上開源!

或者是依賴根本通路不到的 Charts  庫:

初探雲原生應用管理(一): Helm 與 App HubHelm:  K8s 應用部署與打包工具AppHub:  Helm Hub 的中國小站執行個體:用最快的速度部署 GuestbookAppHub 6 個月内的 Roadmap ,都在 Github 上開源!

咱們軟體工程師的時間這麼寶貴(少),根本不想花時間解決這些無聊的網絡問題上(大霧)!

可是,看着國外的程式員們通過一條 helm install 指令就把應用部署起來,咱們怎麼感覺還是有點酸呢 ……

是以在正式開始探索雲原生應用管理之前,我們首先要為你介紹一個叫做“開放雲原生應用中心” ( Cloud Native App Hub,簡稱 AppHub ) 的服務,它的首頁是:

https://developer.aliyun.com/hub

AppHub 是一個托管在國内公有雲上、全公益性的 Helm Hub “中國站”,它的後端由阿裡雲容器平台團隊的三位工程師利用 20% 時間開發完成。

而這個站點的一個重要職責,就是把所有 Helm 官方 Hub 托管的應用自動同步到國内;同時,自動将 Charts 檔案中的 gcr.io 等所有有網絡通路問題的 URL 替換成為穩定的國内鏡像 URL 。

這樣,國内的開發者也可以自由的使用 helm install 來安裝應用了!

接下來,我們就進入喜聞樂見的實踐環節!

執行個體:用最快的速度部署 Guestbook

首先,當然是安裝 Helm 。

在這裡我們強烈推薦你使用 Helm v3 版本。

Helm v3 跟 Helm v2 的差別就像 Python 2 和 3 那麼大,而且還比 Helm v2 要好用的多(比如:不需要安裝服務端元件 Tiller)。我們下周的《為什麼你必須盡快轉向 Helm v3 》文章,會為你解釋這個事情。

而為了友善國内開發者使用,我們已經自動同步了 Helm  v3 二進制檔案的下載下傳連結到國内(一定要試,真的是秒下):

下載下傳到 Helm 二進制檔案直接解壓到 $PATH 下就可以使用了。

接下來,我們使用 Helm 快速部署一個 guestbook 應用。這裡假設你有一個阿裡雲 Kubernetes 服務在運作了(如果沒有的話也沒關系,下面還有自建 K8s 叢集的例子)。

第一步是添加 apphub 作為你的 Helm Hub Repo:

$ helm repo add apphub https://apphub.aliyuncs.com           

可以直接在指令行搜尋 guestbook:

$ helm search guestbook
NAME                       CHART VERSION   APP VERSION DESCRIPTION
apphub/guestbook           0.2.0           1.0.0       A Helm chart to deploy Guestbook three tier web...           

然後,隻需一行指令即可:

$ helm install guestbook apphub/guestbook           

通路 Guestbook 服務

部署完成後,運作以下指令來查詢并等待 pods 啟動完畢 ( Running ):

$ kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
guestbook-d85895895-5mdx6   1/1     Running   0          5m59s
guestbook-d85895895-zh4l4   1/1     Running   0          5m59s
redis-master-7b5cc58fc8-2wjmn          1/1     Running   0          5m59s
redis-slave-859585ff7f-4v9hj           1/1     Running   0          5m59s
redis-slave-859585ff7f-fppqn           1/1     Running   0          5m59s           

查詢服務位址:

$kubectl get service -l app.kubernetes.io/name=guestbook
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
guestbook   LoadBalancer   172.21.1.213   47.95.136.189   3000:32244/TCP   11m           

通過 External IP 即可通路 guestbook 服務:

初探雲原生應用管理(一): Helm 與 App HubHelm:  K8s 應用部署與打包工具AppHub:  Helm Hub 的中國小站執行個體:用最快的速度部署 GuestbookAppHub 6 個月内的 Roadmap ,都在 Github 上開源!

使用 Minikube 或者自建 K8s 叢集?

實際上,K8s 本身是不區分雲上服務還是自建叢集的。隻不過在沒有雲提供的負載均衡服務的話,Service 的通路方式會稍微麻煩一些,比如使用 NodePort :

$ helm install guestbook apphub/guestbook --set service.type=NodePort           

這條指令執行完之後,應用會自動提示你接下來的通路方式。而通過--set 這種方式設定應用參數到底是怎麼回事,我們後面的文章會細聊。

如果是 Minikube 的話,還需要把這個 NodePort Service 從 Minikube 裡映射出來才能通路:

$ minikube service guestbook           

試用“一鍵安裝” (體驗功能)

除了正常的部署方法, AppHub 上也可以通過網頁 UI 來體驗一鍵部署 Chart 到任何雲的 k8s 上。

舉個例子,隻需打開

guestbook 應用詳情頁面

,點選 “一鍵安裝”:

初探雲原生應用管理(一): Helm 與 App HubHelm:  K8s 應用部署與打包工具AppHub:  Helm Hub 的中國小站執行個體:用最快的速度部署 GuestbookAppHub 6 個月内的 Roadmap ,都在 Github 上開源!

然後在”安裝參數“彈窗裡填寫相應的伺服器 URL 和 base64 編碼的證書資料後,點選“确認”,AppHub 就會嘗試安裝 guestbook chart 到對應 k8s 叢集上,成功後會彈窗通知。

不過,這個功能目前隻是“體驗”,因為你現在還沒辦法在 AppHub 上直接修改應用的配置參數。線上進行“應用定制”的功能就在 AppHub 的 Roadmap 裡,預計下個月會上線。

不過,說起 Roadmap 的話:

AppHub 6 個月内的 Roadmap ,都在 Github 上開源!

是的,你可以

通過 Github

來随時對這個 Helm Hub 中國小站點提出你的改進思路。比如:如何更好的做“應用定制”?如何對接和托管你自己的 Charts Repo ?等等。

我們的口号是:每一位中國開發者,都是我們的 PM !(認真臉)

遠不止 Helm !

可以看到,通過 Helm 快速部署起來K8s 應用的過程,使用門檻和心智負擔都是非常低的。而相比于傳統的應用建構、編排和釋出的流程,Helm + K8s 的自動化組合正在迅速成為雲時代提升開發者效率的不二法寶。

而這裡介紹到的所有同步自官方 Hub Repo 的應用 Charts ,全都托管在這個 Github 上:

cloudnativeapp/charts

。大家有對 AppHub 相關的任何吐槽,都歡迎來這個 Repo 提 issue ;也歡迎來通過送出 pull requests 把你的 Charts 和 Repo 加入到 AppHub 上。

不過,如果深入使用過 Helm 一段時間後,你可能會有些其他的感受:

比如: “Helm 裡的 Release 的概念到底是啥意思? Helm 的 Rollback 又是咋回事兒,跟 K8s 是啥關系?”

“Helm 對 K8s 應用管理的流程,好像不是那麼的 Native 啊,總感覺哪裡不對啊。”

在後面的幾篇文章中,我們會和大家一起深入的分析 Helm 這套體系的優點和缺點,梳理在 K8s 架構中使用 Helm 的最佳實踐,分享和講解 Kustomize 流程和 GitOps 架構,以及更多的雲原生應用管理的執行個體。

敬請期待吧!

作者簡介: 鄧洪超,阿裡雲工程師,前 CoreOS 軟體工程師、Kubernetes Operator 機制的初始作者之一、Operator 第二人(因為第一人是李響),對 K8s 應用管理體系有較多的研究和經驗。

繼續閱讀