千家信息网

Helm工具的介绍和部署

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,一、Helm概述1)Helm简介Helm是一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tg
千家信息网最后更新 2026年11月01日Helm工具的介绍和部署

一、Helm概述

1)Helm简介

Helm是一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tgz格式的单一文件,方便传输和存储)。我们可以将Helm看作Kubernetes下的apt-get/yum。

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

对于使用者而言,使用Helm后无须了解Kubernetes的yaml文件语法、应用部署文件。直接使用Helm下载即可在Kubernetes上安装需要的应用。

2)Helm组件及相关术语

1)Helm

Helm是一个命令行下的客户端工具。主要用于Kubernetes应用程序Chart的创建、打包、发布及创建和管理本地和远程的Chart仓库。

2)Tiller

Tiller是Helm的服务端,部署在Kubernetes集群中,Tiller用于接收Helm的请求,并根据Chart生成Kubernetes的部署文件,然后提交给Kubernetes创建应用,Tiller还提供和了Release的升级、删除、回滚等一系列功能。

3)Chart

Chart是一个Helm的程序包,包含了运行一个Kubernetes应用程序所需的镜像、依赖关系和资源定义等。

4)Repoistory

Repoistory是Helm的软件仓库,Repository本质上是一个Web服务器,该服务器保存了一系列的Chart软件包以供用户下载,并且提供了该Repository的Chart包的清单文件便于查询。Helm可以同时管理多个不同的Repository。

5)Release

Release是应用程序运行Chart之后,得到的一个实例。

注意:Helm中提到的Release和我们通常概念中的版本有所不同,这里的Release可以理解为Helm使用Chart包部署的一个应用实例。

3)Helm工作原理

Chart install过程:1)Helm从指定的目录或者tgz文件中解析出Chart结构信息;2)Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller;3)Tiller根据Chart和Values生成一个Release;4)Tiller将Release发送给Kubernetes用于生成Release;---Chart update过程:1)Helm从指定的目录或者tgz文件中解析出Chart结构信息;2)Helm将要更新的Release的名称和Chart结构、Values信息传递给Tiller;3)Tiller生成Release并更新指定名称的Release的history;4)Tiller将Release发送给Kubernetes用于更新Release;---Chart Rollback过程:1)Helm将要回滚的Release的名称传递给Tiller;2)Tiller根据Release的名称查找history;3)Tiller从history中获取上一个Release;4)Tiller将上一个Release发送给Kubernetes用于替换当前的Release;

二、部署Helm

1)安装Helm客户端

[root@master ~]# wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz#从Github上下载Helm软件包[root@master ~]# tar zxf helm-v2.14.3-linux-amd64.tar.gz[root@master ~]# mv linux-amd64/helm /usr/local/bin/[root@master ~]# chmod +x /usr/local/bin/helm #获取这个软件包只是为了获取这个helm文件[root@master ~]# echo 'source <(helm completion bash)' >> /etc/profile[root@master ~]# source /etc/profile#设置helm命令可以自动补全并且写入环境变量文件中

2)安装Tiller server

[root@master ~]#  vim tiller-rbac.yaml             #编写yaml文件并创建授权用户apiVersion: v1kind: ServiceAccountmetadata:  name: tiller  namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1beta1kind: ClusterRoleBindingmetadata:  name: tillerroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:  - kind: ServiceAccount    name: tiller    namespace: kube-system[root@master ~]# kubectl apply -f tiller-rbac.yaml  [root@master ~]# helm init --service-account=tiller#指定刚才创建的授权用户初始化helm[root@master ~]# kubectl get pod -n kube-system | grep tillertiller-deploy-8557598fbc-jf85m   0/1     ErrImagePull   0          3m1s#发现pod并没有运行,那是因为该pod使用的是Google的镜像,国内下载不了,需要将镜像换成国内的镜像,这里选择阿里云[root@master ~]# kubectl edit pod -n kube-system tiller-deploy-8557598fbc-jf85m#修改spec字段的image指定的镜像,修改前如下:    image: gcr.io/kubernetes-helm/tiller:v2.14.3#修改后如下:    image: registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3#修改后,如果没有自动下载,就想办法吧,比如说在tiller容器所在的节点手动下载下来镜像,然后重启该节点的kubelet,或重启该容器[root@master ~]# kubectl get pod -n kube-system  | grep tillertiller-deploy-8557598fbc-jf85m   1/1     Running   0          6m31s#必须保证tiller的Pod正常运行

