这篇文章将为大家详细讲解有关docker中如何使用helm,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
在k8s中,我们对无状态应用如nginx、myapp,我们可以使用deployment控制器进行伸缩非常容易。
对于有状态应用比如tomcat、redis、etcd单一实例应用,我们使用deployment限制它只有一个实例,其实也是没有任何问题的。
但是,对于有状态应用的多实例,比如redis主从,就不那么容易了。
helm是k8s的另外一个项目,相当于linux的yum。
我们知道,在yum 仓库中,yum不光要解决包之间的依赖关系,还要提供具体的程序包。但是helm仓库里面只有配置清单文件,而没有镜像,镜像还是由镜像仓库来提供,比如hub.docker.com、私有仓库等。
也就是说,helm提供了一个应用所需要的所有清单文件。比如对于一个nginx,我们需要一个deployment的清单文件、一个service的清单文件、一个hpa的清单文件。我们把这三个文件打包到一起,就是一个应用程序的程序包,我们称之为Chart。
一般来说,Chart是一个helm程序包,其实质只是一个模板,我们可以对这个模板进行赋值(value),而形成我们自定义的清单文件,也就实现我们生产个性化的需求。这样的仓库叫Chart仓库(其实就是一个https/http服务器)。
Helm把Kubernetes资源(比如deployments、services或 ingress等) 打包到一个chart中,而chart被保存到chart仓库。通过chart仓库可用来存储和分享chart。
helm是工作在k8s集群之外的。helm不直接操作apiserver,而是和Tiller交互。Tlller再和apiserver交互,最后由Apiserver把chart使用config赋值(值文件),最后部署成为release。
在helm工作中,helm先去检查chart是否存在,存在就把chart下载到helm本机当前用户的家目录下。然后helm把chart交给tiller,tiller再和api server交互。api server一旦把chart部署在k8s集群上,就不再叫chart了,而叫release。
所以,一个chart赋值不同,完全可以部署出多个release出来的,所以我们可以把chart看做是一个安装包的模板。
如果发现chart更新了,helm就自动滚动更新,而且helm还支持一键回滚的操作。
安装helm服务器
helm是安装在k8s集群之外的服务器上的。
可以到如下链接下载helm的安装包:
https://github.com/helm/helm/releases
下载下来后,就是个helm命令,可以直接用:
[root@master linux-amd64]# mv helm /usr/bin/
[root@master linux-amd64]# helm -hThe Kubernetes package managerTo begin working with Helm, run the 'helm init' command:$ helm initThis will install Tiller to your running Kubernetes cluster.It will also set up any necessary local configuration.Common actions from this point include:- helm search: search for charts- helm fetch: download a chart to your local directory to view- helm install: upload the chart to Kubernetes- helm list: list releases of chartsEnvironment: $HELM_HOME set an alternative location for Helm files. By default, these are stored in ~/.helm $HELM_HOST set an alternative Tiller host. The format is host:port $HELM_NO_PLUGINS disable plugins. Set HELM_NO_PLUGINS=1 to disable plugins. $TILLER_NAMESPACE set an alternative Tiller namespace (default "kube-system") $KUBECONFIG set an alternative Kubernetes configuration file (default "~/.kube/config")
我们看到helm部署好了,就是这么简单粗暴。
配置rbac
rbac配置文件样例:https://github.com/helm/helm/blob/master/docs/rbac.md
[root@master helm]# cat tiller-rbac.yaml apiVersion: v1kind: ServiceAccountmetadata: name: tiller namespace: kube-system---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata: name: tillerroleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-adminsubjects: - kind: ServiceAccount name: tiller namespace: kube-system
[root@master helm]# kubectl apply -f tiller-rbac.yaml serviceaccount/tiller createdclusterrolebinding.rbac.authorization.k8s.io/tiller created
[root@master helm]# kubectl get sa -n kube-system |grep tillertiller 1 21m
部署Tiller
[root@master helm]# export NO_PROXY='172.16.0.0/16,127.0.0.0/0' #做过linux代理的可以加这个,不是可以不加这个环境变量
[root@master helm]# helm init --service-account tillerCreating /root/.helm Creating /root/.helm/repository Creating /root/.helm/repository/cache Creating /root/.helm/repository/local Creating /root/.helm/plugins Creating /root/.helm/starters Creating /root/.helm/cache/archive Creating /root/.helm/repository/repositories.yaml Adding stable repo with URL: https://kubernetes-charts.storage.googleapis.com Adding local repo with URL: http://127.0.0.1:8879/charts $HELM_HOME has been configured at /root/.helm.Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installationHappy Helming!
由于 Helm 默认会去 storage.googleapis.com 拉取镜像,如果你当前执行的机器不能访问该域名的话可以使用以下命令来安装:
[root@master helm]# helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
看到tiller 的pod已经运行起来了:
[root@master helm]# kubectl get pods -n kube-system -o wide |grep tillertiller-deploy-759cb9df9-t6b2l 1/1 Running 0 18m 10.244.2.89 node2
看到helm可以工作,并能和k8s集群连接起来了。
[root@master ~]# helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
使用helm
1、更改helm仓库源
helm默认使用的helm源地址是https://kubernetes-charts.storage.googleapis.com 但是由于中国大陆不可描述的原因,需要替换为阿里的helm源。更改方法如下:
[root@master ~]# helm repo remove stable "stable" has been removed from your repositories
[root@master ~]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts"stable" has been added to your repositories
2、查看本地可用helm源
[root@master ~]# helm repo listNAME URL local http://127.0.0.1:8879/charts stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
3、更新helm仓库
[root@master ~]# helm repo updateHang tight while we grab the latest from your chart repositories......Skip local chart repository...Successfully got an update from the "stable" chart repositoryUpdate Complete. ⎈ Happy Helming!⎈
3.在仓库中搜索
[root@master ~]# helm search #列出helm仓库中所有可用的应用
[root@master ~]# helm search mysql #过滤操作NAME CHART VERSIONAPP VERSIONDESCRIPTION stable/mysql 0.3.5 Fast, reliable, scalable, and easy to use open-...stable/percona 0.3.0 free, fully compatible, enhanced, open source d...stable/percona-xtradb-cluster0.0.2 5.7.19 free, fully compatible, enhanced, open source d...stable/gcloud-sqlproxy 0.2.3 Google Cloud SQL Proxy stable/mariadb 2.1.6 10.1.31 Fast, reliable, scalable, and easy to use open-...
4、查看应用详细信息
[root@master ~]# helm inspect stable/mysql
注意:上面的stable是仓库的名字,通过helm repo list显示的就是
5、helm源
https://hub.kubeapps.com/
6、用helm安装软件包
[root@master ~]# helm install --name mysql1 stable/mysql
--name:指定release名字
7、查看安装的软件包
[root@master ~]# helm listNAME REVISIONUPDATED STATUS CHART NAMESPACEmysql11 Wed Oct 17 04:50:58 2018DEPLOYEDmysql-0.3.5default
8、卸载安装的软件包
[root@master ~]# helm delete mysql1release "mysql1" deleted
9、总结
helm常用命令 release管理: install delete upgrade/rollback list history 查看release历史版本 status 获取release状态信息 chart管理: create #创建一个chart,生成基础chart示例性文件,供我们修改用 fetch 下载仓库中的一个char到本地 get inspect package verify
10、helm把安装包会默认下载到当前用户的家目录下
在我们install或者fetch时,都会把安装包下载到当前用户的家目录下:
[root@master archive]# ll /root/.helm/cache/archive/total 8-rw-r--r-- 1 root root 5536 Oct 17 04:50 mysql-0.3.5.tgz
11、修改chart里面的values.yaml,实现个性化安装
[root@master archive]# cd /root/.helm/cache/archive[root@master archive]# lsmysql-0.3.5.tgz[root@master archive]# tar -xvf mysql-0.3.5.tgz
[root@master archive]# tree mysqlmysql├── Chart.yaml #描述chart的├── README.md├── templates #模板文件│ ├── configmap.yaml│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── NOTES.txt│ ├── pvc.yaml│ ├── secrets.yaml│ └── svc.yaml└── values.yaml #自己修改这个文件的相应参数,可以自定义安装包的内容
如果我们有个性化的安装需求,我们可以改values.yaml文件的内容,这个文件放在哪个位置都行,改完后:
[root@master mysql]# helm install --name mysql1 -f /root/values.yaml stable/mysql
注:--name指定的是自定义release名字。
12、查看部署后的提示信息
用helm部署完应用包后,会有很多提示信息,这些提示信息非常重要,但是如果你没有及时记录,有没有办法再查看呢。答案是有的,通过以下办法找到他们:
[root@master ~]# helm status mysql1LAST DEPLOYED: Wed Oct 17 04:50:58 2018NAMESPACE: defaultSTATUS: DEPLOYEDRESOURCES:==> v1/ServiceNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEmysql1-mysql ClusterIP 10.110.40.169 <none> 3306/TCP 15h==> v1beta1/DeploymentNAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGEmysql1-mysql 1 1 1 0 15h==> v1/Pod(related)NAME READY STATUS RESTARTS AGEmysql1-mysql-7b7f7ffcd5-vrs9d 0/1 Pending 0 15h==> v1/SecretNAME TYPE DATA AGEmysql1-mysql Opaque 2 15h==> v1/PersistentVolumeClaimNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEmysql1-mysql Pending 15hNOTES:MySQL can be accessed via port 3306 on the following DNS name from within your cluster:mysql1-mysql.default.svc.cluster.localTo get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql1-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)To connect to your database:1. Run an Ubuntu pod that you can use as a client: kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il2. Install the mysql client: $ apt-get update && apt-get install mysql-client -y3. Connect using the mysql cli, then provide your password: $ mysql -h mysql1-mysql -pTo connect to your database directly from outside the K8s cluster: MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 # Execute the following commands to route the connection: export POD_NAME=$(kubectl get pods --namespace default -l "app=mysql1-mysql" -o jsonpath="{.items[0].metadata.name}") kubectl port-forward $POD_NAME 3306:3306 mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
创建可用自定义chart
1、下载仓库中的一个chart到本地
[root@master helm]# helm fetch stable/mysql[root@master helm]# lsmysql-0.3.5.tgz[root@master helm]#
2、查看chart的目录结构
[root@master helm]# tree mysqlmysql├── Chart.yaml #做个整个chart初始化的,用来对外表明自己的元数据信息,记录当前chart的版本、名称、维护者、内部的维护信息等├── README.md #这是markdown格式的文本文件,这是个自述文件,说明这个chart是怎么开发等内容的介绍|-----requirements.yaml:当前chart是否依赖其他chart,这个文件是可选的。├── templates #所有的模板文件,这些文件是可以复用的,要熟悉go语言才好│ ├── configmap.yaml│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── NOTES.txt #提供给用户的最终显示信息│ ├── pvc.yaml│ ├── secrets.yaml│ └── svc.yaml└── values.yaml #主要为template模板中自定义属性设置默认值的|------ charts/ #里面放置的是当前chart所要依赖的其他chart,这个是可选的1 directory, 10 files
可用查看chart官方手册,来了解每项目的含义:
https://docs.helm.sh/developing_charts/#charts
3、用helm生成基础chart示例性文件
[root@master helm]# helm create myappCreating myapp
注:myapp是chart的名字
[root@master helm]# tree myapp/myapp/├── charts├── Chart.yaml├── templates│ ├── deployment.yaml│ ├── _helpers.tpl│ ├── ingress.yaml│ ├── NOTES.txt│ └── service.yaml└── values.yaml
4、做语法检查
[root@master helm]# lsmyapp[root@master helm]# helm lint myapp==> Linting myapp[INFO] Chart.yaml: icon is recommended1 chart(s) linted, no failures
5、打包
[root@master helm]# lsmyapp [root@master helm]# helm package myapp/Successfully packaged chart and saved it to: /root/helm/myapp-0.1.0.tgz
[root@master helm]# lsmyapp myapp-0.1.0.tgz
看到把myapp打包成了myapp-0.1.0.tgz
6、启动8879仓库的服务
[root@master helm]# helm repo listNAME URL local http://127.0.0.1:8879/charts stablehttps://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
[root@master helm]# helm serveRegenerating index. This may take a moment.Now serving you on 127.0.0.1:8879
7、查看local仓库里面是否有我们创创建的chart包
[root@master ~]# helm search myappNAME CHART VERSIONAPP VERSIONDESCRIPTION local/myapp0.1.0 1.0 A Helm chart for Kubernetes
8、部署我们自定义的chart
[root@master ~]# helm install --name myapp1 local/myapp
9、删除我们部署的chart
[root@master ~]# helm delete --purge myapp1release "myapp1" deleted
关于“docker中如何使用helm”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。