kustomize 编辑集图像不适用于 kustomize 多库和公共库

Ari*_*ian 8 kubernetes kustomize

我正在使用这个例子

\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pod.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dev\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 production\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 staging\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

并在kustomization.yaml根目录中的文件中:

\n
resources:\n- ./dev\n- ./staging\n- ./production\n
Run Code Online (Sandbox Code Playgroud)\n

我也有图像转换器代码dev, staging, production

\n
images:\n- name: my-app\n  newName: gcr.io/my-platform/my-app\n\n
Run Code Online (Sandbox Code Playgroud)\n

为了构建单个部署清单,我使用:

\n
(cd dev && kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)\n
Run Code Online (Sandbox Code Playgroud)\n

这很简单!

\n

要为所有覆盖(开发、暂存、生产)构建部署清单,我使用:

\n
(kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)\n
Run Code Online (Sandbox Code Playgroud)\n

它使用kustomization.yaml包含所有资源(开发、暂存、生产)的根目录。

\n

它确实有效,并且最终版本打印在控制台上,但没有图像标签。

\n

看来kusotmize edit set image唯一更新的是kustomizaion.yaml当前目录的

\n

是否可以采取任何措施以简单有效的方式处理这种情况,以便最终输出也包含所有部署的图像标签?

\n

要进行测试,请使用此存储库

\n

moo*_*tte 10

我花了一些时间才意识到这里发生了什么。我将逐步解释会发生什么以及它应该如何工作。

\n

会发生什么

\n

首先我重新创建了相同的结构:

\n
$ tree\n.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pod.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dev\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 staging\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 kustomization.yaml\n
Run Code Online (Sandbox Code Playgroud)\n

当您运行此命令进行单一部署时:

\n
(cd dev && kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)\n
Run Code Online (Sandbox Code Playgroud)\n

您将工作目录更改为dev,手动覆盖图像gcr.io/my-platform/my-app并添加标签0.0.2,然后渲染部署。

\n

之前添加的内容transformer code会被上面的命令覆盖。您可以删除transformer code,运行上面的命令并获得相同的结果。运行命令后,您会发现您的命令dev/kustomization.yaml如下所示:

\n
resources:\n- ./../base\nnamePrefix: dev-\napiVersion: kustomize.config.k8s.io/v1beta1\nkind: Kustomization\nimages:\n- name: my-app\n  newName: gcr.io/my-platform/my-app\n  newTag: 0.0.2\n
Run Code Online (Sandbox Code Playgroud)\n

那么当您从主目录运行此命令时会发生什么:

\n
(kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)\n
Run Code Online (Sandbox Code Playgroud)\n

kustomize首先转到transformation code位于 中的覆盖并执行操作overlays/kustomization.yaml。当这部分完成后,图像名称不是 my-app而是gcr.io/my-platform/my-app

\n

此时kustomize edit命令尝试查找具有名称的图像my-app但无法这样做,因此不应用tag.

\n

该怎么办

\n

kustomize edit如果在主工作目录中运行,则需要使用转换后的图像名称:

\n
$ kustomize edit set image gcr.io/my-platform/my-app=*:0.0.4 && kustomize build .\n\napiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    app: my-app\n  name: dev-myapp-pod\nspec:\n  containers:\n  - image: gcr.io/my-platform/my-app:0.0.4\n    name: my-app\n---\napiVersion: v1\nkind: Pod\nmetadata:\n  labels:\n    app: my-app\n  name: stag-myapp-pod\nspec:\n  containers:\n  - image: gcr.io/my-platform/my-app:0.0.4\n    name: my-app\n
Run Code Online (Sandbox Code Playgroud)\n

  • @moonkotte 非常感谢您花时间并通过解决方案很好地解释了它:) (2认同)