1 什么是helm
在学习使用k8s进行应用的部署时,或者从github上下载一些组件进行部署时,通常是直接用yaml的方式部署,用这种方式部署时,有个比较大的问题是,当参数需要调整时,就需要阅读整个yaml文件,找到对应的配置进行修改,而且,这种方式不方便进行版本管理,当其他人进行部署时,就需要知道修改了哪些参数以及对应的值,也就是说,无法保证两次部署的环境一致。如果有一个仓库保存了应用的yaml模板、模板中的参数以及版本号,每次选择版本进行部署时,可以用默认参数替换掉yaml模板中的变量,并且可以设置某些参数的值,用一条命令就可以进行环境的部署,而且能够保证环境的一致,另外,使用包管理器还可以解决另一个大问题:依赖,有些应用可能还依赖其他的组件,包管理器的配置中可以声明依赖,在包安装时,会先去下载依赖。
helm被称为k8s的包管理器
,类似于centos的yum和ubuntu的apt,只是yum仓库中保存的是rpm包,apt仓库中保存的是dpkg包,而helm仓库中保存的是Chart。
关键术语:
- Helm:包管理器,可以指代Helm整个机制,也可以指代客户端,就类似于yum客户端
- Chart:yaml模板文件和模板参数文件的集合,类似于yum中的rpm包
- Release:Chart在k8s集群中运行起来的实例,一个Chart可以在集群中多次安装,每次安装都会生成一个Release
- Repository:仓库,保存Chart的地方,类似于yum中的源
2 helm v2 vs v3
在提到helm时,都会将v2和v3版本进行对比,它们的主要区别就是集群中的Tiller组件:v2版本会在集群中部署一个Tiller组件,helm客户端在进行操作时,会将请求发送给Tiller,Tiller调用k8s apiserver的接口实现功能,而v3版本的helm没有Tiller组件,helm客户端直接与k8s apiserver进行通信。
详细的变化可以参考:Helm v2 迁移到 v3。
3 helm的安装和使用(以安装redis为例)
wget https://get.helm.sh/helm-v3.13.0-linux-amd64.tar.gz
tar -xf helm-v3.13.0-linux-amd64.tar.gz
cp linux-amd64/helm /usr/local/bin/
# 查看helm的版本和帮助文档
helm version
helm help
在helm安装完成后,可以用helm repo add
命令添加仓库,当然也可以直接用官方的hub。因此,第一步,添加仓库:
helm repo add bitnami https://charts.bitnami.com/bitnami
添加完仓库后可以使用helm repo list
命令查看仓库列表。
添加完仓库后,就可以在仓库中搜索应用,类似于yum search
:
# 在仓库中搜索redis
helm search repo redis
当搜索到想要安装的Chart时,可以进行安装:
helm install luo-redis bitnami/redis --kubeconfig /root/.kube/config
然后就可以用helm list
查看Release:
查看Pod和Service,这是默认创建的一主三从的redis集群:
然后就可以对集群进行测试。
首先,需要获取集群的密码:REDIS_PASSWORD=$(kubectl get secret --namespace default luo-redis -o jsonpath="{.data.redis-password}" | base64 -d)
。
然后可以选择一个从redis登陆进行测试验证:
首先以服务的方式访问master节点,将数据写入到redis集群的master节点,然后用无头服务的方式访问replicas-0的redis,可以看到数据已经同步了,然后对从节点进行写入失败了。
上述测试说明这个一主三从的redis集群可以正常工作。
这里使用helm创建redis集群全部用的都是默认参数,例如有三个从节点,如果要用4个从节点呢?此时就需要修改参数。
4 helm的参数设置
设置helm部署时的参数通常有两种方式:
- 执行
helm install
时,在命令行中设置模板参数 - 直接下载Chart,然后修改里面的values.yaml
这里以修改从redis的数量为例。
4.1 修改Chart的values.yaml
使用helm pull bitnami/redis
命令从仓库中下载redis的Chart,就会在当前目录下出现一个redis的压缩包,进行解压:
其中比较重要的有三个部分:
- Chart.yaml:Chart的描述文件,描述Chart的版本、应用的版本、依赖等信息
- templates/:使用golang的template语法实现的yaml模板文件
- values.yaml:将模板文件中的变量提取为参数放在此处统一保存,可以对该文件进行修改
在values.yaml中搜索replica会发现这里的replicaCount就是从redis的数量:
因此,可以直接将values.yaml中的replicaCount修改为4,然后用helm upgrade luo-redis bitnami/redis -f values.yaml
进行更新,第一个参数是Release的名称,第二个参数是Chart的名称。
当然,也可以在安装的时候设置-f values.yaml
参数。
4.2 命令行中设置模板参数
在命令行中设置参数时,就需要知道参数的名字是什么,从上面下载的values.yaml中可以知道要修改从redis的数量只需要修改replica.replicaCount即可,因此,可以用下列命令修改从redis的数量。
helm upgrade luo-redis bitnami/redis --set replica.replicaCount=2