歡迎光臨
每天分享高質量文章

Helm:強大的Kubernetes包管理工具

Helm是Kubernetes生態系統中的一個軟體包管理工具。本文將介紹為何要使用Helm進行Kubernetes軟體包管理,澄清Helm中使用到的相關概念,並透過一個具體的示例學習如何使用Helm打包,分發,安裝,升級及回退Kubernetes應用。
Kubernetes應用部署的挑戰

讓我們首先來看看Kubernetes,Kubernetes提供了基於容器的應用叢集管理,為容器化應用提供了部署執行、資源排程、服務發現和動態伸縮等一系列完整功能。
Kubernetes的核心設計理念是:使用者定義應用程式的規格,而Kubernetes則負責按照定義的規則部署並執行應用程式,如果應用系統出現問題導致偏離了定義的規格,Kubernetes負責對其進行自動修正。例如應用規格要求部署兩個實體,其中一個實體異常終止了,Kubernetes會檢查到並重新啟動一個新的實體。
使用者透過使用Kubernetes API物件來描述應用程式規格,包括Pod,Service,Volume,Namespace,ReplicaSet,Deployment,Job等等。一般這些物件需要寫入一系列的Yaml檔案中,然後透過Kubernetes命令列工具Kubectl進行部署。
以下麵的WordPress應用程式為例,涉及到多個Kubernetes API物件,這些Kubernetes API物件分散在多個Yaml檔案中。

圖1: WordPress應用程式中涉及到的Kubernetes API物件
可以看到,在進行Kubernetes軟體部署時,我們面臨下述問題:
  • 如何管理,編輯和更新這些這些分散的Kubernetes應用配置檔案?

  • 如何把一套的相關配置檔案作為一個應用進行管理?

  • 如何分發和重用Kubernetes的應用配置?

Helm的引入很好地解決上面這些問題。

Helm是什麼?

很多人都使用過Ubuntu下的ap-get或者CentOS下的yum,這兩者都是Linux系統下的包管理工具。採用apt-get/yum,應用開發者可以管理應用包之間的依賴關係,釋出應用;使用者則可以以簡單的方式查詢、安裝、升級、解除安裝應用程式。
我們可以將Helm看作Kubernetes下的apt-get/yum。Helm是Deis開發的一個用於Kubernetes的包管理器。
對於應用釋出者而言,可以透過Helm打包應用,管理應用依賴關係,管理應用版本併發布應用到軟體倉庫。
對於使用者而言,使用Helm後不用需要瞭解Kubernetes的Yaml語法並編寫應用部署檔案,可以透過Helm下載併在Kubernetes上安裝需要的應用。
除此以外,Helm還提供了Kubernetes上的軟體部署、刪除、升級、回滾應用的強大功能。

Helm元件及相關術語

開始接觸Helm時遇到的一個常見問題就是Helm中的一些概念和術語非常讓人迷惑,我開始學習Helm就遇到這個問題。
因此我們先瞭解一下Helm的這些相關概念和術語。
Helm,Kubernetes的應用打包工具,也是命令列工具的名稱。
Tiller,Helm的服務端,部署在Kubernetes叢集中,用於處理Helm的相關命令。
Chart,Helm的打包格式,內部包含了一組相關的Kubernetes資源。
Repoistory,Helm的軟體倉庫,Repoistory本質上是一個Web伺服器,該伺服器儲存了Chart軟體包以供下載,並有提供一個該Repoistory的Chart包的清單檔案以供查詢。在使用時,Helm可以對接多個不同的Repository。
Release,使用Helm install命令在Kubernetes叢集中安裝的Chart稱為Release。
需要特別註意的是, Helm中提到的Release和我們通常概念中的版本有所不同,這裡的Release可以理解為Helm使用Chart包部署的一個應用實體。
其實Helm中的Release叫做Deployment更合適。估計因為Deployment這個概念已經被Kubernetes使用了,因此Helm才採用了Release這個術語。
下麵這張圖描述了Helm的幾個關鍵元件Helm(客戶端)、Tiller(伺服器)、Repository(Chart軟體倉庫)、Chart(軟體包)之前的關係。

圖2: Helm軟體架構

安裝Helm

下麵我們透過一個完整的示例來介紹Helm的相關概念,並學習如何使用Helm打包、分發、安裝、升級及回退Kubernetes應用。
可以參考Helm的說明檔案https://docs.helm.sh/using_helm/#installing-helm安裝Helm。
採用二進位制的方式安裝Helm:
  1. 下載 Helm https://github.com/kubernetes/helm/releases

  2. 解壓 tar -zxvf helm-v2.0.0-linux-amd64.tgz

  3. 複製到bin目錄 mv linux-amd64/helm /usr/local/bin/helm

然後使用下麵的命令安裝伺服器端元件Tiller:
Helm init

構建一個Helm Chart

