Skip to content

Latest commit

 

History

History
183 lines (125 loc) · 6.28 KB

function-basics.md

File metadata and controls

183 lines (125 loc) · 6.28 KB

Function Basics

Synopsis

kustomize fn enables encapsulating function for manipulating Resource configuration inside containers, which are run using run.

First fetch the kustomize repository, which contains a collection of example functions

git clone https://github.com/kubernetes-sigs/kustomize
cd kustomize/functions/examples/

Templating -- CockroachDB

This section demonstrates how to leverage templating based solutions from kustomize fn. The templating function is implemented as a bash script using a heredoc.

1: Generate the Resources

cd into the kustomize/functions/examples/template-heredoc-cockroachdb/ directory, and invoke run on the local-resource/ directory.

cd template-heredoc-cockroachdb/

# view the Resources
kustomize cfg tree local-resource/ --name --image --replicas

# run the function
kustomize fn run local-resource/

# view the generated Resources
kustomize cfg tree local-resource/ --name --image --replicas

run generated the directory local-resource/config containing the generated Resources.

2. Modify the Generated Resources

  • modify the generated Resources by adding an annotation, sidecar container, etc.
  • modify the local-resource/example-use.yaml by changing the replicas

re-run run. this will apply the updated replicas to the generated Resources, but keep the fields that you manually added to the generated Resource configuration.

# run the function
kustomize fn run local-resource/

run facilitates a non-destructive smart templating approach that allows templating to be composed with manual modifications directly to the template output, as well as composition with other functions which may appy validation or injection of values.

3. Function Implementation

the function implementation is located under the image/ directory as a Dockerfile and a bash script.

Templating -- Nginx

The steps in this section are identical to the CockroachDB templating example, but the function implementation is very different, and implemented as a go program rather than a bash script.

1: Generate the Resources

cd into the kustomize/functions/examples/template-go-nginx/ directory, and invoke run on the local-resource/ directory.

cd template-go-nginx/

# view the Resources
kustomize cfg tree local-resource/ --name --image --replicas

# run the function
kustomize fn run local-resource/

# view the generated Resources
kustomize cfg tree local-resource/ --name --image --replicas

run generated the directory local-resource/config containing the generated Resources. this time it put the configuration in a single file rather than multiple files. The mapping of Resources to files is controlled by the function itself through annotations on the generated Resources.

2. Modify the Generated Resources

  • modify the generated Resources by adding an annotation, sidecar container, etc.
  • modify the local-resource/example-use.yaml by changing the replicas

re-run run. this will apply the updated replicas to the generated Resources, but keep the fields that you manually added to the generated Resource configuration.

# run the function
kustomize fn run local-resource/

Just like in the preceding section, the function is implemented using a non-destructive approach which merges the generated Resources into previously generated instances.

3. Function Implementation

the function implementation is located under the image/ directory as a Dockerfile and a go program.

Validation -- resource reservations

This section uses run to perform validation rather than generate Resources.

1: Run the Validator

cd into the kustomize/functions/examples/validator-resource-requests directory, and invoke run on the local-resource/ directory.

# run the function
kustomize fn run local-resource/
cpu-requests missing for a container in Deployment nginx (example-use.yaml [1])
Error: exit status 1
Usage:
...

2: Fix the validation issue

The command will fail complaining that the nginx Deployment is missing cpu-requests, and print the name of the file + Resource index. Edit the file and uncomment the resources, then re-run the functions.

kustomize fn run local-resource/

The validation now passes.

Injection -- resource reservations

This section uses run to perform injection of field values based off annotations on the Resource.

1: Run the Injector

cd into the kustomize/functions/examples/inject-tshirt-sizes directory, and invoke run on the local-resource/ directory.

# print the resources
kustomize cfg tree local-resource --resources --name
local-resource
├── [example-use.yaml]  Validator
└── [example-use.yaml]  Deployment nginx
    └── spec.template.spec.containers
        └── 0
            └── name: nginx

# run the functions
kustomize fn run local-resource/

# print the new resources
kustomize cfg tree local-resource --resources --name
├── [example-use.yaml]  Validator
└── [example-use.yaml]  Deployment nginx
    └── spec.template.spec.containers
        └── 0
            ├── name: nginx
            └── resources: {requests: {cpu: 4, memory: 1GiB}}

2: Change the tshirt-size

Change the tshirt-size annotation from medium to small and re-run the functions.

kustomize fn run local-resource/
kustomize cfg tree local-resource/
local-resource
├── [example-use.yaml]  Validator
└── [example-use.yaml]  Deployment nginx
    └── spec.template.spec.containers
        └── 0
            ├── name: nginx
            └── resources: {requests: {cpu: 200m, memory: 50MiB}}

The function has applied the reservations for the new tshirt-size

Function Composition

Functions may be composed together. Try putting the Injection (tshirt-size) and Validation functions together in the same .yaml file (separated by ---). Run run and observe that the first function in the file is applied to the Resources, and then the second function in the file is applied.