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
我正在使用 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