目录
1、为什么需要helm?
![](https://img-blog.csdnimg.cn/228b48fbdb864a1da4f520bd040d97c5.png)
由于Kubernetes缺少对发布的应用版本管理和控制,使得部署的应
用维护和更新等面临诸多的挑战,主要面临以下问题:
• 如何将这些服务作为一个整体管理?
• 这些资源文件如何高效复用?
• 不支持应用级别的版本管理
2、helm介绍
Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前
打包好的yaml文件部署到kubernetes上。
Helm有3个重要概念:
• helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。
• Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
• Release:基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release;将在
k8s中创建出真实运行的资源对象。
![](https://img-blog.csdnimg.cn/58b22697a79e4e089f8993b20c07d02e.png)
3、helm工作流程
![](https://img-blog.csdnimg.cn/75853cb33924445ca91e6f8db5a52d5e.png)
4、使用helm
使用helm很简单,你只需要下载一个二进制客户端包即可,会通过kubeconfig配置(通常
$HOME/.kube/config)来连接Kubernetes。
下载Helm客户端:里面包含helm官网
wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
tar zxvf helm-v3.2.4-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
即可安装成功
Helm管理应用生命周期:
• helm create 制作Chart
• helm install 部署
• helm upgrade 更新
• helm rollback 回滚
• helm uninstall 卸载
创建chart:
helm create mychart
打包chart:
helm package mychart
• Chart.yaml:用于描述这个 Chart的基本信息,包括名字、描述信息以及
版本等。
• values.yaml :用于存储 templates 目录中模板文件中用到变量的值。
• charts:目录里存放这个chart依赖的所有子chart。
• templates: 目录里面存放所有yaml模板文件。
• NOTES.txt :用于介绍Chart帮助信息, helm install 部署后展示给
用户。例如:如何使用这个 Chart、列出缺省的设置等。
• _helpers.tpl:放置模板的地方,可以在整个 chart 中重复使用。
Helm核心是模板,即模板化K8s YAML文件。部署多个应用时,将需要改
动的字段进行模板化,可动态传入
示例
创建一个chart
helm create my-chart
![](https://img-blog.csdnimg.cn/b76418bb44cb4bc1a24e77d8b7435144.png)
进入这个chart
cd my-chart/
结构如下
![](https://img-blog.csdnimg.cn/bb05799a33254e66ba7bd8847b807731.png)
创建一个测试chart文件夹
mkdir chart-demo
cd chart-demo
![](https://img-blog.csdnimg.cn/45289dabb2cc40dfacf8c3ce0c141288.png)
新建一个Chart文件
vi Chart.yaml
apiVersion: v2name: chart-demodescription: A Helm chart for Kubernetestype: applicationversion: 0.1.0 # chart的版本号appVersion: 1.0.0 #chart应用默认的版本
保存
新建一个values.yaml
touch values.yaml
新建一个templates目录
mkdir templates
进入templates目录
cd templates
新建一个deployment.yaml
vi deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata:labels:app: webname: webspec:replicas: 1selector:matchLabels:app: webstrategy: {}template:metadata:labels:app: webspec:containers:- image: nginxname: nginxresources: {}
保存
新建一个service.yaml
vi service.yaml
apiVersion: v1kind: Servicemetadata:labels:app: webname: webspec:ports:- name: 80-80port: 80protocol: TCPtargetPort: 80selector:app: webtype: NodePort
保存
新建一个NOTES.txt
vi NOTES.txt
![](https://img-blog.csdnimg.cn/265ba4057e3a404080e6292d7675ae2e.png)
随便写入一些内容,保存
新建一个_helpers.tpl
touch _helpers.tpl
新建一个templates目录
mkdir templates
此时chart_demo目录结构如下
![](https://img-blog.csdnimg.cn/86d5afd8dee8474fa1720fd61ec44b5d.png)
安装tree工具查看目录结构
yum install tree -y
tree .
![](https://img-blog.csdnimg.cn/3a4702c8f38d430a831ca9bff1773a52.png)
部署这个chart
helm install web /root/chart-demo/
![](https://img-blog.csdnimg.cn/d462fd8625264ba0a9e1fc7c36fee052.png)
命令查看可以看到已经部署成功
helm list
![](https://img-blog.csdnimg.cn/8d8e0da911d34f879a19f0a40b8e20d6.png)
![](https://img-blog.csdnimg.cn/f1125bb3b0c04defb28ceead638a225a.png)
helm模板功能试用
Helm核心是模板,即模板化K8s YAML文件。部署多个应用时,将需要改
动的字段进行模板化,可动态传入
例如,现在要部署一个普通应用,它包含deployment.yaml与service.yaml
可以先将他的变量单独存入values文件中
![](https://img-blog.csdnimg.cn/78c3502ef58049f7b0d49f433fccff4c.png)
vi values.yaml
#这里定义默认变量name: "web2"replicas: 1labels:project: demoapp: nginximage:repository: nginxtag: "latest"service:port: 80targetport: 80type: ClusterIP这样,将常用参数存入values
在deployment.yaml和service.yaml中只需要引用这些参数即可,如下
![](https://img-blog.csdnimg.cn/d755059c58db4a8bb9306fc695a1ae6a.png)
引用方式如下
vi deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata:name: {{ .Values.name }}spec:replicas: {{ .Values.replicas }}selector:matchLabels:project: {{ .Values.labels.project }}app: {{ .Values.labels.app }}strategy: {}template:metadata:labels:project: {{ .Values.labels.project }}app: {{ .Values.labels.app }}spec:containers:- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}name: webresources: {}vi service.yamlapiVersion: v1kind: Servicemetadata:name: {{ .Values.name }}spec:ports:- name: 80-80port: {{ .Values.service.port }}protocol: TCPtargetPort: {{ .Values.service.targetport }}selector:project: {{ .Values.labels.project }}app: {{ .Values.labels.app }}type: {{ .Values.service.type }}
执行可以创建成功
helm install web2 /root/chart-demo/
![](https://img-blog.csdnimg.cn/3a90ba6dff924c88939f989d1b85c2ad.png)
注意:在执行部署命令后面加--dry-run即可看到渲染效果而不执行部署,如下
helm install web2 /root/chart-demo/ --dry-run
![](https://img-blog.csdnimg.cn/9b0ee7187bf1408686f92ec30d28126c.png)
helm动态传参使用
helm除了支持参数在values传递,还支持动态传参,如下
这个命令即可动态覆盖传输,修改原chart里面的值
helm install web3 /root/chart-demo/ --set name="web3" --set image.repository=httpd --set labels.app=httpd
![](https://img-blog.csdnimg.cn/9a2253159b7145cbb18e3d11008925a2.png)
对应的都动态渲染了
![](https://img-blog.csdnimg.cn/53ed8804dc684951afdbfd0a2333d5ff.png)
helm动态文件传参
heml在执行时会默认读取values里面的参数,可以直接引用valus里面的参数部署项目。同时,也可以在执行命令后加--set来动态渲染,覆盖values的参数,,,同时,helm也支持将动态参数都写入一个新的文件,在执行helm时指向这个文件,他会覆盖values内的参数,如下
新建一个abc.yaml的demo
vi abc.yaml
name: "web5"replicas: 3labels:app: nginximage:repository: nginxtag: "1.16"service:type: NodePort
保存
在执行helm部署的时候引用这个文件
helm install web5 /root/chart-demo/ --set name="web4" -f abc.yaml
![](https://img-blog.csdnimg.cn/fe0d65754b774e0bb24824614cfe9d60.png)
成功
![](https://img-blog.csdnimg.cn/e92608f084e04b34ab457ff2ba8a47cf.png)
![](https://img-blog.csdnimg.cn/f4c5095f19a04f4cba8553b5b2c5089a.png)
helm版本管理
升级
更新,例如将abc.yaml中的镜像版本由1.16升级为1.17
vi abc.yaml
name: "web6"replicas: 3labels:project: msapp: nginximage:repository: nginxtag: "1.17"service:type: NodePort
将先前的install换成upgrade就是升级操作,
他要对已经存在的chart进行升级
helm upgrade web6 /root/chart-demo/ -f abc.yaml
通过
helm list
可以看到web6现在有两个版本
![](https://img-blog.csdnimg.cn/b999c7307b594950b10b644b72057511.png)
通过
helm history web6
可以看到web6过去的版本
![](https://img-blog.csdnimg.cn/83ee263c694a4ea886279bfa046b0c91.png)
回滚
helm与普通的deployment回滚最大区别是,helm是应用级别的,他是对整个应用的yaml进行操作,
拓展命令
回滚到上一个版本:
helm rollback web
查看历史版本:
helm history web
回滚到指定版本:
helm rollback web 2
卸载应用:
helm uninstall web
如例,这就是回滚到最开始的版本,服务名后面跟的数字就是版本号
![](https://img-blog.csdnimg.cn/c4149e974fe24fc7a43a423560b7ab95.png)
可以看到。再看web6的历史版本后,会新出一个版本,后面显示是回滚到1版本
![](https://img-blog.csdnimg.cn/f6bccf85ec8a4c11943d4f52d435fd88.png)
卸载应用:
和回滚一样,helm卸载也是应用级别的,不需要一个个服务删除,
卸载命令
helm uninstall xxx
例如,这就是将其他pod删除
![](https://img-blog.csdnimg.cn/883c0354e2644493852d1fb5b2948c17.png)
附属
helm更新时可以添加description来备注信息,如例
查看详细信息的时候可以看到description变成了我们自定义的信息,如下
helm install web7 /root/chart-demo/ --description="nginx:1.17"
![](https://img-blog.csdnimg.cn/4f5dcd2073744235a18b7105c8fc274f.png)
服务打包
helm的chart可以直接打包并复用,如下
chart-demo是我自建的chart
![](https://img-blog.csdnimg.cn/2665e29e63b247b1b4dde665fddf34a4.png)
通过命令将其打包
helm package chart-demo/
![](https://img-blog.csdnimg.cn/5e76285d072c4103b7b67892e3f9fc9b.png)
且这个包可以直接使用不需要解压(
此处加了set变量是因为原chart在这个环境已经运行中,name冲突)
![](https://img-blog.csdnimg.cn/5233f84552bc4f3a95e2f385744fcad8.png)