Kustomize:如何使生成器实际合并对象而不是复制对象

Kustomize: How to cause a generator to actually merge an object instead of duplicating

我正在使用 kustomize 来管理我的 argocd 清单。

我的结构如下所示:

argocd
├── base
│   ├── argocd-ui-ingress.yaml
│   └── kustomization.yaml
└── overlays
    └── dev
        ├── argocd-cm-patch.yaml
        ├── argocd-repo-server-ksops-patch.yaml
        ├── ksops-secret-generator.yaml
        ├── kustomization.yaml
        └── secret-argocd-notifications.yaml
    └── prod
        ├── argocd-cm-patch.yaml
        ├── argocd-repo-server-ksops-patch.yaml
        ├── ksops-secret-generator.yaml
        ├── kustomization.yaml
        └── secret-argocd-notifications.yaml

这是我的 overlays/dev/kustomization.yaml 文件:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- https://raw.githubusercontent.com/argoproj/argo-cd/v2.3.2/manifests/install.yaml
- ../../base

patchesStrategicMerge:
  - argocd-cm-patch.yaml
  - argocd-repo-server-ksops-patch.yaml

patches:
- patch: |-
    - op: add
      path: /spec/rules/0/host
      value: argocd.foo.com
    - op: add
      path: /spec/tls/0/hosts/0
      value: argocd.foo.com
  target:
    kind: Ingress
    name: argocd-ui

generators:
  - ksops-secret-generator.yaml

这是我的 ksops-secret-generator.yaml 文件:

# Create a local Kubernetes Secret
apiVersion: viaduct.ai/v1
kind: ksops
metadata:
  name: ksops-secret-generator
files:
  - secret-argocd-notifications.yaml

最后,我的 secret-argocd-notifications.yaml 看起来像这样:

apiVersion: v1
kind: Secret
metadata:
    name: argocd-notifications-secret
    namespace: argocd
data:
    foo: [ENC]...

因为它是一个 sops 加密文件,我正在使用 ksops 插件来生成可用的 Secret 资源。

我目前遇到的问题是,我正在使用的远程资源 (https://raw.githubusercontent.com/argoproj/argo-cd/v2.3.2/manifests/install.yaml) 已经包含一个名为 argocd-notifications-secret 的 Secret。所以当我 运行 kustomize build overlays/dev --enable-alpha-plugins 时,我得到了两个名为 argocd-notifications-secret 的 Secret 资源。一个来自我的本地文件,通过 ksops-secret-generator 生成,一个包含在远程清单中。

我试图通过将 replace(以及 merge,得到相同的结果)行为注释添加到我的本地文件来解决这个问题:

    annotations:
        kustomize.config.k8s.io/behavior: replace

但以这个错误结束:

Error: merging from generator &{0xc000d4c0a0 <nil>}: id resid.ResId{Gvk:resid.Gvk{Group:"", Version:"v1", Kind:"Secret", isClusterScoped:false}, Name:"argocd-notifications-secret", Namespace:"argocd"} does not exist; cannot merge or replace

我也无法在 patchesStrategicMerge 部分下添加我的本地文件,因为那样它只会添加原始 sops 加密文件(根本不使用 generator)。

有没有办法处理这种情况?

显然这都是 red-herring。 结果发现主要问题是 argocd-notifications-secret 覆盖层上的 namespace 指令。删除它后,我 re-added 下面的注释:

    annotations:
        kustomize.config.k8s.io/behavior: merge

它奏效了。

这一快速转变要归功于 CNCF Slack #argo-cd 渠道。 Thread here