Kustomize is a great tool. I've been using Kustomize for almost 4 years and am happy with it. However, it's known for its strict merging methods, where it needs to have an OpenAPI schema to merge files properly.
There were many use cases where I needed a more flexible way to merge resources (away from Kustomize's strict merging). So, I've developed a new Kustomize generator plugin (Containerized KRM and Exec KRM) that extends Kustomize's merge strategies (schemaless StrategicMerge).
I wanted to:
- Generate multiple resources from a single resource without the need to multi-import (you can patch multiple resources with a single patch but not the other way around)
- An easy way to merge CustomResources without the need to provide the OpenAPI schema for it (that's actually a lot of work)
- An easy way to merge non-k8s resources and put them in a ConfigMap.
- A way to split long files into smaller ones.
...
Say Hi to ๐Merger๐
Merger is a generator provides schemaless merges with different strategies (StrategicMerge) like replace, append, and combine.
Here is an example:
apiVersion: generators.kustomize.aabouzaid.com/v1alpha1 kind: Merger metadata: name: merge annotations: config.kubernetes.io/function: | container: image: ghcr.io/aabouzaid/kustomize-generator-merger mounts: - type: bind src: ./ dst: /mnt spec: resources: - name: example input: # Available options: overlay,patch. # - Overlay: Produce multiple outputs by merging each source with the destination. # - Patch: Produce a single output by merging all sources together then with the destination. method: overlay files: # The same as in the KRM container above, omit it if Exec KRM is used. root: /mnt sources: - src01.yaml - src02.yaml destination: dst.yaml merge: # Available options: replace,append,combine. # - Replace: All keys in source will merge and replace what's in the destination. # - Append: Maps from source merged with destination, but the lists will be appended from source to destination. # - Combine: Maps from source merged with destination, but the lists will be combined together. strategy: combine output: # Available options: raw. # In the next releases also ConfigMap and Secret will be supported. format: raw
For more details, check the common use cases section.
...
Some takeaways I learned while developing this project:
- KubeBuilder markers could be used with the client side to auto-generate the OpenAPI YAML schema from the code.
- Golang compression methods (like UPX and LZMA) can reduce the binary size up to 80% compared to the standard build method.
- Cosign keyless artifacts sign is pretty easy to add to the CI pipeline (no need to manage any extra keys).
- OpenSSF Scorecard offers a great integration assessing the security health metrics of open-source projects.
Enjoy :-)