Helm入門

介紹

helm是k8s集羣上的包管理工具,相似centos上的yum,ubuntu上的apt-getnode

基本概念

對於應用發佈者而言,能夠經過helm打包應用,管理應用依賴關係,管理應用版本併發布應用到軟件倉庫。linux

對於使用者而言,使用helm後不用須要瞭解kubernetes的yaml語法並編寫應用部署文件,能夠經過helm下載並在kubernetes上安裝須要的應用。nginx

除此之外,helm還提供了kubernetes上的軟件部署,刪除,升級,回滾應用的強大功能。git

組件說明

helm: kubernetes的應用打包工具,也是命令行工具的名稱。程序員

tiller: helm的服務端,部署在kubernetes集羣中,用於處理helm的相關命令。github

chart: helm的打包格式,內部包含了一組相關的kubernetes資源。web

repoistory: helm的軟件倉庫,repository本質上是一個web服務器,該服務器保存了chart軟件包以供下載,並有提供一個該repository的chart包的清單文件以供查詢。在使用時,helm能夠對接多個不一樣的Repository。docker

release: 使用helm install命令在kubernetes集羣中安裝的Chart稱爲Release。json

在資源管理方面名, helmdocker管理方式相似。ubuntu

helm至關於docker的客戶端

tiller至關於docker的服務端

chart至關於docker的鏡像資源

repoistory至關於docker的遠程倉庫

release至關於運行的容器

安裝

安裝環境

訪問地址:github.com/helm/helm/r…,選擇安裝版本。

由於當前在Mac上安裝,因此下載的MacOS amd64,在linux平臺安裝方式一致。

wget https://get.helm.sh/helm-v2.14.3-darwin-amd64.tar.gz
tar -zxvf helm-v2.14.3-darwin-amd64.tar.gz
mv darwin-amd64/helm /usr/local/bin 
複製代碼

環境初始化

法一

# 初始化tiller服務端環境
helm init --upgrade --tiller-image cnych/tiller:v2.14.3
複製代碼

helm init會拉取sapcc/tiller,可是域名https://gcr.io你可能沒法訪問,可使用cnych/tiller代替。

helm的版本須要和鏡像的版本相同,若是cnych/tiller的標籤中沒有和helm對應的版本,就只能下載sapcc/tiller對應的版本,而且docker tag sapcc/tiller:vxx cnych/tiller:vxx

法二

# 使用阿里雲鏡像安裝並把默認倉庫設置爲阿里雲上的鏡像倉庫
$ helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
複製代碼

檢查安裝狀況

# 驗證 tiller 是否安裝成功
kubectl -n kube-system get pods|grep tiller
# 查看當前Client和Server的版本
helm version
# 卸載已經部署的Tiller
helm reset 
複製代碼

示例

經過一個完整的示例來學習如何使用helm建立、打包、分發、安裝、升級及回退kubernetes應用。

建立一個名稱爲mychart的chart

helm create mychart
複製代碼

執行tree命令

├── Chart.yaml
├── charts
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   ├── ingress.yaml
│   ├── service.yaml
│   └── tests
│       └── test-connection.yaml
└── values.yaml

3 directories, 8 file
複製代碼

Chart.yaml 用於描述這個Chart的相關信息,包括名字、描述信息以及版本等。

values.yaml 用於存儲templates目錄中模板文件中用到變量的值。

NOTES.txt 用於介紹Chart部署後的一些信息,例如:如何使用這個Chart、列出缺省的設置等。

templates 目錄下是yaml文件的模板,該模板文件遵循Go template語法。

templates目錄下yaml文件模板的值默認都是在values.yaml裏定義的,好比在deployment.yaml中定義的容器鏡像image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" 其中的.Values.image.repository的值就是在values.yaml裏定義的nginx.Values.image.tag的值就是stable

若是你須要瞭解更多關於Go模板的相關信息,能夠查看Hugo (gohugo.io) 的一個關於Go模板的介紹 (gohugo.io/templates/g…)。

編寫應用的介紹信息

執行 cat mychart/Chart.yaml

apiVersion: v1
appVersion: "1.0"
description: A Helm chart for kubernetes
name: mychart
version: 0.1.0
複製代碼

編寫具體部署信息

執行 cat mychart/values.yaml

# Default values for mychart.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 1

image:
repository: nginx
tag: stable
pullPolicy: IfNotPresent

service:
type: ClusterIP
port: 80

ingress:
enabled: false
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
path: /
hosts:
- chart-example.local
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local

resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi

nodeSelector: {}

tolerations: []

affinity: {}
複製代碼

檢查依賴和模板配置是否正確

執行 helm lint mychart/,若是文件格式錯誤,能夠根據提示進行修改。

==> Linting .
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, no failures
複製代碼

將應用打包

