云原生应用管理:原理与实践
上QQ阅读APP看书,第一时间看更新

2.7.3 简单的Hooks示例

Hooks在编写方式上与资源文件相同。因为它们是模板文件,用户可以使用所有的模板功能,包括.Values、.Release、.Template。

如下例所示,这个文件存放在templates/post-install-job.yaml。


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
    "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}}"]

本例的资源与普通的资源最主要的区别在于,它声明了它是一个post-install hook。


annotations:
  "helm.sh/hook":post-install

当然,一个资源可以被定义成多个Hooks,比如:


annotations:
  "helm.sh/hook": post-install,post-upgrade

父Chart没有办法关闭子Chart声明的Hooks,当子Chart声明Hooks时,Hooks也会被执行。

我们可以为Hooks定义权重,这有助于构建确定性的执行顺序。权重使用以下注释定义。


annotations:
  "helm.sh/hook-weight": "5"

hook权重可以是正数或负数,但必须表示为字符串。当Tiller启动特定类型的Hooks执行周期时,它会对这些Hooks进行升序排列。

我们还可以定义何时删除相应Hooks资源的策略,例如使用以下注释定义Hooks删除策略:


annotations:
  "helm.sh/hook-delete-policy": hook-succeeded

用户可以选择一个或多个已定义的注释值。

·"hook-succeeded":指定Tiller应在Hooks成功执行后删除对应资源。

·"hook-failed":指定如果Hooks在执行期间失败,Tiller将删除对应的资源。

·"before-hook-creation":指定Tiller在启动新Hooks之前删除对应的资源。

默认情况下,Tiller将等待60s,以便在超时之前删除对应的资源。用户可以使用helm.sh/hook-delete-timeout注释更改该行为,该值是Tiller应该等待Hooks完全删除的秒数,值为0表示Tiller不会等待。