helm簡介、安裝、使用
Helm簡介
利用Kubernetes部署一個應用,需要Kubernetes原生資原始檔如deployment、replicationcontroller、service或pod 等。而對於一個複雜的應用,會有很多類似上面的資源描述檔案,如果有更新或回滾應用的需求,可能要修改和維護所涉及的大量資原始檔,且由於缺少對釋出過的應用版本管理和控制,使Kubernetes上的應用維護和更新等面臨諸多的挑戰,而Helm可以幫我們解決這些問題。
Helm架構
Helm基本架構如下:
Helm用途
做為Kubernetes的一個包管理工具,Helm具有如下功能:
- 建立新的chart
- chart打包成tgz格式
- 上傳chart到chart倉庫或從倉庫中下載chart
- 在Kubernetes叢集中安裝或解除安裝chart
- 管理用Helm安裝的chart的釋出週期
Helm有三個重要概念:
- chart:包含了建立Kubernetes的一個應用例項的必要資訊
- config:包含了應用釋出配置資訊
- release:是一個chart及其配置的一個執行例項
Helm元件
Helm有以下兩個組成部分:
Helm Client是使用者命令列工具,其主要負責如下:
- 本地chart開發
- 倉庫管理
- 與Tiller sever互動
- 傳送預安裝的chart
- 查詢release資訊
- 要求升級或解除安裝已存在的release
- Tiller Server是一個部署在Kubernetes叢集內部的server,其與Helm client、Kubernetes API server進行互動。
Tiller server主要負責如下:
- 監聽來自Helm client的請求
- 通過chart及其配置構建一次釋出
- 安裝chart到Kubernetes叢集,並跟蹤隨後的釋出
- 通過與Kubernetes互動升級或解除安裝chart
簡單的說,client管理charts,而server管理髮布release。
Helm實現
Helm client
- Helm client採用go語言編寫,採用gRPC協議與Tiller server互動。
Helm server
- Tiller server也同樣採用go語言編寫,提供了gRPC server與client進行互動,利用Kubernetes client 庫與Kubernetes進行通訊,當前庫使用了REST JSON格式。
- Tiller server 沒有自己的資料庫,目前使用Kubernetes的ConfigMaps儲存相關資訊
Helm安裝
Helm CLINET安裝
1 | tar-zxvfhelm-v2.6.1-linux-amd64.tgz |
3. helm二進位制檔案移到/usr/local/bin目錄。
1 | mvlinux-amd64/helm/usr/local/bin/helm |
Helm TILLER安裝
Helm Tiller是Helm的server,Tiller有多種安裝方式,比如本地安裝或以pod形式部署到Kubernetes叢集中。本文以pod安裝為例,安裝Tiller的最簡單方式是helm init, 該命令會檢查helm本地環境設定是否正確,helm init會連線kubectl預設連線的kubernetes叢集(可以通過kubectl config view檢視),一旦連線叢集成功,tiller會被安裝到kube-system namespace中。
執行helm init,該命令會在當前目錄下建立helm資料夾即~/.helm,並且通過Kubernetes Deployment 部署tiller. 檢查Tiller是否成功安裝:
123 | $ kubectl get po -n kube-systemNAME READY STATUS RESTARTS AGEtiller-deploy-1046433508-rj51m 1/1 Running 0 3m |
Tiller安裝失敗處理
預設情況下由於GFW的關係,tiller的映象會拉取失敗,造成k8s中的tiller pod無法建立完成,當檢視狀態的時候會看到類似以下資訊:
1234567 | $sudokubectlgetpo-nkube-systemNAMEREADYSTATUSRESTARTSAGEkube-addon-manager-minikube1/1Running273dkube-dns-54cccfbdf8-brttd3/3Running673dkubernetes-dashboard-77d8b98585-qwfqj1/1Running273dstorage-provisioner1/1Running273dtiller-deploy-7ccf99cd64-c5zxv0/1ImagePullBackOff07d |
其中tiller pod的狀態為“ImagePullBackOff”,我們可以指定對應的tiller映象為阿里雲地址來解決,如下:
1 | $sudohelminit--upgrade-iregistry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.5.1 |
此外,我們也可以指定預設的helm倉庫地址為阿里雲倉庫地址,如下:
123 | helmreporemovestablehelmrepoaddstablehttps://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartshelmrepoupdate |
Tiller其他安裝形式
– 安裝金絲雀build: –canary-image
– 安裝指定image:–tiller-image
– 指定某一個Kubernetes叢集:–kube-context
– 指定namespace安裝:–tiller-namespace
Helm TILLER刪除
由於 Tiller的資料儲存於Kubernetes ConfigMap中,所以刪除、升降級Tiller,原Helm部署的應用資料並不會丟失。
刪除Tiller:
1 | $ helm reset |
Chart倉庫
chart倉庫用來儲存和分享打包的chart,官方chart倉庫由Kubernetes Charts維護, Helm允許我們建立私有chart倉庫。
建立chart倉庫
chart倉庫是一個可用來儲存index.yml與打包的chart檔案的HTTP server,當要分享chart時,需要上傳chart檔案到chart倉庫。任何一個能能夠提供YAML與tar檔案的HTTP server都可以當做chart倉庫,比如Google Cloud Storage (GCS) bucket、Amazon S3 bucket、Github Pages或建立你自己的web伺服器。
Chart倉庫結構
一個chart倉庫由一個chart包與index.yaml檔案組成,index.yaml記錄了chart倉庫中全部chart的索引,一個本地chart倉庫的佈局例子如下:
123456789101112131415161718192021222324252627282930 | /home/ts1/.helm/|-- cache| `-- archive| |-- drupal-0.9.2.tgz| `-- mariadb-1.0.3.tgz|-- plugins|-- repository| |-- cache| | |-- fantastic-charts-index.yaml| | |-- local-index.yaml -> /home/ts1/.helm/repository/local/index.yaml| | |-- mariadb-1.0.3.tgz-index.yaml| | |-- memcached-1.2.1.tgz-index.yaml| | |-- mychart_xia-0.1.0.tgz-index.yaml| | |-- mysql-0.2.8.tgz-index.yaml| | |-- stable-index.yaml| | |-- test-0.1.0.tgz-index.yaml| | `-- test-0.1.8.tgz-index.yaml| |-- local| | |-- index.yaml| | |-- mychart-0.1.0.tgz| | |-- mychart_xia-0.1.0.tgz| | |-- mysql-0.2.8.tgz| | |-- mysql-6.19.centos-29.tgz| | |-- test-0.1.0.tgz| | |-- test-0.1.8.tgz| | `-- test-0.1.9.tgz| `-- repositories.yaml`-- starters7 directories, 20 files |
~/.helm/repository/local/index.yaml檔案中記錄了chart的諸如名稱、url、version等一些metadata資訊。
12345678910111213141516171819 | apiVersion: v1entries:mychart:- apiVersion: v1created: 2017-09-12T02:28:54.061070032Zdescription: A Helm chart for Kubernetesdigest: ae8d7138002d432014dc8638ec37202823e9207445caf08a660d154b26e936eaname: mycharturls:- http://127.0.0.1:8879/mychart-0.1.0.tgzversion: 0.1.0- apiVersion: v1created: 2017-09-12T03:08:14.02186072Zdescription: A Helm chart for Kubernetesdigest: sha256:2a05defa095d364f4efc789fd2417d07493757ebd74096e5f495c50604cf582dname: mycharturls:- http://127.0.0.1:8879/charts/mychart-0.1.0.tgzversion: 0.1.0 |
建立本地chart倉庫
建立chart倉庫有多種方式,本文以建立一個本地倉庫為例:
123 | $ helm serve –address 0.0.0.0:8879 –repo-path ./charts Regenerating index. This may take a moment. Now serving you on 0.0.0.0:8879 |
管理chart倉庫
上面步驟中,已經建立了一個本地的chart倉庫,接下來講述如何在chart倉庫中維護chart。chart須遵循 SemVer 2 規則填寫正確的版本格式。
一旦chart目錄已經存在,將chart打包,並移動到的一個新建目錄,通過helm repo index 命令將chart的metadata記錄在index.yaml檔案中。
12345 | helm package mychart mkdir fantastic-charts mv mychart-0.1.0.tgz fantastic-charts/ helm repo index fantastic-charts –urlhttp://bjo-ep-dep-039.dev.fwmrm.net:8879/charts |
上傳chart到chart倉庫,通過helm repo add命令上傳chart到chart倉庫:
12 | $ helm repo add fantastic-charts http://bjo-ep-dep-039.dev.fwmrm.net:8879/charts"fantastic-charts" has been added to your repositories |
檢視chart是否上傳倉庫成功:
123 | $ helm repo listNAME URLchartsfantastic-charts http://bjo-ep-dep-039.dev.fwmrm.net:8879/charts |
查詢上傳的chart:
123 | $ helm search mychart -lNAME VERSION DESCRIPTIONlocal/mychart 0.1.0 A Helm chart for Kubernetes |
部署Kubernetes應用
獲取chart
獲取版本為0.2.8的mysql並解壓縮包:
123 | $ helm fetch stable/mysql --version 0.2.8 --untar$ ls mysql/Chart.yaml README.md templates values.yaml |
利用 helm lint 命令檢查下載的chart是否存在問題:
1234 | $ helm lint mysql==> Linting mysqlLint OK1 chart(s) linted, no failures |
建立chart
利用 helm create mychart命令建立一個mychart目錄:
12 | $ helm create mychartCreating mychart |
生成的mychart的檔案結構如下:
123456789101112 | mychart/|-- charts|-- Chart.yaml|-- templates| |-- deployment.yaml| |-- _helpers.tpl| |-- ingress.yaml| |-- NOTES.txt| `-- service.yaml`-- values.yaml2 directories, 7 files |
生成chart目錄裡有Chart.yaml, values.yaml 與 NOTES.txt等檔案,下面分別對chart中幾個重要檔案解釋:
Chart.yaml 包含了chart的meta
- data,描述了Chart名稱、描述資訊與版本。
- values.yaml:儲存了模板檔案變數。
- templates/:記錄了全部模板檔案。
- charts/:依賴chart儲存路徑。
- NOTES.txt:給出了部署後的資訊,例如如何使用chart、列出預設的設定等等。
chart安裝有以下幾種方式:
- 指定chart: helm install stable/mariadb
- 指定打包的chart: helm install ./nginx-1.2.3.tgz
- 指定打包目錄: helm install ./nginx
覆蓋chart中的預設值,通過指定配置檔案方式: