Kustomize supports building a remote target, but the URLs are limited to common Git repository specs.
To extend the supported format, Kustomize has a plugin system that allows one to integrate third-party tools such as hashicorp/go-getter to "download things from a string URL using a variety of protocols", extract the content and generated resources as part of kustomize build.
DEMO_HOME=$(mktemp -d)
mkdir -p $DEMO_HOME/base
Define a kustomization representing your local variant (aka environment).
This could involve any number of kustomizations (see other examples), but in this case just add the name prefix my-
to all resources:
cat <<'EOF' >$DEMO_HOME/kustomization.yaml
namePrefix: my-
resources:
- base/
EOF
It refer a remote base defined as below:
cat <<'EOF' >$DEMO_HOME/base/kustomization.yaml
generators:
- goGetter.yaml
EOF
The base refers to a generator configuration file called goGetter.yaml
.
This file lets one specify the source URL, and other things like sub path in the package, defaulting to base directory, and command to run under the path, defaulting to kustomize build
.
Create the config file goGetter.yaml
, specifying the arbitrarily chosen name example:
cat <<'EOF' >$DEMO_HOME/base/goGetter.yaml
apiVersion: someteam.example.com/v1
kind: GoGetter
metadata:
name: example
url: github.com/kustless/kustomize-examples.git
EOF
Because this particular YAML file is listed in the generators:
stanza of a kustomization file, it is treated as the binding between a generator plugin - identified by the apiVersion and kind fields - and other fields that configure the plugin.
Download the plugin to your DEMO_HOME
and make it executable:
plugin=plugin/someteam.example.com/v1/gogetter/GoGetter
curl -s --create-dirs -o \
"$DEMO_HOME/kustomize/$plugin" \
"https://raw.githubusercontent.com/\
kubernetes-sigs/kustomize/master/$plugin"
chmod a+x $DEMO_HOME/kustomize/$plugin
Define a helper function to run kustomize with the correct environment and flags for plugins:
function kustomizeIt {
XDG_CONFIG_HOME=$DEMO_HOME \
kustomize build --enable_alpha_plugins \
$DEMO_HOME/$1
}
Finally, build the local variant. Notice that all
resource names now have the my-
prefix:
clear
kustomizeIt
Compare local variant to remote base:
diff <(kustomizeIt) <(kustomizeIt base) | more
...
< name: my-remote-cm
---
> name: remote-cm
To see the unmodified but extracted sources, run kustomize on the base. Every invocation here is re-downloading and re-building the package.
kustomizeIt base
Sometimes the remote sources does not include kustomization.yaml
. To use that in the plugin, set command to override the default build.
echo "command: cat resources.yaml" >>$DEMO_HOME/base/goGetter.yaml
Finally, built it
kustomizeIt
and observe the output includes raw resources.yaml
instead of building result of remote kustomization.yaml
.