讓我們在實踐中來瞭解Helm。這裡將使用一個Go測試小程式,讓我們先為這個小程式建立一個Helm Chart。
git clone https://github.com/zhaohuabing/testapi.git; 
cd testapi
首先建立一個Chart的骨架:
helm create testapi-chart
該命令建立一個testapi-chart目錄,該目錄結構如下所示,我們主要關註目錄中的這三個檔案即可:Chart.yaml、values.yaml和NOTES.txt。
testapi-chart
├── charts
├── Chart.yaml
├── templates
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── NOTES.txt
│   └── service.yaml
└── values.yaml

  • Chart.yaml用於描述這個Chart,包括名字、描述資訊以及版本。

  • values.yaml 用於儲存templates目錄中模板檔案中用到的變數。 模板檔案一般是Go模板。如果你需要瞭解更多關於Go模板的相關資訊,可以檢視Hugo[1]的一個關於Go模板的介紹[2]。

  • NOTES.txt用於向部署該Chart的用於介紹Chart部署後的一些資訊。例如介紹如何使用這個Chart,列出預設的設定等。

開啟Chart.yaml,填寫你部署的應用的詳細資訊,以testapi為例:
apiVersion: v1
description: A simple api for testing and debugging
name: testapi-chart
version: 0.0.1
然後開啟並根據需要編輯values.yaml。下麵是testapi應用的values.yaml檔案內容。
replicaCount: 2
image:
 repository: daemonza/testapi
 tag: latest
 pullPolicy: IfNotPresent
service:
 name: testapi
 type: ClusterIP
 externalPort: 80
 internalPort: 80
resources:
 limits:
   cpu: 100m
   memory: 128Mi
 requests:
   cpu: 100m
   memory: 128Mi
在testapi_chart目錄下執行下麵命令以對Chart進行校驗。
helm lint
==> Linting .
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
如果檔案格式錯誤,可以根據提示進行修改;如果一切正常,可以使用下麵的命令對Chart進行打包:
helm package testapi-chart --debug
這裡添加了–debug引數來檢視打包的輸出,輸出應該類似於:
Saved /Users/daemonza/testapi/testapi-chart/testapi-chart-0.0.1.tgz to current directory
Saved /Users/daemonza/testapi/testapi-chart/testapi-chart-0.0.1.tgz to /Users/daemonza/.helm/repository/local
Chart被打包為一個壓縮包testapi-chart-0.0.1.tgz,該壓縮包被放到了當前目錄下,並同時被儲存到了Helm的本地預設倉庫目錄中。

Helm Repository

雖然我們已經打包了Chart併發布到了Helm的本地目錄中,但透過Helm search命令查詢,並不能找不到剛才生成的Chart包。
helm search testapi
No results found
這是因為Repository目錄中的Chart還沒有被Helm管理。我們可以在本地啟動一個Repository Server,並將其加入到Helm repo串列中。
透過Helm repo list命令可以看到目前Helm中只配置了一個名為stable的repo,該repo指向了Google的一個伺服器。
helm repo list
NAME    URL
stable  https://kubernetes-charts.storage.googleapis.com
使用Helm serve命令啟動一個repo server,該server預設使用’$HELM_HOME/repository/local’目錄作為Chart儲存,併在8879埠上提供服務。
helm serve&
Now serving you on 127.0.0.1:8879
啟動本地repo server後,將其加入Helm的repo串列。
helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories
現在再查詢testapi chart包,就可以找到了。
helm search testapi
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
local/testapi-chart     0.0.1                           A Helm chart for Kubernetes

在Kubernetes中部署Chart

Chart被髮布到倉儲後,可以透過Helm instal命令部署Chart,部署時指定Chart名及Release(部署的實體)名:
helm install local/testapi-chart --name testapi
該命令的輸出應類似:
NAME:   testapi
LAST DEPLOYED: Mon Apr 16 10:21:44 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Service
NAME                   TYPE       CLUSTER-IP    EXTERNAL-IP  PORT(S)  AGE
testapi-testapi-chart  ClusterIP  10.43.121.84         80/TCP   0s
==> v1beta1/Deployment
NAME                   DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
testapi-testapi-chart  1        1        1           0          0s
==> v1/Pod(related)
NAME                                   READY  STATUS   RESTARTS  AGE
testapi-testapi-chart-9897d9f8c-nn6wd  0/1    Pending  0         0s
NOTES:
1. Get the application URL by running these commands:
 export POD_NAME=$(kubectl get pods --namespace default -l "app=testapi-testapi-chart" -o jsonpath="{.items[0].metadata.name}")
 echo "Visit http://127.0.0.1:8080 to use your application"
 kubectl port-forward $POD_NAME 8080:80
使用下麵的命令列出所有已部署的Release以及其對應的Chart。
helm ls
該命令的輸出應類似:
NAME    REVISION        UPDATED                         STATUS          CHART                   NAMESPACE
testapi 1               Mon Apr 16 10:21:44 2018        DEPLOYED        testapi-chart-0.0.1     default
可以看到在輸出中有一個Revision(更改歷史)欄位,該欄位用於表示某一Release被更新的次數,可以用該特性對已部署的Release進行回滾。

