Skip to content

Latest commit

 

History

History
132 lines (98 loc) · 3.56 KB

goGetterGeneratorPlugin.md

File metadata and controls

132 lines (98 loc) · 3.56 KB

Remote Sources

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.

Make a place to work

DEMO_HOME=$(mktemp -d)
mkdir -p $DEMO_HOME/base

Use a remote kustomize layer

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

Use non-kustomize remote sources

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.