This shaves of 14 seconds (one third) of the execution time for a
kustomization tree with 4000 documents, from 40.68s to 27.41s
0 0% 5.44% 18.42s 40.56% sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).applySortOrder
0 0% 5.44% 18.40s 40.52% sigs.k8s.io/kustomize/api/internal/builtins.applyOrdering
before
(pprof) top20 -cum
Showing nodes accounting for 5.85s, 12.88% of 45.41s total
Dropped 622 nodes (cum <= 0.23s)
Showing top 20 nodes out of 157
flat flat% sum% cum cum%
0 0% 0% 40.68s 89.58% github.com/spf13/cobra.(*Command).Execute
0 0% 0% 40.68s 89.58% github.com/spf13/cobra.(*Command).ExecuteC
0 0% 0% 40.68s 89.58% github.com/spf13/cobra.(*Command).execute
0 0% 0% 40.68s 89.58% main.main
0 0% 0% 40.68s 89.58% runtime.main
0 0% 0% 40.68s 89.58% sigs.k8s.io/kustomize/kustomize/v5/commands/build.NewCmdBuild.func1
0 0% 0% 40.12s 88.35% sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).Run
0.51s 1.12% 1.12% 33.20s 73.11% sigs.k8s.io/kustomize/api/resource.(*Resource).CurId
0 0% 1.12% 26.95s 59.35% sigs.k8s.io/kustomize/api/resmap.(*resWrangler).GetMatchingResourcesByCurrentId
0.35s 0.77% 1.89% 26.95s 59.35% sigs.k8s.io/kustomize/api/resmap.(*resWrangler).filteredById
0.07s 0.15% 2.05% 25.53s 56.22% sigs.k8s.io/kustomize/api/resmap.GetCurrentId
0 0% 2.05% 21.68s 47.74% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).MakeCustomizedResMap (inline)
0 0% 2.05% 21.68s 47.74% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).makeCustomizedResMap
0.54s 1.19% 3.24% 19.75s 43.49% sigs.k8s.io/kustomize/api/resource.(*Resource).GetGvk (inline)
1s 2.20% 5.44% 19.21s 42.30% sigs.k8s.io/kustomize/kyaml/resid.GvkFromNode
0 0% 5.44% 18.42s 40.56% sigs.k8s.io/kustomize/api/internal/builtins.(*SortOrderTransformerPlugin).Transform
0 0% 5.44% 18.42s 40.56% sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).applySortOrder
0 0% 5.44% 18.40s 40.52% sigs.k8s.io/kustomize/api/internal/builtins.applyOrdering
0.87s 1.92% 7.36% 16.55s 36.45% sigs.k8s.io/kustomize/kyaml/yaml.visitMappingNodeFields
2.51s 5.53% 12.88% 15.68s 34.53% sigs.k8s.io/kustomize/kyaml/yaml.visitFieldsWhileTrue
after
(pprof) top20 -cum
Showing nodes accounting for 1.23s, 3.85% of 31.98s total
Dropped 584 nodes (cum <= 0.16s)
Showing top 20 nodes out of 184
flat flat% sum% cum cum%
0 0% 0% 27.41s 85.71% github.com/spf13/cobra.(*Command).Execute
0 0% 0% 27.41s 85.71% github.com/spf13/cobra.(*Command).ExecuteC
0 0% 0% 27.41s 85.71% github.com/spf13/cobra.(*Command).execute
0 0% 0% 27.41s 85.71% main.main
0 0% 0% 27.41s 85.71% runtime.main
0 0% 0% 27.41s 85.71% sigs.k8s.io/kustomize/kustomize/v5/commands/build.NewCmdBuild.func1
0 0% 0% 26.85s 83.96% sigs.k8s.io/kustomize/api/krusty.(*Kustomizer).Run
0 0% 0% 22.07s 69.01% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).MakeCustomizedResMap (inline)
0 0% 0% 22.07s 69.01% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).makeCustomizedResMap
0.38s 1.19% 1.19% 20.69s 64.70% sigs.k8s.io/kustomize/api/resource.(*Resource).CurId
0 0% 1.19% 13.64s 42.65% sigs.k8s.io/kustomize/api/resmap.(*resWrangler).Append
0 0% 1.19% 13.55s 42.37% sigs.k8s.io/kustomize/api/resmap.(*resWrangler).GetMatchingResourcesByCurrentId (inline)
0.12s 0.38% 1.56% 13.55s 42.37% sigs.k8s.io/kustomize/api/resmap.(*resWrangler).filteredById
0.01s 0.031% 1.59% 12.67s 39.62% sigs.k8s.io/kustomize/api/resmap.GetCurrentId
0.21s 0.66% 2.25% 12.49s 39.06% sigs.k8s.io/kustomize/api/resource.(*Resource).GetGvk (inline)
0.51s 1.59% 3.85% 12.28s 38.40% sigs.k8s.io/kustomize/kyaml/resid.GvkFromNode
0 0% 3.85% 11.52s 36.02% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).IgnoreLocal
0 0% 3.85% 10.53s 32.93% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).AccumulateTarget
0 0% 3.85% 10.53s 32.93% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateResources
0 0% 3.85% 10.53s 32.93% sigs.k8s.io/kustomize/api/internal/target.(*KustTarget).accumulateTarget
kustomize plugins
This directory holds kustomize plugins, each in its own sub-directory.
Directories
-
builtinThese are plugins written as Go plugins.
They are converted to statically linked code in the kustomize binary by a code generator (pluginator) at kustomize build time.
They are maintained as part of kustomize.
-
someteam.example.com/v1Example plugins, maintained and tested by the kustomize maintainers, but not built-in to kustomize.
Some of these might get promoted to
builtinsomeday, as happened with the Helm Chart Inflator. -
untested/v1Untested, unmaintained plugins.
These might be former examples that have been abandoned and may soon be deleted, or they might be WIP plugins that will someday become examples or builtins.
Testing
Regardless of the style used to write a plugin, it should be accompanied by a Go unit test, written using the framework maintained by the kustomize maintainers for just that purpose.
To see how this works, run any plugin test, e.g. this plugin written in bash:
pushd plugin/someteam.example.com/v1/bashedconfigmap
go test -v .
popd
For plugins with many tests, it's possible to target just one test:
pushd plugin/builtin/patchstrategicmergetransformer
go test -v -run TestBadPatchStrategicMergeTransformer PatchStrategicMergeTransformer_test.go
popd
Plugin styles
For more discussion, see extending kustomize.
-
a bare executable
This can be anything, e.g. a shell script, a shell script that runs java in a JVM, or python in a python VM, etc. They accept a YAML stream of resources on stdin, and emit a YAML stream on stdout. They accept configuration data in a file specified as the first argument on their command line.
If the executable is written in Go, it can take advantage of the same libraries as the kustomize builtin plugins.
-
These are containerized executables, that are pickier about their input. Rather than accepting a YAML stream of k8s resources, they want one
ResourceListobject (with the resources in that list). -
These are built as shared object libraries. Like a Go program, they're written in an unimportable
mainpackage with its owngo.modfile. Go plugins cannot be reliably distributed (see docs), and are meant only as a structured way to write a builtin plugin intended for distribution with kustomize.