helm三大概念
- chart:chart就是helm package,包含了一个k8s app应用运行起来的所有要素,比如service, deployment, configmap, serviceaccount, rbac, 等,这些要素都是以template文件的形式存在,再结合values文件,最终渲染出能够被k8s执行的yaml文件;
- repository:仓库是charts的集合,方便进行分享和分发。下面是官网仓库和阿里云仓库的地址,大家可以进去看看,感受一下;
- release:release是helm chart在kubernetes的一个运行实例,你可以用不同的release name多次安装同一个chart,比如:当集群中需要多个redis实例,你可以使用不同的配置文件安装redis chart。
helm运行流程
下面这张图我建议大家多看几遍,可以说掌握了这张图,就掌握了helm的核心。
从下图可以看到,helm的核心运行流程分为以下几步:
- 从chart仓库中获取chart;
- 使用者配置自己的values文件,根据自己的运行环境对values进行修改;
- 默认values文件和使用者values文件会进行一个merge,形成最终的values文件;
- 使用最终的values文件,渲染chart的template,形成可以被kubernetes执行的yaml;
- 调用kube apply提交yaml到kubernetes
在这里,需要注意chart开发者和使用者的界限,正是由于在跨越这个界限的时候,从需要理解大量的配置到只需要理解少量的配置,使得ops的工作变得简便,这也是helm核心的设计哲学。看完整个文章,即使你什么都没记住,只记住了这张图,你也会有很大的收获了。
helm常用命令
在helm的时候,你可以使用第三方开发的chart,也可以自己开发chart,以下是两种情况下使用的常见命令。更为详细的命令,可以安装好helm之后,使用helm help来查看,或查看官方文档。
使用第三方开发的chart
部署前
- repo: add, list, remove, update, and index chart repositories
- search: search for a keyword in charts
部署后
- install: install a chart
- list: list releases
- status: display the status of the named release
- upgrade: upgrade a release
- rollback: roll back a release to a previous revision
- uninstall: uninstall a release
自己开发chart
- lint: examine a chart for possible issues
- package: package a chart directory into a chart archive
- push: push helm chart to chartmuseum
- chart push: push helm chart to OCI repository
chart
chart可以说是helm里面最重要的概念了,关于chart也有很多内容需要掌握,在这里做一个列举。
- chart开发:主要是指利用模板技术开发一个chart,会在后面做详细介绍;
- chart hooks:在chart的生命周期中,提供一些hooks,方便进行一些前置或后置操作
- 在chart安装前,创建应用需要的Secret
- 在chart安装前,备份数据库
- 在chart卸载后,做一些清理工作
- chart test:当你install了一个chart后,如何知道这个release是否运行正常呢?chart test提供了一种测试的方式,来验证你的应用是否正常运行,比如:
- 校验mysql应用能够正常连接并接受请求
- 校验services能够正常做load balance
- library chart:一种以library形式存在的chart,可以在application chart之间进行共享避免重复逻辑;类似于编程语言中的public library;
- chart校验:基于PKI、GnuPG等技术,对helm package进行签名,保证传输或发布过程中的安全性;
- OCI(Open Container Initiative,容器发型规范)支持:helm 3引入(EXPERIMENTAL),能够将chart推送到支持OCI的仓库中,比如harbor, nexus,等,比如,将chart保存到harbor中:
- 保存chart:helm chart save kubeedge/ some-harbor-repo/kubeedge-cloud-chart:1.0.0
- 登录repo:helm registry login https://some-harbor-repo
- 推送chart:helm chart push some-harbor-repo/kubeedge-cloud-chart:1.0.0
- 高级特性
- post rendering: 提供在helm install之前对manifests进行操作、配置的一种机制;一般结合kustomize使用。比如:
- 在install时插入sidecar,从而为deployment增加功能
- 不修改原chart的情况下,更改manifests的配置
- post rendering: 提供在helm install之前对manifests进行操作、配置的一种机制;一般结合kustomize使用。比如:
这可能不是非常好理解,这里举一个例子,假设我需要对一个第三方的chart做少量的修改,以满足我的部署要求,那么我可以fork一份这个chart,然后在上面做修改,但是这样我需要一些额外的维护工作,当这个chart升级之后,我还需要做merge的工作,十分不便。
因此post rendering提供了一种机制,你只需要使用post rendering+kustomize编写的一个脚本,就可以在install前,对原始chart的内容做一些定制化的修改,避免了额外的维护工作。如下图所示。(kustomize是一个开源的配置工具,可以方便的对现有的k8s app配置做一些定制化的修改,官网地址:https://kustomize.io/)
- go sdk:helm提供了golang sdk,方便在go语言中使用;
- storage backend:指定release信息的存储类型,默认是secret;可以指定configmap、secret和postgreSQL;下图显示helm的版本信息存放在secret中的情况。
- helm plugin:支持以插件的形式拓展helm的功能。
helm demo
下面我们一起用一个demo来对helm有一个更为直观的了解。在这个demo中,我们的目标是部署一个redis集群,包括以下几个步骤:
- 安装helm
- 使用helm install单节点redis
- 使用helm upgrade升级到master-slave
- 使用helm rollback,回滚到单节点模式
步骤1:安装helm(通过apt)
以下是通过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
步骤2:添加仓库并找到redis chart
- 添加仓库:helm repo add stable https://charts.helm.sh/stable
- 查看已经添加的仓库:helm repo list
- 搜索仓库有哪些chart:helm search repo stable
- 更新仓库列表到本地:helm repo update
- 搜索redis:helm search repo redis
- 查看redis chart详情:helm show chart stable/redis
- 查看redis values(values:相当于chart的配置文件):helm show values stable/redis
步骤3:install/upgrade/rollback/uninstall
- 建立单master的配置文件,名为only-master.values
## 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连接
- 建立master-slave配置文件,名为master-slave.values
## 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
- 最后,回滚至单master模式
- 查看部署历史:helm history redis-demo
- 回滚到对应的单master版本:helm rollback redis-demo REVISION
- 再连接slave已经不成功了:
redis-cli -h `kubectl get svc redis-demo-slave -o=jsonpath="{.spec.clusterIP}"` -a admin
- 只有master能连接:
redis-cli -hkubectl get svc redis-demo-master -o=jsonpath="{.spec.clusterIP}"` -a admin
# 输入命令测试一下
get age
- 卸载redis-demo
### 最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
### 资料预览
给大家整理的视频资料:
![](https://img-blog.csdnimg.cn/img_convert/abf9e96760e26bc64b6b0cb9d06a04fe.png)
给大家整理的电子书资料:
![](https://img-blog.csdnimg.cn/img_convert/53ae70fb9925a1270b89d8eb8ed2165e.png)
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
UMpGYgL-1714324491669)]
**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**