1. 程式人生 > >helm簡介、安裝、使用

helm簡介、安裝、使用

Helm簡介

利用Kubernetes部署一個應用,需要Kubernetes原生資原始檔如deployment、replicationcontroller、service或pod 等。而對於一個複雜的應用,會有很多類似上面的資源描述檔案,如果有更新或回滾應用的需求,可能要修改和維護所涉及的大量資原始檔,且由於缺少對釋出過的應用版本管理和控制,使Kubernetes上的應用維護和更新等面臨諸多的挑戰,而Helm可以幫我們解決這些問題。

Helm架構

Helm基本架構如下:

helm_arch.jpg

Helm用途

做為Kubernetes的一個包管理工具,Helm具有如下功能:

  • 建立新的chart
  • chart打包成tgz格式
  • 上傳chart到chart倉庫或從倉庫中下載chart
  • 在Kubernetes叢集中安裝或解除安裝chart
  • 管理用Helm安裝的chart的釋出週期

Helm有三個重要概念:

  1. chart:包含了建立Kubernetes的一個應用例項的必要資訊
  2. config:包含了應用釋出配置資訊
  3. 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.--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中的預設值,通過指定配置檔案方式: