文章目录
1、hook概念
HOOK技术即钩子函数,钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。
钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。
2、helm中hook
在简化Kubernetes应用部署工具-Helm之应用部署文章中,展示了采用Helm的一次应用release的生命周期过程,涵盖了发布(helm install)、更新(helm upgrade)、回滚(helm rollback)与删除(helm delete)等部分。为了允许chart开发者在应用release的生命周期中某些关键的时间点上,执行一些操作来更好的服务于release的需求,为此Helm提供了hook机制。
举例说明什么是一个Helm hook,比如ConfigMap或Secret要先于其他chart被加载,或希望在更新/回滚/删除一个release之前能够安全的关闭服务,都可以通过Helm hook实现。
Hook和普通模板文件基本相同,但其可以通过加入一些特殊的注释(annotation)与普通模板文件加以区分,下文会介绍hook的基本格式和用法。
hook | 作用 |
---|---|
pre-install | 在渲染模板之后,在Kubernetes中创建任何资源之前执行 |
post-install | 将所有资源加载到Kubernetes之后执行 |
pre-delete | 在从Kubernetes删除任何资源之前对删除请求执行 |
post-delete | 删除所有发行版资源后,对删除请求执行 |
pre-upgrade | 在呈现模板之后但在更新任何资源之前,对升级请求执行 |
post-upgrade | 升级所有资源后执行升级 |
pre-rollback | 在呈现模板之后但在回滚任何资源之前,对回滚请求执行 |
post-rollback | 修改所有资源后,对回滚请求执行 |
test | 在调用Helm test子命令时执行( 查看测试文档) |
注释值 | 描述 |
---|---|
before-hook-creation | 在启动新的挂钩之前删除先前的资源(默认) |
hook-succeeded | 挂钩成功执行后删除资源 |
hook-failed | 如果挂钩在执行期间失败,则删除资源 |
3、举例
hook只是在metadata节中带有特殊注释的Kubernetes清单文件 。因为他们是模板文件,可以使用所有的Normal模板的功能,包括获取.Values,.Release和 .Template。例如,存储在模板templates/post-install-job.yaml声明要在上运行的任务post-install:
apiVersion: batch/v1
kind: Job
metadata:
name: "{
{ .Release.Name }}"
labels:
app.kubernetes.io/managed-by: {
{
.Release.Service | quote }}
app.kubernetes.io/instance: {
{
.Release.Name | quote }}
app.kubernetes.io/version: {
{
.Chart.AppVersion }}
helm.sh/chart: "{
{ .Chart.Name }}-{
{ .Chart.Version }}"
annotations:
# This is what defines this resource as a hook. Without this line, the
# job is considered part of the release.
"helm.sh/hook": post-install #在所有k8s任务执行之后执行post-install
"helm.sh/hook-weight": "-5" #设置权重系数
"helm.sh/hook-delete-policy": hook-succeeded #注释
spec:
template:
metadata:
name: "{
{ .Release.Name }}"
labels:
app.kubernetes.io/managed-by: {
{
.Release.Service | quote }}
app.kubernetes.io/instance: {
{
.Release.Name | quote }}
helm.sh/chart: "{
{ .Chart.Name }}-{
{ .Chart.Version }}"
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: "alpine:3.3"
command: ["/bin/sleep","{
{
default "10" .Values.sleepyTime }}"]
1、 也可以同时实现多个挂钩
annotations:
"helm.sh/hook": post-install,post-upgrade
2、 挂钩权重可以为正数或负数,但必须表示为字符串。当Helm开始执行特定种类的钩子的执行周期时,它将以升序对这些钩子进行排序。