Helm入门

1,287 阅读3分钟

介绍

helm是k8s集群上的包管理工具,类似centos上的yum,ubuntu上的apt-get

基本概念

对于应用发布者而言,可以通过helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。

对于使用者而言,使用helm后不用需要了解kubernetes的yaml语法并编写应用部署文件,可以通过helm下载并在kubernetes上安装需要的应用。

除此以外,helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的强大功能。

组件说明

helm: kubernetes的应用打包工具,也是命令行工具的名称。

tiller: helm的服务端,部署在kubernetes集群中,用于处理helm的相关命令。

chart: helm的打包格式,内部包含了一组相关的kubernetes资源。

repoistory: helm的软件仓库,repository本质上是一个web服务器,该服务器保存了chart软件包以供下载,并有提供一个该repository的chart包的清单文件以供查询。在使用时,helm可以对接多个不同的Repository。

release: 使用helm install命令在kubernetes集群中安装的Chart称为Release。

在资源管理方面名, helmdocker管理方式类似。

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集群,对用户比较友好。

参考文档

欢迎关注公号:程序员的金融圈

一个探讨技术,金融,赚钱的小圈子,为你提供最有味道的内容,日日更新!