【问题标题】:Kubernetes job update with helm使用 helm 更新 Kubernetes 作业
【发布时间】:2022-01-25 17:48:27
【问题描述】:

我有一个 Kubernetes 集群,我正在使用 Helm 在那里部署我的应用程序。一切正常,但一方面,工作更新。正如我所读到的,作业是不可变的,这就是它们无法更新的原因,但我不明白,为什么 helm 没有像为 Pod 那样创建新作业?

最后,我希望将我的应用程序代码部署为运行数据库迁移的作业。我尝试将其作为 Pod 进行,但对于 pod,重启策略只能是“始终”,不支持“从不”,即使文档另有说明。我该如何实现这一点,以便每次部署(新图像标记)都可以更新迁移,并且它运行一次而不重新启动?

【问题讨论】:

标签: kubernetes deployment kubernetes-helm


【解决方案1】:

您可以在此处使用 helm 挂钩。 官方链接:https://helm.sh/docs/topics/charts_hooks/

使用“helm install”完成作业后,helm hook 应将其删除。执行“helm upgrade”后,应该会触发一个新作业。应用程序逻辑应处理安装和升级方案。

以下是一些与 helm hooks 相关的概念。

Helm Hooks 的种类

  • 预安装:在渲染模板之后和在 Kubernetes 集群中创建任何资源之前运行挂钩
  • 安装后:在加载所有 Kubernetes 资源后运行挂钩
  • pre-delete :在从 Kubernetes 中删除任何现有资源之前运行挂钩
  • post-delete :在删除所有 Kubernetes 资源后运行挂钩
  • pre-upgrade : 在图表模板被渲染之后和任何资源被加载到 Kubernetes 之前运行的钩子
  • post-upgrade : 在所有 Kubernetes 资源升级后运行挂钩
  • pre-rollback :在模板渲染之后和任何资源回滚之前运行挂钩
  • post-rollback : 钩子在所有资源被修改后运行
  • test : 执行 helm test 子命令时会运行挂钩

注意:一个资源可以实现多个钩子:

例如: 注释: “helm.sh/hook”:安装后、升级后

Helm Chart Hooks 是如何执行的

  • 在执行包含挂钩的 Helm 图表时,与挂钩相关的 pod 或作业等组件不会直接应用于 Kubernetes 环境。 相反,当执行钩子时,会创建一个对应于钩子的新 pod。 如果成功运行,它们将处于“已完成”状态。
  • Helm 挂钩创建的任何资源都是非托管的 Kubernetes 对象。 换句话说,使用“helm uninstall”卸载 Helm 图表不会删除由钩子创建的底层资源。 如果需要删除这些资源,则需要以注释的形式定义单独的删除策略。
  • 任何不得删除的钩子资源都应使用“helm.sh/resource-policy: keep”进行注释。

Helm Hook 注释

  • “helm.sh/hook”:安装后
  • "helm.sh/hook-weight": "-5" ## 注意:这必须是字符串
  • “helm.sh/hook-delete-policy”:钩子成功
  • “helm.sh/resource-policy”:保留

挂钩删除策略

  • 要使用“helm.sh/hook-delete-policy”注释。

支持三种不同的删除策略,它们将决定何时删除资源:

  • before-hook-creation : 在启动新钩子之前删除以前的资源
  • hook-succeeded : 钩子执行成功后删除资源
  • hook-failed : 如果钩子在执行过程中失败,则删除资源

注意:如果没有指定钩子删除策略注释,则默认应用钩子创建之前的行为。

挂钩重量

  • 要使用“helm.sh/hook-weight”注解。
  • 挂钩权重可以是正数或负数,但必须表示为字符串。
  • 当 Helm 开始执行特定种类的钩子时,它会按升序对这些钩子进行排序。

挂钩重量确保如下:

  • 按正确的权重顺序执行
  • 互相屏蔽
  • 所有块主 K8s 资源从启动

完整的执行流程示例

  1. 第 1 步:创建安装后和安装后挂钩 YAML 文件

pre-install.yaml

apiVersion: v1
 kind: Pod
 metadata:
   name: hook-preinstall
   annotations:
     "helm.sh/hook": "pre-install"          ## Without this line, this becomes a normal K8s resource.
 spec:
   containers:
   - name: hook1-container
     image: busybox
     imagePullPolicy: IfNotPresent
     command: ['sh', '-c', 'echo The pre-install hook Pod is running  - hook-preinstall && sleep 15']
   restartPolicy: Never
   terminationGracePeriodSeconds: 0

安装后.yaml

apiVersion: v1
 kind: Pod
 metadata:
   name: hook-postinstall
   annotations:
     "helm.sh/hook": "post-install"         ## Without this line, this becomes a normal K8s resource.
 spec:
   containers:
   - name: hook2-container
     image: busybox
     imagePullPolicy: IfNotPresent
     command: ['sh', '-c', 'echo post-install hook Pod is running - hook-postinstall && sleep 10']
   restartPolicy: Never
   terminationGracePeriodSeconds: 0

  1. Step-2:安装Helm Chart(假设/templates/目录下定义了其他K8s资源)

  1. 获取 Pod:

$ kubectl get pods
NAME                                 READY   STATUS      RESTARTS   AGE
demohook-testhook-5ff88bb44b-qc4n2   1/1     Running     0          5m45s
hook-postinstall                     0/1     Completed   0          5m45s
hook-preinstall                      0/1     Completed   0          6m2s
$

  1. 描述 Pod 并注意 Pod 的开始和完成时间:

$ kubectl describe pod demohook-testhook-5ff88bb44b-qc4n2 | grep -E 'Anno|Started:|Finished:'
$ kubectl describe pod hook-postinstall | grep -E 'Anno|Started:|Finished:'              
$ kubectl describe pod hook-preinstall | grep -E 'Anno|Started:|Finished:'

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 2021-06-16
    • 2018-02-08
    • 2023-03-23
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    相关资源
    最近更新 更多