使用Helm管理Kubernetes应用
读完本文后您应该可以自己创建chart,并创建自己的私有chart仓库。
Helm是一个kubernetes应用的包管理工具,用来管理charts——预先配置好的安装包资源,有点类似于Ubuntu的APT和CentOS中的yum。
Helm chart是用来封装kubernetes原生应用程序的yaml文件,可以在你部署应用的时候自定义应用程序的一些metadata,便与应用程序的分发。
Helm和charts的主要作用:
应用程序封装
版本管理
依赖检查
便于应用程序分发
安装Helm
前提要求
Kubernetes1.5以上版本
集群可访问到的镜像仓库
执行helm命令的主机可以访问到kubernetes集群
安装步骤
首先需要安装helm客户端
curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh创建tiller的serviceaccount和clusterrolebinding
然后安装helm服务端tiller,目前最新版 v2.14.2,若无法访问 gcr.io,可以使用阿里云镜像,如:
我们使用-i指定自己的镜像,因为官方的镜像因为某些原因无法拉取,官方镜像地址是:gcr.io/kubernetes-helm/tiller:v2.14.2,使用helm version可查看helm客户端版本。
为应用程序设置serviceAccount:
检查是否安装成功:
创建自己的chart
我们创建一个名为mychart的chart,看一看chart的文件结构。
模板
Templates目录下是yaml文件的模板,遵循Go template语法。使用过Hugo的静态网站生成工具的人应该对此很熟悉。
我们查看下deployment.yaml文件的内容。
这是该应用的Deployment的yaml配置文件,其中的双大括号包扩起来的部分是Go template,其中的Values是在values.yaml文件中定义的:
比如在Deployment.yaml中定义的容器镜像image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"其中的:
.Values.image.repository就是nginx.Values.image.tag就是stable
以上两个变量值是在create chart的时候自动生成的默认值。
我们将默认的镜像地址和tag改成我们自己的镜像harbor-001.jimmysong.io/library/nginx:1.9。
检查配置和模板是否有效
当使用kubernetes部署应用的时候实际上讲templates渲染成最终的kubernetes能够识别的yaml格式。
使用helm install --dry-run --debug <chart_dir>命令来验证chart配置。该输出中包含了模板的变量配置与最终渲染的yaml文件。
我们可以看到Deployment和Service的名字前半截由两个随机的单词组成,最后才是我们在values.yaml中配置的值。
部署到kubernetes
在mychart目录下执行下面的命令将nginx部署到kubernetes集群上。
现在nginx已经部署到kubernetes集群上,本地执行提示中的命令在本地主机上访问到nginx实例。
在本地访问http://127.0.0.1:8080即可访问到nginx。
查看部署的relaese
删除部署的release
打包分享
我们可以修改Chart.yaml中的helm chart配置信息,然后使用下列命令将chart打包成一个压缩文件。
打包出mychart-0.1.0.tgz文件。
依赖
我们可以在requirements.yaml中定义应用所依赖的chart,例如定义对mariadb的依赖:
使用helm lint .命令可以检查依赖和模板配置是否正确。
安装源
使用第三方chat库
添加fabric8库
搜索fabric8提供的工具(主要就是fabric8-platform工具包,包含了CI、CD的全套工具)
我们在前面安装chart可以通过HTTP server的方式提供。
访问http://localhost:8879可以看到刚刚安装的chart。

点击链接即可以下载chart的压缩包。
注意事项
下面列举一些常见问题,和在解决这些问题时候的注意事项。
服务依赖管理
所有使用helm部署的应用中如果没有特别指定chart的名字都会生成一个随机的Release name,例如romping-frog、sexy-newton等,跟启动docker容器时候容器名字的命名规则相同,而真正的资源对象的名字是在YAML文件中定义的名字,我们成为App name,两者连接起来才是资源对象的实际名字:Release name-App name。
而使用helm chart部署的包含依赖关系的应用,都会使用同一套Release name,在配置YAML文件的时候一定要注意在做服务发现时需要配置的服务地址,如果使用环境变量的话,需要像下面这样配置。
这是使用了Go template的语法。至于{{ .Values.image.env.SERVICE_NAME }}的值是从values.yaml文件中获取的,所以需要在values.yaml中增加如下配置:
解决本地chart依赖
在本地当前chart配置的目录下启动helm server,我们不指定任何参数,直接使用默认端口启动。
将该repo加入到repo list中。
在浏览器中访问http://localhost:8879可以看到所有本地的chart。
然后下载依赖到本地。
这样所有的chart都会下载到本地的charts目录下。
设置helm命令自动补全
为了方便helm命令的使用,helm提供了自动补全功能,如果使用zsh请执行:
如果使用bash请执行:
部署MEAN测试案例
MEAN是用来构建网站和web应用的免费开源的JavaScript软件栈,该软件栈包括MongoDB、Express.js、Angular和Node.js。
下载charts
缺少mongodb的依赖,需要更新一下chart。
注:https://kubernetes-charts.storage.googleapis.com/是Google维护的chart库,访问该地址可以看到所有的chart列表。
所有的image都在 values.yaml 文件中配置。
下载缺失的chart。
修改mongodb chart配置
将刚才下载的charts/mongodb-0.4.17.tgz给解压后,修改其中的配置:
将
persistence下的enabled设置为false将image修改为我们的私有镜像:harbor-001.jimmysong.io/library/bitnami-mongodb:3.4.9-r1
执行helm install --dry-run --debug .确定模板无误。
将修改后的mongodb chart打包,在mongodb的目录下执行:
现在再访问前面启动的helm server http://localhost:8879将可以在页面上看到mongodb-0.4.17这个chart。
我们对官方chart配置做了如下修改后推送到了自己的chart仓库:
requirements.yaml和requirements.lock文件中的repository为http://localhost:8879将
values.yaml中的storageClass设置为null将
values.yaml中的Image都改为私有镜像repositroy都设置为http://localhost:8879
注:因为我们没有使用PVC所以将所有的关于持久化存储的配置都设置为false了。
部署MEAN
在mean目录下执行:
这样MEAN软件栈就部署到你的kuberentes集群里面了(默认是在default namespace下)。
验证检查
为了验证MEAN是否安装成功过,可以使用kubectl get pods查看pod是否启动完成,会先启动mongodb的pod,然后启动MEAN中的4步init。
访问Web UI
在Ingress中增加如下配置:
然后在页面中更新ingress:
关于Ingress配置请参考:边缘节点配置
然后在本地的/etc/hosts文件中增加一条配置:
注:172.20.0.119即边缘节点的VIP。
因为该页面需要加载google的angularjs、还有两个css在国内无法访问,可以使用curl测试:
将会返回HTML内容:
访问 http://mean.jimmysong.io 可以看到如下界面,我在其中添加几条todo:

注:Todo中的文字来自What does the fox say?
测试完成后可以使用下面的命令将mean chart推送的本地chart仓库中。
在mean目录下执行:
再次刷新http://localhost:8879将可以看到如下三个chart:
mean
mean-0.1.3
mongodb
mongodb-0.4.17
mychart
mychart-0.1.0
参考
Last updated
Was this helpful?