3)配置Helm仓库

[root@master ~]# helm repo list   #查看仓库的详细信息NAME    URL                                             stable  https://kubernetes-charts.storage.googleapis.comlocal   http://127.0.0.1:8879/charts #默认情况下,仓库的地址是某歌,国内无法下载,需要更改为国内的仓库地址[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts#更改为国内阿里云的仓库地址[root@master ~]# helm repo listNAME    URLstable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartslocal   http://127.0.0.1:8879/charts  #再次查看仓库地址,可以发现地址已经换成了阿里云的仓库地址[root@master ~]# helm repo update       # 更新一下Helm仓库[root@master ~]# helm version        #查看helm版本信息Client: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}Server: &version.Version{SemVer:"v2.14.3", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}#必须保证可以查看出来client和server,才可正常使用helm

就此Helm就已经表示部署成功,可以正常使用!

三、使用helm安装mysql+Storage Class

1)创建Storage Class

1)部署nfs
[root@master ~]# yum -y install nfs-utils rpcbind[root@master ~]# mkdir /nfsdata[root@master ~]# echo "/nfsdata *(rw,no_root_squash,sync)" > /etc/exports[root@master ~]# systemctl start nfs-server && systemctl start rpcbind[root@master ~]# showmount -eExport list for master:/nfsdata *
2)创建rbac授权
[root@master ~]# vim rbac-rolebind.yamlapiVersion: v1                            #创建一个用于认证的服务账号kind: ServiceAccountmetadata:  name: nfs-provisioner---apiVersion: rbac.authorization.k8s.io/v1        #创建群集规则kind: ClusterRolemetadata:  name: nfs-provisioner-runnerrules:   -  apiGroups: [""]      resources: ["persistentvolumes"]      verbs: ["get", "list", "watch", "create", "delete"]   -  apiGroups: [""]      resources: ["persistentvolumeclaims"]      verbs: ["get", "list", "watch", "update"]   -  apiGroups: ["storage.k8s.io"]      resources: ["storageclasses"]      verbs: ["get", "list", "watch"]   -  apiGroups: [""]      resources: ["events"]      verbs: ["watch", "create", "update", "patch"]   -  apiGroups: [""]      resources: ["services", "endpoints"]      verbs: ["get","create","list", "watch","update"]   -  apiGroups: ["extensions"]      resources: ["podsecuritypolicies"]      resourceNames: ["nfs-provisioner"]      verbs: ["use"]---kind: ClusterRoleBinding                #将服务认证用户与群集规则进行绑定apiVersion: rbac.authorization.k8s.io/v1metadata:  name: run-nfs-provisionersubjects:  - kind: ServiceAccount    name: nfs-provisioner    namespace: defaultroleRef:  kind: ClusterRole  name: nfs-provisioner-runner  apiGroup: rbac.authorization.k8s.io[root@master ~]# kubectl apply -f rbac-rolebind.yaml
3)创建nfs-deployment.资源
[root@master ~]# vim nfs-deployment.yamlapiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: nfs-client-provisionerspec:  replicas: 1                              #指定副本数量为1  strategy:    type: Recreate                      #指定策略类型为重置  template:    metadata:      labels:        app: nfs-client-provisioner    spec:      serviceAccount: nfs-provisioner            #指定rbac yaml文件中创建的认证用户账号      containers:        - name: nfs-client-provisioner          image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner     #使用的镜像           volumeMounts:            - name: nfs-client-root              mountPath:  /persistentvolumes             #指定容器内挂载的目录          env:            - name: PROVISIONER_NAME           #容器内的变量用于指定提供存储的名称              value: lzj-test            - name: NFS_SERVER                      #容器内的变量用于指定nfs服务的IP地址              value: 192.168.1.1            - name: NFS_PATH                       #容器内的变量指定nfs服务器对应的目录              value: /nfsdata      volumes:                                                #指定挂载到容器内的nfs的路径及IP        - name: nfs-client-root          nfs:            server: 192.168.1.1            path: /nfsdata[root@master ~]# kubectl apply -f nfs-deployment.yaml[root@master ~]# kubectl get pod | grep nfs         #确认pod运行成功nfs-client-provisioner-7cf975c58b-2hbcm   1/1     Running   0          80s
4)创建Storage Class
[root@master ~]# vim storage-class.yamlapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: stateful-nfsprovisioner: lzj-test                  #这个要和nfs-client-provisioner的env环境变量中的PROVISIONER_NAME的value值对应。reclaimPolicy: Retain               #指定回收策略为Retain(手动释放)[root@master ~]# kubectl apply -f storage-class.yaml [root@master ~]# kubectl get sc            #确认Storage Class创建成功NAME           PROVISIONER   AGEstateful-nfs   lzj-test      14s

