文章目录
- 1. helm 介绍、组件、安装和目录结构
- 1.1 helm 介绍
- 1.2 helm 组件
- 1.2.1 helm2 和 helm3 的区别
- 1.3 helm 安装
- 1.4 helm 目录结构
- 2. 编写一个chart 和 helm3 内置对象讲解
- 2.1 创建编写一个chart
- 2.1.1 创建chart,引用内置对象的变量值
- 2.1.2 helm通过各种类型chart包安装一个实例名来部署k8s相关的资源
- 2.2 helm3 的内置对象详解
- 3 常用命令总结
- 3.1 常用参数总结
- 3.1.1 helm rollback 参数
- 3.1.2 helm upgrade 参数
推荐阅读: 中文官方文档
1. helm 介绍、组件、安装和目录结构
1.1 helm 介绍
Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。
1.2 helm 组件
- helm 客户端工具,主要用于 k8s 应用 Chart 的创建、打包、发布和管理。
- Chart 应用描述,它是一系列用于描述 k8s 资源相关文件的集合(可以理解为 yaml 的集合)。
- Release 基于 Chart 的部署实体,一个 Chart 被 Helm 运行后将会生成一个对应的 release,然后将在 k8s 中创建出真正运行的资源对象,它是一个应用级别的版本管理。
- Repository 用于发布和存储chart包的仓库,类似yum仓库或docker仓库
1.2.1 helm2 和 helm3 的区别
- helm3 移除了Tiller组件, helm2 中helm客户端和k8s通信是通过Tiller组件和k8s通信,helm3移除了Tiller组件,直接使用kubeconfig文件和k8s的apiserver通信
- 删除release 命令变更
#helm delete release-name --purge ------>> helm uninstall release-name - 查看 charts 信心命令变更
#helm inspect release-name ------>> helm show release-name - 拉取 charts 包命令变更
#helm fetch chart-name ------>> helm pull chart-name - helm3 中必须指定 release 名称,如果需要生成一个随机名称,需要加选项–generate-name,helm2中如果不指定release 名称,可以自动生成一个随机名称
#helm install ./mychart --generate-name
1.3 helm 安装
官网链接
1.4 helm 目录结构
mychart/ # chart 包名称
├── charts # 存放子chart的目录,目录存放这个chart依赖的所有子chart
├── Chart.yaml # 保存chart的基本信息,包括名字、描述信息及版本等,这个变量文件都可以被templates目录下文件引用
├── templates # 模板文件目录,存放所有yaml文件,包含了所有部署应用的yaml文件
│ ├── deployment.yaml #创建deployment对象的模板文件
│ ├── _helpers.tpl #模板助手文件,在整个chart中重复使用。templates目录下这些yaml文件可能会用的一些模板
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt #存放提示信息文件,加上chart帮助信息。helm install 部署后展示(提示)用户
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml #用于渲染模板的文件(变量文件、定义变量的值)定义templates目录下yaml文件可能引用到的变量
#values.yaml 用于存储templates目录中模板中用到的变量的值,这些变量定义都是为了让templates目录下yaml引用
3 directories, 10 files
2. 编写一个chart 和 helm3 内置对象讲解
2.1 创建编写一个chart
编写一个chart,不引用内置对象的变量值,用helm3发布一个创建一个configmap,创建的k8s集群中。(其他应用也一样)
1)创建一个默认chart 包,创建的模板文件文件可根据实际情况进行删除
helm create mychart
#删除templates下文件
cd /mychart/templates && rm -rf ./*
2)编写一个自己需要的模板文件
[root@k8s-master templates]# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "hello world"
3)创建一个release实例:
helm install myconfigmap ../mychart
NAME: myconfigmap
LAST DEPLOYED: Wed Feb 15 23:13:46 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
4)查看创建后的相关信息和验证是否已经在k8s集群中创建了configmap
#1. 安装成功后,此命令可以查看已经发布到k8s中的release信息
helm get manifest myconfigmap
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "hello world"
#2.list 列出创建的release实例名
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
myconfigmap default 1 2023-02-15 23:13:46.970693341 +0800 CST deployed mychart-0.1.0 1.16.0
#3.查看使用helm发布后创建的configmap
kubectl get configmap |grep mychart-configmap
mychart-configmap 1 9m38s
#4. 删除release实例
helm uninstall myconfigmap
release "myconfigmap" uninstalled
helm list|grep myconfigmap
空
2.1.1 创建chart,引用内置对象的变量值
通过变量调用,可以对yaml文件成为一个通用模板。
1)修改上面创建的configmap
[root@k8s-master mychart]# cat templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap #最前面的,从作用域最顶层命令空间开始,即:在顶层命名空间中开始查找Release对象,再查找Name对象
data:
myvalue: {{ .Values.MY_VALUE }} #上面就是通过内置对象和获取内置对象的变量值(Release的名称)作为拼接成configmap的名字,通过调用values.yaml文件获取变量值
2)修改values.yaml 文件
[root@k8s-master mychart]# > values.yaml
[root@k8s-master mychart]# echo "MY_VALUE": "hello world" > values.yaml
3)创建一个release 实例
[root@k8s-master mychart]# helm install myconfigmap2 ../mychart
NAME: myconfigmap2
LAST DEPLOYED: Wed Feb 15 23:40:04 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
[root@k8s-master mychart]# kubectl get configmaps
NAME DATA AGE
kube-root-ca.crt 1 2d1h
myconfigmap2-configmap 1 12s
4)删除实例
[root@k8s-master mychart]# helm uninstall myconfigmap2
release "myconfigmap2" uninstalled
[root@k8s-master mychart]# kubectl get configmaps
NAME DATA AGE
kube-root-ca.crt 1 2d1h
5)helm测试渲染命令
不真正执行,只是试运行看是否能运行,用来测试模板内容是否正确
[root@k8s-master mychart]# helm install myconfigmap3 ../mychart/ --debug --dry-run
install.go:159: [debug] Original chart version: ""
install.go:176: [debug] CHART PATH: /data/mychart
NAME: myconfigmap3
LAST DEPLOYED: Wed Feb 15 23:45:53 2023
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
MY_VALUE: hello world
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: myconfigmap3-configmap #最前面的,从作用域最顶层命令空间开始,即:在顶层命名空间中开始查找Release对象,再查找Name对象
data:
myvalue: hello world #上面就是通过内置对象和获取内置对象的变量值(Release的名称)作为拼接成configmap的名字
[root@k8s-master mychart]# kubectl get configmaps
NAME DATA AGE
kube-root-ca.crt 1 2d1h
2.1.2 helm通过各种类型chart包安装一个实例名来部署k8s相关的资源
2.2 helm3 的内置对象详解
3 常用命令总结
helm version // 查看helm版本
helm create xxx // 创建一个xxx charts
helm lint ./xxx // 检查包的格式或信息是否有问题
helm install xxx1 ./xxx // 部署安装xxx,设置名称为xxx1
helm list // 列出已经部署的charts
helm history // 发布历史
helm upgrade // 更新版本
helm rollback // 回滚版本
helm package ./xxx // 打包charts
helm repo add --username admin --password password myharbor xxx // 增加repo
helm uninstall xxx1 // 卸载删除xxx1
helm pull // 拉取chart包
helm cm-push // 推送chart包
helm repo update // 更新仓库资源
helm search hub // 从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库
helm search repo // 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网
3.1 常用参数总结
3.1.1 helm rollback 参数
#获取发布历史记录
helm -n base history xxx
helm -n be rollback xxx 版本号
3.1.2 helm upgrade 参数
#检查helm 文件中可能存在的问题
helm lint .
#helm 升级
helm upgrade baseline-middleware "/nfs/8build/middleware-chart" -i -f /nfs/8build/middleware-chart/baseline-middleware.values.yaml --set imageTag="20230215-1138" --set nameSpace=be -n be
发布时
-i 参数 等同install ,如果此名称的版本不存在,请运行安装
-f 参数,最后(最右边)指定的文件优先级最高。比如如果baseline-middleware.values.yaml和values.yaml同时包含了名为 'Test'的key,values.yaml中的设置会优先使用:
--set 参数,在命令行上变量值(可以用逗号指定多个或单独的值:key1=val1,key2=val2),若设置值一样,右边优先级高。此处设置的变量值会覆盖xxx.yaml文件中的变量