mychart目錄中執行 helm package . --debug

Successfully packaged chart and saved it to: /home/k8s/mychart-0.1.0.tgz
[debug] Successfully saved /home/k8s/mychart-0.1.0.tgz to /home/k8s/.helm/repository/local
複製代碼

啓動本地倉庫,加入到helm的倉庫列表中

# 啓動,默認端口爲8879
helm serve &
# 加入倉庫列表中 
helm repo add local http://127.0.0.1:8879
# 查看當前的倉庫狀況 
helm repo list
複製代碼

查看charthelm search mychart

NAME         	CHART VERSION	APP VERSION	DESCRIPTION
local/mychart	0.1.0        	1.0        	A Helm chart for kubernetes
複製代碼

部署Chart到集羣中

將chart部署到k8s集羣中。

helm install local/mychart --name mike-test
複製代碼

涉及到鏡像下載,須要等待一下子。

NAME:   mike-test
LAST DEPLOYED: Thu Aug 15 15:18:05 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME               READY  UP-TO-DATE  AVAILABLE  AGE
mike-test-mychart  0/1    1           0          0s

==> v1/Pod(related)
NAME                                READY  STATUS             RESTARTS  AGE
mike-test-mychart-799d666684-k8c49  0/1    ContainerCreating  0         0s

==> v1/Service
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP  PORT(S)  AGE
mike-test-mychart  ClusterIP  10.111.129.121  <none>       80/TCP   0s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=mike-test" -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
複製代碼

執行👆的NOTES的腳本便可在本地訪問Nginx。

使用helm ls查看當前已經部署的chart的狀況.

NAME     	REVISION	UPDATED                 	STATUS  	CHART              	APP VERSION	NAMESPACE
mike-test	1       	Thu Aug 15 15:18:05 2019	DEPLOYED	mychart-0.1.0      	1.0        	default
複製代碼

升級和回退

升級和回退狀況可經過REVISION來判斷。

修改Chart.yaml,將版本號從0.0.1 修改成1.0.0, 而後使用helm package命令打包併發布到本地倉庫。

查看當前chart的版本。

$ mychart helm search mychart -l 
NAME            CHART VERSION   APP VERSION     DESCRIPTION                
local/mychart   1.0.0           1.0             A Helm chart for kubernetes
local/mychart   0.1.0           1.0             A Helm chart for kubernetes
複製代碼

部署新版本的chart

$ helm upgrade mike-test local/mychart        

Release "mike-test" has been upgraded.
LAST DEPLOYED: Thu Aug 15 15:33:02 2019
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME             READY  UP-TO-DATE  AVAILABLE  AGE
testapi-mychart  0/1    1           0          0s

==> v1/Pod(related)
NAME                              READY  STATUS             RESTARTS  AGE
testapi-mychart-57449f4fbc-sv79v  0/1    ContainerCreating  0         0s

==> v1/Service
NAME             TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)  AGE
testapi-mychart  ClusterIP  10.100.150.75  <none>       80/TCP   0s


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=testapi" -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
複製代碼

使用helm查看,REVISION變動爲2,CHART變動成爲mychart-1.0.0,版本發生改變。

$ helm ls                               
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
mike-test       2               Thu Aug 15 15:34:41 2019        DEPLOYED        mychart-1.0.0   1.0             default  
複製代碼

查看Release變更狀況

$ helm history mike-test
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION     
1               Thu Aug 15 15:18:05 2019        SUPERSEDED      mychart-0.1.0   Install complete
2               Thu Aug 15 15:34:41 2019        DEPLOYED        mychart-1.0.0   Upgrade complete
複製代碼

使用helm rollback testapi 1回退到指定的版本

$ helm rollback mike-test 1
$ helm history mike-test     
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION     
1               Thu Aug 15 15:18:05 2019        SUPERSEDED      mychart-0.1.0   Install complete
2               Thu Aug 15 15:34:41 2019        SUPERSEDED      mychart-1.0.0   Upgrade complete
3               Thu Aug 15 15:40:14 2019        DEPLOYED        mychart-0.1.0   Rollback to 1  
$ helm list
NAME            REVISION        UPDATED                         STATUS          CHART           APP VERSION     NAMESPACE
mike-test       3               Thu Aug 15 15:40:14 2019        DEPLOYED        mychart-0.1.0(版本已變動)   1.0             default  
複製代碼

總結

helm做爲k8s應用的包管理以及部署工具,提供了應用打包,發佈,部署,版本管理(升級,回滾)等功能。 helm以軟件的包的形式來管理k8s集羣,對用戶比較友好。

參考文檔

歡迎關注公號:程序員的金融圈

一個探討技術,金融,賺錢的小圈子,爲你提供最有味道的內容,日日更新!

相關文章
相關標籤/搜索