2)helm部署mysql

[root@master ~]# helm fetch stable/mysql       #将mysql的软件包下载到本地[root@master ~]# tar zxf mysql-0.3.5.tgz [root@master ~]# vim mysql/values.yaml     +55  storageClass: "stateful-nfs"                  #去除注释,并指定刚才创建的Storage Class名称[root@master ~]# vim mysql/values.yaml +79  type: NodePort                                     #默认是ClusterIP,可更改为NodePort[root@master ~]# helm install stable/mysql -f mysql/values.yaml --set mysqlRootPassword=123.com -n test-mysql#如果修改了values.yaml文件的数据,创建时应该指定values.yaml文件  #安装mysql,并设置mysql的root密码为123.com,-n表示指定名称[root@master ~]# helm list               #查看已安装的软件包NAME        REVISION    UPDATED                     STATUS      CHART       APP VERSION NAMESPACEtest-mysql  1           Mon Mar  2 15:14:15 2020    DEPLOYED    mysql-0.3.5             default [root@master ~]# kubectl get svc | grep test-mysql        #确认service类型test-mysql-mysql   NodePort    10.111.61.171           3306:30637/TCP   26m[root@master ~]# kubectl get pv,pvc          #查看PV、PVC是否绑定成功NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                      STORAGECLASS   REASON   AGEpersistentvolume/pvc-2d0d5eb7-1023-436d-b931-0a344a3df990   8Gi        RWO            Delete           Bound    default/test-mysql-mysql   stateful-nfs            27mNAME                                     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGEpersistentvolumeclaim/test-mysql-mysql   Bound    pvc-2d0d5eb7-1023-436d-b931-0a344a3df990   8Gi        RWO            stateful-nfs   27m[root@master ~]# kubectl exec -it test-mysql-mysql-dfb9b6944-tz2vd -- mysql -u root -p123.com#登录到刚才创建的mysql数据库中mysql> 

3)使用helm对mysql进行升级操作

[root@master ~]# kubectl describe pod test-mysql-mysql-dfb9b6944-tz2vd #查看pod的详细信息可以看出,该pod所用镜像为mysql:5.7.14[root@master ~]# helm upgrade --set imageTag=5.7.15 test-mysql stable/mysql -f mysql/values.yaml #对test-mysql这个实例进行镜像的升级,由于更改了service、Storage Class,所以升级时,也需指定values.yaml文件[root@master ~]# kubectl get pod | grep test-mysql        #确保升级之后,pod是正常运行的#注意升级之后,pod名称会发生变化test-mysql-mysql-54c7bfdd77-lrzm8         1/1     Running   0          3m11s[root@master ~]# kubectl describe pod test-mysql-mysql-54c7bfdd77-lrzm8 #查看pod的详细信息,可以看出,镜像已经升级为mysql:5.7.15

4)使用helm对mysql进行回滚操作

