【问题标题】:kustomize edit set image doesn't work with kustomize multibases and common basekustomize 编辑集图像不适用于 kustomize multibases 和 common base
【发布时间】:2021-08-25 22:49:21
【问题描述】:

我正在使用这个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, productionkustomization.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

【问题讨论】:

  • 你确定你发出的这个命令和你的问题一样吗?我从上面的示例中重新创建了环境,发出了您的命令,并且构建打印 with 图像标签。另外,你的图片名称在base/pod.yaml“image-name”中吗?
  • 嗨@p10l,感谢您查看和测试它。请检查此repo。我还在自述文件中添加了命令的输出
  • 在 pod.yaml 中图像的名称是 image-name,但在示例 repo 中我已将其更改为 my-app 并更新了命令
  • 您在子shell(() 内)中发出命令是否有原因?
  • @Arian 您所做的是手动更改图像名称,而您的 overlay/kustomization.yaml 不起作用。请参阅下面我的回答以了解会发生什么以及为什么。

标签: kubernetes kustomize


【解决方案1】:

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

会发生什么

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

$ 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/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

【讨论】:

  • @WytrzymałyWiktor :) 这工作edit set image gcr.io/my-platform/my-app=*:0.0.4
  • @moonkotte 非常感谢您抽出宝贵的时间用解决方案很好地解释它:)
  • @Arian 不客气!请考虑accepting the answer,因为这可以解决您的问题。
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 2021-10-23
相关资源
最近更新 更多