Helm 是 Kubernetes 的包管理器。包管理器类似于我们在 Ubuntu 中使用的apt、Centos中使用的yum 或者Python中的 pip 一样,能快速查找、下载和安装软件包。Helm 由客户端组件 helm 和服务端组件 Tiller 组成, 能够将一组K8S资源打包统一管理, 是查找、共享和使用为Kubernetes构建的软件的最佳方式。
解决问题:
能对多个模板文件(yaml文件)进行统一管理,设想一下,如果没有helm,如何执行多个模板文件呢?那就得一个个的执行kubectl apply -f xxx.yaml。而如今有了helm,只需要将文件放入chart包中,然后一句helm install xxx path便可以执行所有的模板文件。当然helm的好处不仅于此,还有其他便利之处,有待大家挖掘。
//创建一个chart包模板
helm create xxx(chart包名)
//安装
helm install xxx -n namespace
//卸载
helm uninstall xxx -n namespace
//预填充变量/参数
helm install xxx -n namespace --dry-run
组件
Helm 包含两个组件,分别是 helm 客户端 和 Tiller 服务器:
原理
下面图描述了 Helm 的几个关键组件 Helm(客户端)、Tiller(服务器)、Repository(Chart 软件仓库)、Chart(软件包)之间的关系以及它们之间如何通信 :
创建release
删除release
更新release
和 Kubernetes 里面的容器一样,Helm 也提供了 Hook 的机制,允许 chart 开发人员在 release 的生命周期中的某些节点来进行干预 。 可以在以下场景中得以使用:
Hooks 允许开发人员在 release 的生命周期中的一些关键节点执行一些钩子函数,我们正常安装一个 chart 包的时候的生命周期如下所示:
如果开发人员在 install 的生命周期中定义了两个 hook:pre-install和post-install,那么我们安装一个 chart 包的生命周期就会多一些步骤了:
等待 hook 准备就绪,这是一个阻塞的操作,如果 hook 中声明的是一个 Job 资源,那么 Tiller 将等待 Job 成功完成,如果失败,则发布失败,在这个期间,Helm 客户端是处于暂停状态的。
对于所有其他类型,只要 kubernetes 将资源标记为加载(添加或更新),资源就被视为就绪状态,当一个 hook 声明了很多资源是,这些资源是被串行执行的。
另外需要注意的是 hook 创建的资源不会作为 release 的一部分进行跟踪和管理,一旦 Tiller Server 验证了 hook 已经达到了就绪状态,它就不会去管它了。
所以,如果我们在 hook 中创建了资源,那么不能依赖helm delete去删除资源,因为 hook 创建的资源已经不受控制了,要销毁这些资源,需要在pre-delete或者post-delete这两个 hook 函数中去执行相关操作,或者将helm.sh/hook-delete-policy这个 annotation 添加到 hook 模板文件中。
同样,通过模板(yaml文件)的形式创建资源,通过资源来处理你想要履行的逻辑
apiVersion: batch/v1
kind: Job
metadata:
name: post-install-job
annotations:
# 注意,如果没有下面的这个注释的话,当前的这个Job就会被当成release的一部分
"helm.sh/hook": post-install
"helm.sh/hook-weight": "-5" //权重,按升序对这些 hook 进行排序执行
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
metadata:
name: post-install-job-test
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: xxxxx
command: ["/bin/sleep", "{{ default "20" .Values.sleepTime }}"]
上述模板放在helm包执行后,helm安装的成功回显信息会在20s后才回显,而不会立马回显。
删除资源的策略
annotations:
"helm.sh/hook-delete-policy": hook-succeeded //配置单个策略
----------------------------------------------------------------
annotations:
"helm.sh/hook-delete-policy": "hook-succeeded,hook-failed" //配置多个策略
Helm官方文档
https://helm.sh/docs/intro/quickstart/