升級和回退

修改Chart.yaml,將版本號從0.0.1修改為1.0.0,然後使用Helm package命令打包併發布到本地倉庫。
檢視本地庫中的Chart資訊,可以看到在本地倉庫中testapi-chart有兩個版本:
helm search testapi -l
NAME                    CHART VERSION   APP VERSION     DESCRIPTION
local/testapi-chart     0.0.1                           A Helm chart for Kubernetes
local/testapi-chart     1.0.0                           A Helm chart for Kubernetes
現在用Helm upgrade將已部署的testapi升級到新版本。可以透過引數指定需要升級的版本號,如果沒有指定版本號,則預設使用最新版本。
helm upgrade testapi local/testapi-chart
已部署的testapi release被升級到1.0.0版本。
helm list
NAME    REVISION        UPDATED                         STATUS          CHART                   NAMESPACE
testapi 2               Mon Apr 16 10:43:10 2018        DEPLOYED        testapi-chart-1.0.0     default
可以透過Helm history檢視一個Release的多次更改。
helm history testapi
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION
1               Mon Apr 16 10:21:44 2018        SUPERSEDED      testapi-chart-0.0.1     Install complete
2               Mon Apr 16 10:43:10 2018        DEPLOYED        testapi-chart-1.0.0     Upgrade complete
如果更新後的程式由於某些原因執行有問題,我們則需要回退到舊版本的應用,可以採用下麵的命令進行回退。其中的引數1是前面Helm history中檢視到的Release的更改歷史。
helm rollback testapi 1
使用Helm list命令檢視,部署的testapi的版本已經回退到0.0.1。

helm list
NAME    REVISION        UPDATED                         STATUS          CHART                   NAMESPACE
testapi 3               Mon Apr 16 10:48:20 2018        DEPLOYED        testapi-chart-0.0.1     default

總結

Helm作為Kubernetes應用的包管理以及部署工具,提供了應用打包、釋出、版本管理以及部署、升級、回退等功能。Helm以Chart軟體包的形式簡化Kubernetes的應用管理,提高了對使用者的友好性。

Q&A;

Q:Helm結合CD有什麼好的建議嗎?
A:採用Helm可以把零散的Kubernetes應用配置檔案作為一個Chart管理,Chart原始碼可以和原始碼一起放到Git庫中管理。Helm還簡了在CI/CD Pipeline的軟體部署流程。透過把Chart引數化,可以在測試環境和生產環境可以採用不同的Chart引數配置。
下圖是採用了Helm的一個CI/CD流程:


Q:請問下多環境(test、staging、production)的業務配置如何管理呢?透過Heml打包ConfigMap嗎,比如配置檔案更新,也要重新打Chart包嗎?謝謝,這塊我比較亂。
A:Chart是支援引數替換的,可以把業務配置相關的引數設定為模板變數。使用Helm install Chart的時候可以指定一個引數值檔案,這樣就可以把業務引數從Chart中剝離了。例子:helm install –values=myvals.yaml wordpress。

Q:Helm能解決服務依賴嗎?
A:可以的,在Chart可以透過requirements.yaml宣告對其他Chart的依賴關係。如下麵宣告表明Chart依賴Apache和MySQL這兩個第三方Chart。

dependencies:
 - name: apache
   version: 1.2.3
   repository: http://example.com/charts
 - name: mysql
   version: 3.2.1
   repository: http://another.example.com/charts

Q:Chart的reversion可以自定義嗎,比如跟Git的tag?
A:這位朋友應該是把Chart的version和Release的reversion搞混了,呵呵。 Chart是沒有reversion的,Chart部署的一個實體(Release)才有Reversion,Reversion是Release被更新後自動生成的。

Q:這個簡單例子並沒有看出Helm相比Kubectl有哪些優勢,可以簡要說一下嗎?
A:Helm將Kubernetes應用作為一個軟體包整體管理,例如一個應用可能有前端伺服器,後端伺服器,資料庫,這樣會涉及多個Kubernetes部署配置檔案,Helm就整體管理了。另外Helm還提供了軟體包版本,一鍵安裝、升級、回退。Kubectl和Helm就好比你手工下載安裝一個應用 和使用apt-get安裝一個應用的區別。

Q:如何在Helm install時指定名稱空間?
A:helm install local/testapi-chart –name testapi –namespace mynamespace。
相關連結:
  1. https://gohugo.io

  2. https://gohugo.io/templates/go-templates/


Kubernetes入門與進階實戰培訓

本次培訓內容包括:Docker基礎、容器技術、Docker映象、資料共享與持久化、Docker三駕馬車、Docker實踐、Kubernetes基礎、Pod基礎與進階、常用物件操作、服務發現、Helm、Kubernetes核心元件原理分析、Kubernetes服務質量保證、排程詳解與應用場景、網路、基於Kubernetes的CI/CD、基於Kubernetes的配置管理等,點選瞭解具體培訓內容

5月11日正式上課,點選閱讀原文連結即可報名。
贊(0)

分享創造快樂