千家信息网

Helm工具的介绍和部署

发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,一、Helm概述1)Helm简介Helm是一个用于kubernetes的包管理器。每个包称为一个Chart,一个Chart是一个目录(一般情况下会将目录进行打包压缩,形成name-version.tg
千家信息网最后更新 2024年11月30日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文件


0