[root@master ~]# helm list                #再次查看实例,可以发现"REVISION"字段为2,而初次创建实例时,该列为1,只要对该实例进行升级回滚一次,数值便会加1NAME        REVISION    UPDATED                     STATUS      CHART       APP VERSION NAMESPACEtest-mysql  2           Mon Mar  2 15:48:35 2020    DEPLOYED    mysql-0.3.5             default [root@master ~]# helm history test-mysql           #查看该实例的历史版本REVISION    UPDATED                     STATUS      CHART       DESCRIPTION                   1           Mon Mar  2 15:14:15 2020    SUPERSEDED  mysql-0.3.5 Install complete             2           Mon Mar  2 15:48:35 2020    DEPLOYED    mysql-0.3.5 Upgrade complete   [root@master ~]# helm rollback test-mysql 1              #将该实例回滚到版本1[root@master ~]# helm list        #再次查看,可以看到"REVISION"的值变成了3NAME        REVISION    UPDATED                     STATUS      CHART       APP VERSION NAMESPACEtest-mysql  3           Mon Mar  2 15:57:58 2020    DEPLOYED    mysql-0.3.5             default [root@master ~]# kubectl get pod | grep test-mysql    #确认pod是正常状态#对pod进行回滚操作也会更改pod的名称test-mysql-mysql-dfb9b6944-tj2cr          1/1     Running   1          107s[root@master ~]# kubectl describe pod test-mysql-mysql-dfb9b6944-tj2cr #查看pod的详细信息,可以看出,该pod使用的镜像已经回滚到mysql:5.7.14版本

四、部署helm私有仓库

1)node01节点运行web容器作为私有仓库

[root@node01 ~]# mkdir -p /var/www/charts#创建目录,用于存放charts包[root@node01 ~]# docker run -d -p 8080:80 -v /var/www:/usr/local/apache2/htdocs httpd

2)master节点上,创建chart包并打包

[root@master ~]# helm create testchart #创建chart包(生成的是目录),名称为testchart[root@master ~]# helm package testchart #将刚才生成的目录进行打包,会在当前目录下生成名为testchart-0.1.0.tgz的包

3)master节点生成仓库的index文件

[root@master ~]# mkdir myrepo[root@master ~]# mv testchart-0.1.0.tgz myrepo/#创建用于存放chart包的目录,并将chart包移动到该目录[root@master ~]# helm repo index myrepo/ --url http://192.168.1.2:8080/charts#url路径表示运行web容器的节点IP+端口[root@master ~]# ls myrepo/index.yaml  testchart-0.1.0.tgz#确认已经生成index.yaml文件[root@master ~]# scp myrepo/* node01:/var/www/charts#将生成的index.yaml文件及charts包复制到web容器所在节点映射的本地目录

4)将新repo仓库添加到helm

[root@master ~]#  helm repo add newrepo http://192.168.1.2:8080/charts#url是web容器所在的节点的IP+端口+存放chart包的目录,并指定仓库的名称为newrepo[root@master ~]# helm repo listNAME    URL                               stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartslocal   http://127.0.0.1:8879/charts               newrepo http://192.168.1.2:8080/charts   #stable是刚创建helm添加的阿里云的仓库#local是本地的缓存#newrepo是刚刚添加的仓库名称(确认该仓库已经存在)

配置至此,已经可以正常供内网环境使用这个charts包的私有仓库了,下面是一些验证。

5)搜索可用的chart包并部署

[root@master ~]# helm search testchartNAME                CHART VERSION   APP VERSION DESCRIPTION                local/testchart     0.1.0           1.0         A Helm chart for Kubernetesnewrepo/testchart   0.1.0           1.0         A Helm chart for Kubernetes#local是本地的缓存,不用理会,可以查看到newrepo提供的testchart包[root@master ~]# helm install newrepo/testchart -n test-nginx#既然可以搜索到就表示可以使用chart包创建实例[root@master ~]# kubectl get pod | grep test-nginxtest-nginx-testchart-64d8585997-qjjgb     1/1     Running   0          3m54s#确认pod已经运行成功[root@master ~]# kubectl describe pod test-nginx-testchart-64d8585997-qjjgb #通过查看pod的详细信息,确认pod所使用的镜像

