为新类型扩展 kustomize 图像转换器

Extend kustomize image transformer for new types

有没有办法扩展 kustomize 图像转换器以将更多键识别为图像说明符? 就像 nameReference transformernamePrefixnameSuffix变形金刚

The Kustomize images: transformer对于k8s清单中的镜像替换和registry重命名非常有用。

但它 only supports types that embed PodTemplate 和一些硬编码类型。尽管 非常 常见,但不使用 PodTemplate 的 CRD 不会被处理。示例包括 kube-prometheus PrometheusAlertManager 资源以及 opentelemetry-operator OpenTelemetryCollector 资源。

因此,您不得不维护一堆杂乱的战略合并或 json 补丁,以便在这些图像前面加上可信的注册表等。


这里有一个问题的例子。假设我必须使用 images: 转换器列表部署以 mytrusted.registry 为前缀的所有内容。为了简洁起见,我将使用一个虚拟图像,将所有匹配的图像替换为 MATCHED,因此我不必将它们全部列出:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - "https://github.com/prometheus-operator/kube-prometheus"
images:
  - name: "(.*)"
    newName: "MATCHED"
    newTag: "fake"

您希望结果中的唯一图像是“匹配的:假的”,但实际上:

$ kustomize build  | grep 'image: .*' | sort | uniq -c
     12         image: MATCHED:fake
      1   image: quay.io/prometheus/alertmanager:v0.24.0
      1   image: quay.io/prometheus/prometheus:v2.34.0

kind: Prometheuskind: AlertManager 资源中的图像不匹配,因为它们不是 PodTemplate

你必须为这些编写一个自定义补丁,这会造成像这样的混乱kustomization.yaml内容:

patches:
  - path: prometheus_image.yaml
    target:
      kind: Prometheus
  - path: alertmanager_image.yaml
    target:
      kind: Alertmanager

prometheus_image.yaml:

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
      name: ignored
spec:
      image: "MATCHED:fake"

alertmanager_image.yaml:

apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
      name: ignored
spec:
      image: "MATCHED:fake"

IMO 太可怕了。

希望能够做的是告诉Kustomize的图像转换器它,就像它可以用自定义配置映射生成器等扩展一样,就像以下 不受支持的虚构伪代码 以现有 nameReference transformer

为模型
imageReference:
  - kind: Prometheus
    fieldSpecs:
      - spec/image

写完这篇文章后,我终于偶然发现了答案:Kustomize 确实支持 image transformer configs

表达上述内容的正确方法是 image_transformer_config.yaml 文件包含:

images:
  - path: spec/image
    kind: Prometheus
  - path: spec/image
    kind: Alertmanager

和一个引用它的 kustomization.yaml 条目,例如

configurations:
  - image_transformer_config.yaml

当作为 Component 导入时,这似乎也能正常工作。

甚至 pointed out by the transformer docs 所以我要怪这个人瞎了。