在 kustomize 清单中创建变量

Create variable in kustomize manifest

我认为这是一个常见用例,但我真的很难找到解决方案:

我想在我们的部署中重用 Kustomize 补丁中的一个变量。具体来说,我们使用提交 ID 来引用图像标签(用例 A)和与部署相关的 k8s 作业(用例 B)。

我们使用一个设置,其中每个 ArgoCD 应用程序都有一个 /base/ 文件夹和 /overlays/[environment-name],这个基础用 kustomization.yaml.

修补

用例 A:

一个非常简单的用法 - 在 /overlays/[environment-name] 中我们有一个 kustomization.yaml,它使用:

images:
- name: our-aws-repo-url
  newName: our-aws-repo-url
  newTag: commit-id

工作起来很有魅力,因为我们可以通过一个提交引用将其重新用于部署本身及其相关作业。

用例 B:

问题:

我们使用 N 个作业,例如为 0 停机部署进行迁移,其中我们 运行 alembic 容器 运行 迁移,我们有一个 waitforit initContainer 监听作业完成,即迁移何时完成部署成功。

现在的问题是我需要在一个服务的覆盖层中修改 4 个文件来修补所有位置的 ID(我们用它来识别工作):

- image: groundnuty/k8s-wait-for:v1.4
  imagePullPolicy: IfNotPresent
  args: 
   - "job"
   - "job-commit-id"
apiVersion: batch/v1
kind: Job
metadata:
  name: job-commit-id

我认为应该可行的是:

  1. 在kustomization.yaml和
  2. 中以某种方式定义变量commit-id
  3. 对于用例 A 和 B,执行如下操作:
apiVersion: batch/v1
kind: Job
metadata:
  name: job-${commit-id}

- image: groundnuty/k8s-wait-for:v1.4
  imagePullPolicy: IfNotPresent
  args: 
   - "job"
   - "job-${commit-id}"
images:
- name: our-aws-repo-url
  newName: our-aws-repo-url
  newTag: ${commit-id}

目标:当开发人员为发布做 PR 时,他们应该只接触一个对提交 ID 的引用以防止拼写错误等(也更容易审查而不是在 N 个地方检查提交 ID)

警告:我确信还有另一种方法可以代替 Jobs 进行迁移,但这通常很常见:如何在 kustomize 中重新使用变量。

我知道我可以在 kustomize 中引用 ENV 变量,但我想在清单中重用一个变量。

but I want to reuse a variable within the manifests.

这不是您通常使用 Kustomize 的方式。使用 Kustomize 时,事情是 声明式 显式 是一件好事。

when developers do PRs for releases, they should only touch one reference to the commit ID to prevent typos etc. (also easier to review instead of checking commit ID in N places)

是也不是。

四个地方有变化,我觉得应该不是问题。有人力更新四个地方是问题

解决人工劳动的方法通常是自动化。通过使用 yq in an automated pipeline (e.g. Jenkins - or a shellscript) can you automate your manifest-update to take a single parameter - this can optionally be automated directly for each build after you have a git "commit id" available. The pipeline need to run four yq-commands to update the four Yaml fields. See e.g. assign operation and github action - pipeline example。不需要其他变量。