首页 > 解决方案 > kustomize 编辑集图像不适用于 kustomize multibases 和 common base

问题描述

我正在使用这个例子

├── 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

有什么办法可以简单有效地处理这种情况,以便最终输出包含所有部署的图像标签?

要测试,请使用这个 repo

标签: kuberneteskustomize

解决方案


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

怎么了

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

$ 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首先去覆盖并执行transformation code位于overlays/kustomization.yaml. 这部分完成后,图像名称不是 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

推荐阅读