helm是k8s的包管理工具,使用helm,可以使用更为简化和系统化的方式对k8s应用进行部署、升级。
helm是CNCF已毕业的项目,社区也是相当活跃的,在 https://artifacthub.io/ 上,能找到很多现成的helm chart,稍作修改就能用到生产环境中,非常方便。
本文会介绍helm的核心概念,并用一个例子帮助大家更直观的认识helm,大家可以跟着这个例子操作一遍,相信对理解helm会有非常大的作用。
(教程地址:cloud-native-tutorial)
helm在希腊语中的意思是:舵;驾驶盘。据说是helm创始人mutt butcher翻遍了航海手册找出来的,目的是为了找一个和kubernetes主题相匹配的词语。
官网地址:https://helm.sh/
官方给出的解释是:Helm is the best way to find, share, and use software built for Kubernetes. 意思是helm是kubernetes中查找、分享、构建应用的最佳方式。
这种说法当然不算夸张,Helm其实是一个Kubernetes应用的包管理工具,用来管理chart(一种预先配置好的安装包资源),有点类似于Ubuntu 的APT和CentOS中的YUM。因此,helm的出现解决了k8s应用管理能力缺失的问题。
另外helm也是dev和ops的桥梁,运维人员在使用helm的时候,一方面不需要理解大量在chart中的各种k8s元素,只需要配置少量的环境变量即可安装;另一方面,helm也给初级运维人员提供了学习的机会,他们可以在chart中学习并理解各种k8s元素,从而能够更快的掌握k8s。
下面列举了helm的一些关键信息
在我们接触一个新事物的时候,最好的学习方式就是和我们熟悉的事务来做类比,能够帮助我们快速的掌握其中的核心概念。
由于Mutt Butcher在设计helm的时候,大量参考了apt和homebrew的设计,这里我们用apt来做对比,帮助大家更好的理解helm。
从下表中可以看到,helm和apt之间概念的对比,相信熟悉apt的同学能够很快的对helm有一个初步的认识。
对helm有了一个初步的印象之后,我们来对helm做一个总览,包括helm的的核心概念、运行流程、常用命令、chart做一个概要性的了解,这样的话,对我们后续深入helm的学习和实践起一个纲领的作业,避免只见树木、不见森林。
下面这张图我建议大家多看几遍,可以说掌握了这张图,就掌握了helm的核心。
从下图可以看到,helm的核心运行流程分为以下几步:
在这里,需要注意chart开发者和使用者的界限,正是由于在跨越这个界限的时候,从需要理解大量的配置到只需要理解少量的配置,使得ops的工作变得简便,这也是helm核心的设计哲学。看完整个文章,即使你什么都没记住,只记住了这张图,你也会有很大的收获了。
在helm的时候,你可以使用第三方开发的chart,也可以自己开发chart,以下是两种情况下使用的常见命令。更为详细的命令,可以安装好helm之后,使用helm help来查看,或查看官方文档。
部署前
部署后
chart可以说是helm里面最重要的概念了,关于chart也有很多内容需要掌握,在这里做一个列举。
这可能不是非常好理解,这里举一个例子,假设我需要对一个第三方的chart做少量的修改,以满足我的部署要求,那么我可以fork一份这个chart,然后在上面做修改,但是这样我需要一些额外的维护工作,当这个chart升级之后,我还需要做merge的工作,十分不便。
因此post rendering提供了一种机制,你只需要使用post rendering+kustomize编写的一个脚本,就可以在install前,对原始chart的内容做一些定制化的修改,避免了额外的维护工作。如下图所示。(kustomize是一个开源的配置工具,可以方便的对现有的k8s app配置做一些定制化的修改,官网地址:https://kustomize.io/)
下面我们一起用一个demo来对helm有一个更为直观的了解。在这个demo中,我们的目标是部署一个redis集群,包括以下几个步骤:
以下是通过apt安装helm的命令,其他的安装方式可参考官网:
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add –
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm=3.4.2-1
## Cluster settings
cluster:
enabled: false
## Redis pod Security Context
securityContext:
enabled: false
## Use password authentication
usePassword: true
## Redis password (both master and slave)
password: "admin"
## Redis Master parameters
master:
persistence:
enabled: false
然后--dry-run一下,看看生成出来的yaml文件是否存在问题:
helm install redis-demo stable/redis -f ./only-master.values --dry-run
如果没有问题,则进行实际的安装
helm install redis-demo stable/redis -f ./only-master.values
安装成功之后,可以登录redis进行操作,做进一步的校验:
redis-cli -h `kubectl get svc redis-demo-master -o=jsonpath="{.spec.clusterIP}"` -a admin
set name zhangsan
get name
info replication
# 可以看到这时候没有slave连接
## Cluster settings
cluster:
enabled: true
slaveCount: 1
securityContext:
enabled: false
## Use password authentication
usePassword: true
password: "admin"
## Mount secrets as files instead of environment variables
usePasswordFile: false
## Redis Master parameters
master:
persistence:
enabled: false
## Redis Slave properties
slave:
persistence:
enabled: false
--dry-run一下,看看生成出来的yaml文件是否存在问题;由于在系统中已经有redis-demo的release,因此使用upgrade来进行升级:
helm upgrade redis-demo stable/redis -f ./master-slave.values --dry-run helm upgrade redis-demo stable/redis -f ./master-slave.values
检查slave是否安装成功,以及是否同步成功
redis-cli -h `kubectl get svc redis-demo-slave -o=jsonpath="{.spec.clusterIP}"` -a admin
get name
redis-cli -h `kubectl get svc redis-demo-slave -o=jsonpath="{.spec.clusterIP}"` -a admin
redis-cli -hkubectl get svc redis-demo-master -o=jsonpath="{.spec.clusterIP}"` -a admin
# 输入命令测试一下
get age
helm uninstall redis-demo
下图是wordpress的helm chart目录结构,每个元素的解释如下:
Chart.yaml相当于chart的说明书,说明了这个chart的功能、版本、依赖关系、关键字等信息。
下图是redis的Chart.yaml
template存放chart中的主要内容,主要以模板的形式存在,template中可以使用变量、控制语句、函数等,功能非常丰富。
可以使用helm来构建CICD pipeline,下面是一个CICD的示例:
可以看到,整个CICD分为3个步骤,当然这只是一个例子,开发者可以根据实际的需要对这个步骤进行调整:
从下图中看到,最大的变化就是移出了tiller,主要原因是k8s早已支持了RBAC,不再需要tiller这么一个“多余”的组件来做权限管理了,另外的几个修改如下图所示,要了解细节,请参考官方的文档。