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

kustomize edit set image doesn't work with kustomize multibases and common base

我正在使用这个 example:

├── base
│   ├── kustomization.yaml
│   └── pod.yaml
├── dev
│   └── kustomization.yaml
├── kustomization.yaml
├── production
│   └── kustomization.yaml
└── staging
    └── kustomization.yaml

并且在 kustomization.yaml 根文件中:

resources:
- ./dev
- ./staging
- ./production

我在 dev, staging, production kustomization.yaml:

中也有图像转换器代码
images:
- name: my-app
  newName: gcr.io/my-platform/my-app

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

(cd dev && kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)

这很管用!

为所有叠加层(开发、暂存、生产)构建部署清单,我使用:

(kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)

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

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

似乎 kusotmize edit set image 只更新当前目录的 kustomizaion.yaml

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

To test please use this repo

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

会发生什么

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

$ tree
.
├── base
│   ├── kustomization.yaml
│   └── pod.yaml
├── dev
│   └── kustomization.yaml
├── kustomization.yaml
└── staging
    └── kustomization.yaml

当您运行此命令用于单个部署时:

(cd dev && kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)

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

之前添加的东西 transformer code 被上面的命令覆盖了。您可以删除transformer code、运行上面的命令,得到相同的结果。在执行 运行 命令后,您会发现您的 dev/kustomization.yaml 看起来像:

resources:
- ./../base
namePrefix: dev-
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
images:
- name: my-app
  newName: gcr.io/my-platform/my-app
  newTag: 0.0.2

然后当你从主目录运行这个命令时会发生什么:

(kustomize edit set image my-app=gcr.io/my-platform/my-app:0.0.2 && kustomize build .)

kustomize首先去overlays做位于overlays/kustomization.yamltransformation code。当这部分完成时,图像名称是 而不是 my-app,而是 gcr.io/my-platform/my-app.

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

做什么

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

$ kustomize edit set image gcr.io/my-platform/my-app=*:0.0.4 && kustomize build .

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: my-app
  name: dev-myapp-pod
spec:
  containers:
  - image: gcr.io/my-platform/my-app:0.0.4
    name: my-app
---
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: my-app
  name: stag-myapp-pod
spec:
  containers:
  - image: gcr.io/my-platform/my-app:0.0.4
    name: my-app