笔者用过 helm
,它是Kubernetes
下的包管理器,相当于apt-get、yum、brew
这样的软件工具,用的是 helm(v2)
版本,下面所介绍的 helm
指的都是 v2
版本。通过使用 helm
解决了安装和部署复杂的 Kubernetes
应用,比如经常使用的 memecache、redis、MySQL
。也解决过部分粉丝在用 helm
部署程序过程遇到一些问题,其中有几个粉丝一再建议我写一篇文章介绍下 helm
,其实我是不想写的,究其原因有两点,第一、helm
官网和镜像仓库介绍非常详尽,当然安装也非常简单。第二、helm
如果想深入使用,必须搞明白 go
的模板语法,对于大多数用户来说,只是用来管理不同环境的编排文件,现在又要学一门模板语言,有一定的学习成本,所以就这点我是不太认可 helm
的。当然很多人会说,不如直接选择 Kubernetes
集成的 Kustomize
,不用安装任何多余程序,即可完成不同环境应用配置和打包,但从本质上来说,helm
和 Kustomize
是有一定区别的,Kustomize
利用base+overlay
的思想生成最终的描述文件,对原有yaml
编排文件不用怎么修改,即可无缝集成,使用上更简单。而 helm
则又分为仓库、helm
客户端、tiller
服务端,使用过程中,在底层定义模板,外层赋值。使用起来更复杂,但不可否认 helm
更强大,它不仅能够完成不同环境应用的打包和配置,更是对应用进行全生命周期的管理,比如查看历史部署版本、回退、升级等;另外支持应用程序的查找、以及应用程序依赖关系定制化等功能。之前介绍过 Kustomize
的使用,下文结合 redis-ha
安装部署介绍下 helm
,使你对 Kustomize
和 helm
之间的功能点有一个更清楚的认识。
安装helm
helm
客户端安装
下载:wget https://get.helm.sh/helm-v2.15.2-linux-amd64.tar.gz
下载完成后解压:tar xf helm-v2.15.2-linux-amd64.tar.gz && cp linux-amd64/helm /usr/bin
至此就完成了 helm
的安装。
tiller
安装
创建命名空间以及账户权限
helm init --service-account tiller --tiller-namespace kube-system
至此就完成 tiller
的安装,helm
本身是一个二进制文件,可以安装在 kubernetes
集群内部,也可以安装外部,但 tiller
必须安装在集群内部。helm
安装完成之后能够跟 Kubernetes
集群进行交互完成 tiller
安装。笔者暂时没有搭建 helm
远程仓库,暂时通过使用本地和官方提供仓库完成 chart
存储。具体交互过程见下图所示:
helm
:客户端,管理本地chart
仓库,管理Chart
,与tiller
服务器交互,实例查询安装卸载等操作。tiller
:服务端,作为pod
运行在集群中,接受helm
发来的charts
与config
合并生成release
。Repo
:Chart
仓库,也就是底层的模板文件,你可能会有疑问,明明是yaml
编排文件,到这里怎么变成了Chart
???它到底是怎样一种存在,请看下图,其实思想非常简单,helm
通过Chat
对yaml
编排文件进行了模板化,我们只需要在外层赋值就完成了内部编排文件的动态变化。
helm
安装部署高可用redis-ha
查看
helm
仓库地址,如下图所示:当然如果因为网络问题,导致不能下载,可以通过helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
添加阿里云仓库地址。查看
redis
版本,这里我们直接部署redis-ha
版本
拉取
redis chart
到本地
helm fetch stable/redis-ha --untar --untardir ./
查看 chart
文件格式,内层是编排模板文件、最外层是赋值文件打开 values.yaml
,对 values
进行修改,我这里总共修改了如下几处:
因为我的集群计算节点个数小于 pod
数量,所以改成了 false
我是用了 nfs
作为 pvc
所以做了如下修改,这一点也是很多其它同学容器出错的地方,因为没有创建动态 pvc
导致 pod
无法正常启动,下面会专门说明。
安装部署
redis-ha
如下图所示,即完成redis-ha
的部署。
获取 pod
信息,可以发现,基于哨兵模式的高可用 redis
已经运行起来,如下图所示:
如上所示,简单几步已经 redis-ha
的部署,但是部署完成之后如何使用呢,其实使用方式跟你过去区别不大,而且 helm
本身会提示你如何连接和使用 redis
,执行helm status redis-ha
通过下图可以看出如何连接使用 redis
,我这里不在过多赘述。
关于redis-ha
持久化问题
大多数底层基础数据服务,都离不开一个话题,数据的持久化;既然持久化,那么对应到 Kubernetes
中就是 pvc
,持久化工具很多,比如常见的ceph、gfs、nfs
等,本文使用的是 nfs storageClass
,很多同学在使用过程中,一再咨询为啥 pvc
一直提示 unbound
; 最终导致服务无法正常运行,这个时候建议你看下为什么不能绑定,大致原因如下三种:
没有声明
pv
或者声明了pv
但是accessModes
有问题,人家要求的模式是RWO
,但是你声明的确是RWX
,自然永远无法绑定。使用了动态
storageClass
,但是名称不对,有很多同学storageClass: "manager-nfs-client"
是从网上粘贴过来的,但是本地根本没有这个名称,自然一直提示无法绑定。可以通过如下命令查看:
最后一种就是使用了
storageClass
,但是根本没有安装动态置备程序,自然不会自动创建pvc
,当然有了helm
可以非常快速完成置备程序的安装,比如安装nfs
自动置备程序,当然前提是你已经通过yum
安装nfs
。具体命令如下所示:helm install stable/nfs-client-provisioner --set nfs.server=111.112.18.44 --set nfs.path=/home/share
当然如果不使用helm
,也可以通过Kubernetes
资源对象Deployment+StorageClass
形式安装。
总结
本文主要讲解 helm
整体架构介绍以及安装使用、快速部署 Redis
高可用方案 Sentinel
(哨兵)模式,以及部署过程中可能出现的问题进行了总结分析。如有问题请留言或者关注后拉你进群讨论。希望能够帮助到大家,谢谢阅读!
推荐阅读
完整的Kubernetes Deployment yaml文件应该包含什么?
原创不易,随手关注或者”在看“,诚挚感谢!