在 kustomize 清单中创建变量

tec*_*242 7 kubernetes kustomize gitops argocd

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

我想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
Run Code Online (Sandbox Code Playgroud)

工作起来就像一个魅力,因为我们可以将其重新用于部署本身及其相关作业,所有这些都只需一个提交引用。

用例 B:

问题:

我们使用 N 个作业来进行 0 停机部署的迁移,其中我们运行运行迁移的 alembic 容器,并且我们有一个waitforit initContainer监听作业完成的容器,即当迁移成功时才能进行部署。

现在的问题是,我需要触摸一个服务覆盖层中的 4 个文件来修补各处的 id(我们用它来识别作业):

  • 部署.yaml 像这样:
- image: groundnuty/k8s-wait-for:v1.4
  imagePullPolicy: IfNotPresent
  args: 
   - "job"
   - "job-commit-id"
Run Code Online (Sandbox Code Playgroud)
  • job.yaml 本身更改作业的重新触发以进行新的部署/潜在的迁移:
apiVersion: batch/v1
kind: Job
metadata:
  name: job-commit-id

Run Code Online (Sandbox Code Playgroud)
  • kustomization.yaml,如用例 A 中所述。

我认为应该可行的是:

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

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

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

警告:我确信还有另一种方法可以代替作业进行迁移,但这通常是常见的事情:如何在 kustomize 中重用变量。

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

Jon*_*nas 1

但我想在清单中重用一个变量。

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

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

是和否。

在我看来,四个地方的变化不应该被视为一个问题。问题在于需要人工来更新四个地方。

解决人类辛劳的方法通常是自动化。通过在自动化管道(例如 Jenkins - 或 shellscript)中使用yq,您可以自动执行清单更新以采用单个参数 - 在您拥有可用的 git“提交 id”后,可以选择直接为每个构建自动执行此操作。管道需要运行四个yq命令来更新四个 Yaml 字段。请参阅分配操作github 操作管道示例。不需要其他变量。

  • 更新:我们按照您的建议解决了问题!我们花了一分钟时间,但我们已经使用它一周了,我们已经节省了很多时间,非常感谢!我们还决定将其打包到 GH 工作流程(即将推出 GH Action)中,以便具有类似设置的人也可以从该方法中受益。https://github.com/kranushealth/gitops-release-pr (3认同)