6)更新chart包中所运行服务的镜像

其实就是一个服务版本升级的操作,大概思路如下:修改解压后的charts包目录下的values.yaml文件为所需的值(values.yaml文件包含的是这个服务的值,可以在里面指定镜像及标签、数据持久化的类型等等),修改完成后,再使用下面的命令进行升级操作。

[root@master ~]# helm upgrade -f testchart/values.yaml test-nginx newrepo/testchart#my-nginx是之前实例的名称,可以通过"helm list"查看实例名称#newrepo/testchart :为自定义仓库中的chart包[root@master ~]# kubectl describe pod test-nginx-testchart-6d6984ddd9-gn9sw#确认pod所使用的镜像已经更新

注意

如果使用命令的方式直接进行升级,命令执行完成不会报错,但是镜像并不会更新,推荐使用更改values.yaml的方式进行升级!

7)再次向newrepo仓库上传chart包

[root@master ~]# helm create mychart[root@master ~]# helm package mychart/[root@master ~]# mv mychart-0.1.0.tgz myrepo/[root@master ~]# helm repo index myrepo/ --url http://192.168.1.2:8080/charts#当有新的chart包时,需更新index.yaml文件[root@master ~]# scp myrepo/* node01:/var/www/charts[root@master ~]# helm repo update#如果需要使用则需更新一下本地的仓库[root@master ~]# helm search mychartNAME            CHART VERSION   APP VERSION DESCRIPTION                local/mychart   0.1.0           1.0         A Helm chart for Kubernetesnewrepo/mychart 0.1.0           1.0         A Helm chart for Kubernetes#确保新添加的chart包可以被搜索到

五、Helm常用命令

[root@master ~]# helm version        #查看helm版本信息[root@master ~]# helm list               #查看当前安装的Chart包[root@master ~]# helm search mysql         #查看与mysql相关的chart包[root@master ~]# helm fetch stable/mysql            #将mysql软件包下载到本地[root@master ~]# helm inspect stable/mysql       #查看该软件包的详细信息[root@master ~]# helm install stable/mysql -n mysql        #安装指定的mysql软件包,并命名为mysql[root@master ~]# helm status mysql                 #查看mysql的状态信息[root@master ~]# helm delete --purge mysql       #删除mysql,并将本地的缓存也进行删除[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts#添加阿里云的repo源[root@master ~]# helm repo update              #更新repo仓库资源[root@master ~]# helm create helm_charts       #创建一个chart,名称为helm_charts[root@master ~]# cd helm_charts/ && helm lint       #测试charts语法[root@master ~]# helm package helm_charts  #打包charts[root@master helm_charts]# helm template helm_charts-0.1.0.tgz       #查看该软件包生成的yaml文件


仓库 文件 镜像 名称 目录 信息 升级 应用 实例 容器 软件 生成 更新 服务 运行 软件包 版本 节点 地址 命令 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 互联网科技工作委员会毛军 圆梦互联网科技 上海互联网科技有限公司 深圳互联网科技公司 撒么互联网科技公司 互联网养老 桔豆科技 知域互联网科技有限公司大骗子 宜昌元轩互联网科技有限公司 科技类公司包括互联网吗 互联网数据科技专业 为客找房互联网科技公司怎么样 互联网金融科技公司的优势 北京市互联网新科技 银行科技岗属于互联网吗 互联网金融金融科技 河南商务圈互联网科技有限公司 重庆科技产业互联网有哪些 颐高云石互联网科技 小牛互联网科技有限公司地址 中智农互联网科技 新华互联网科技学校 北京互联网科技 碳银互联网科技有限公司 互联网科技股午盘股票涨跌 元气玛特互联网科技公司是外包吗 南通创西澳互联网科技有限公司 深圳无忧互联网科技 互联网界的黑科技 六子台科技互联网展会
0