【问题标题】:Does helm upgrade runs a Job post-install even if no update to values.yaml?即使没有更新 values.yaml,helm upgrade 是否会在安装后运行作业?
【发布时间】:2020-06-04 04:50:29
【问题描述】:

我有安装到共享持久卷的脚本。主要部署图表的一部分是在initContainers 中运行一些 bash 脚本,这将克隆脚本存储库并将其复制/挂载到共享持久卷。我的问题是有时主应用程序没有更改或 values.yaml 文件没有更新,因此实际上不会发生 helm 升级。我认为这很好,但我想要做的是有一个任务仍然会克隆脚本存储库并将其复制/挂载到持久卷。

我正在阅读有关 k8s 作业(安装后挂钩)的信息,但我不确定这是否能满足我的需要。

【问题讨论】:

  • 如果我理解正确,您需要在每次运行helm upgrade 时执行initContainer 脚本,即使没有在应用程序或values.yaml 文件中进行更新。这是正确的吗? initContainers 只会在创建 pod 时运行一次,如果要再次运行它,则需要销毁容器并重新创建。您可以尝试在helm upgrade 命令中使用--force flag 重新创建所有资源。如果您能更详细地解释您的用例,对于获得更多帮助将非常有用。
  • 是的。 initContainers 在部署资源中执行得很好。它还检测 configmap/secrets 中的更改。在initContainers 中执行的脚本是一个git clone 脚本存储库。指定了分支名称(例如 master)。如果对值/配置映射进行了更改,它会在 helm upgrade 期间正常部署。但是脚本 repo 的 master 分支发生了一些变化,如果你重新运行 helm upgrade,helm 不会检测到任何变化,因此不会发生部署。它不知道 master 分支是否发生了变化,除非我指定一个不同的分支名称来克隆。
  • 我确认如果没有更改,Job 将不会运行安装后挂钩。 helm history 仍将注册部署,因为添加了具有新修订号的新条目。
  • 所以我想因为无论部署是否发生都强制作业运行,我想知道是否有一个我可以的钩子(不是预安装或安装后)用于指示无论 helm 升级状态如何都运行此作业。

标签: kubernetes kubernetes-helm kubernetes-pod


【解决方案1】:

由于您没有更改 HELM 方面的任何内容,例如值或规范/模板,因此 HELM 不会执行任何更改。 在这种情况下,您的代码是外部源代码,从 HELM 的角度来看它是正确的。

我可以提出一些替代方案来实现您想要的:

  1. 将 HELM 与 FORCE 标志一起使用 使用 helm upgrade --force 升级您的部署。 通过掌舵docs

    --force - 通过替换策略强制资源更新

在这种情况下,Helm 将重新创建图表的所有资源,从而重新创建 pod,然后重新运行 initContainers 再次执行您的脚本。

  1. 使用 Kubernetes CronJob 在这种情况下,您将生成一个 pod,它将挂载您的卷并运行您想要的脚本/命令。

Kubernetes CronJob 的示例:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: nice-count
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: nice-job
            image: alpine
            command: ['sh', '-c', 'echo "HelloWorld" > /usr/share/nginx/html/index.html']
            volumeMounts:
              - mountPath: "/usr/share/nginx/html"
                name: task-pv-storage
          volumes:
            - name: task-pv-storage
              persistentVolumeClaim:
                claimName: task-pv-claim
          restartPolicy: Never

在本例中,CronJob 每 2 小时运行一次,将卷 task-pv-storage 挂载到 /usr/share/nginx/html 并执行命令 echo "HelloWorld" > /usr/share/nginx/html/index.html

您应该使用以下命令触发 CronJob 手动创建作业:

kubectl create job --from=cronjob/<CRON_JOB_NAME> <JOB_NAME>

在上面的示例中,命令如下所示:

kubectl create job --from=cronjob/nice-count nice-count-job

  1. 手动或使用 CI/CD 执行作业 您可以直接执行作业,或者如果您有 CI/CD 解决方案,您可以创建一个运行一次的作业,而不是使用 CronJob,在这种情况下,您应该使用此模板:
apiVersion: batch/v1
kind: Job
metadata:
  name: nice-count-job
spec:
  template:
    spec:
      containers:
      - image: alpine
        name: my-job
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: task-pv-storage
        command:
        - sh
        - -c
        - echo "hello" > /usr/share/nginx/html/index.html
      restartPolicy: Never
      volumes:
      - name: task-pv-storage
        persistentVolumeClaim:
          claimName: task-pv-claim

我已经测试了这个例子并且在这两种情况下都有效。

如果有帮助,请告诉我!

【讨论】:

  • 带有安装后挂钩的Job 是我已经做过的,但并没有真正触发,因为从掌舵的角度来看没有任何变化。所以我想我能做的是有一个标志是否运行这个Job。在 yaml 中,我将在开始时设置 if 条件。从help upgrade 命令,我将传递一个类似--set run_nice-count-job=true的值
猜你喜欢
  • 1970-01-01
  • 2020-02-24
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 2021-09-14
  • 2021-03-22
相关资源
最近更新 更多